summaryrefslogtreecommitdiff
path: root/lib/libc/arch/powerpc/SYS.h
blob: d35a74daf15f9b7df2e6578457aabc0762677df8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*	$NetBSD: SYS.h,v 1.13 2014/08/23 02:24:22 matt Exp $	*/

#include <machine/asm.h>
#include <sys/syscall.h>

#define	BRANCH_TO_CERROR()	b	_C_LABEL(__cerror)

#define	_DOSYSCALL(x)		li	%r0,(SYS_ ## x)		;\
				sc

#define	_SYSCALL_NOERROR(x,y)	.text				;\
				.p2align 2			;\
			ENTRY(x)				;\
				_DOSYSCALL(y)

#define _SYSCALL(x,y)		.text				;\
				.p2align 2			;\
			2:	BRANCH_TO_CERROR()		;\
				_SYSCALL_NOERROR(x,y)		;\
				bso	2b

#define SYSCALL_NOERROR(x)	_SYSCALL_NOERROR(x,x)

#define SYSCALL(x)		_SYSCALL(x,x)

#define PSEUDO_NOERROR(x,y)	_SYSCALL_NOERROR(x,y)		;\
				blr				;\
				END(x)

#define PSEUDO(x,y)		_SYSCALL_NOERROR(x,y)		;\
				bnslr				;\
				BRANCH_TO_CERROR()		;\
				END(x)

#define RSYSCALL_NOERROR(x)	PSEUDO_NOERROR(x,x)

#define RSYSCALL(x)		PSEUDO(x,x)

#define	WSYSCALL(weak,strong)	WEAK_ALIAS(weak,strong)		;\
				PSEUDO(strong,weak)