1 /*
2  * Copyright (C) 2018 by Waldemar Brodkorb <wbx@uclibc-ng.org>
3  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
4  * ported from GNU C Library
5  */
6 
7 #ifndef _BITS_SYSCALLS_H
8 #define _BITS_SYSCALLS_H
9 #ifndef _SYSCALL_H
10 # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
11 #endif
12 
13 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...)	\
14   ({ long _sys_result;					\
15      {							\
16 	register long int _a7 __asm__ ("a7");		\
17 	LOAD_ARGS_##nr (args)				\
18 	_a7 = (name);					\
19 							\
20         __asm__ volatile (				\
21 		"scall\n\t"				\
22 		: "=r" (_a0) 				\
23 		: "r"(_a7) ASM_ARGS_##nr  		\
24 		: "memory"); 				\
25 	_sys_result = _a0;				\
26      } 							\
27      _sys_result; 					\
28   })
29 
30 /* Macros for setting up inline __asm__ input regs */
31 # define ASM_ARGS_0
32 # define ASM_ARGS_1	, "r" (_a0)
33 # define ASM_ARGS_2	ASM_ARGS_1, "r" (_a1)
34 # define ASM_ARGS_3	ASM_ARGS_2, "r" (_a2)
35 # define ASM_ARGS_4	ASM_ARGS_3, "r" (_a3)
36 # define ASM_ARGS_5	ASM_ARGS_4, "r" (_a4)
37 # define ASM_ARGS_6	ASM_ARGS_5, "r" (_a5)
38 # define ASM_ARGS_7	ASM_ARGS_6, "r" (_a6)
39 
40 /* Macros for converting sys-call wrapper args into sys call args */
41 # define LOAD_ARGS_0()				\
42   register long _a0 __asm__ ("a0");
43 # define LOAD_ARGS_1(a0)			\
44   long _a0tmp;					\
45   LOAD_ARGS_0 ()				\
46   _a0tmp = (long) (a0);				\
47   _a0 = _a0tmp;
48 # define LOAD_ARGS_2(a0, a1)			\
49   register long _a1 __asm__ ("a1");		\
50   long _a1tmp;					\
51   LOAD_ARGS_1 (a0)				\
52   _a1tmp = (long) (a1);				\
53   _a1 = _a1tmp;
54 # define LOAD_ARGS_3(a0, a1, a2)		\
55   register long _a2 __asm__ ("a2");		\
56   long _a2tmp;					\
57   LOAD_ARGS_2 (a0, a1)				\
58   _a2tmp = (long) (a2);				\
59   _a2 = _a2tmp;
60 # define LOAD_ARGS_4(a0, a1, a2, a3)		\
61   register long _a3 __asm__ ("a3");		\
62   long _a3tmp;					\
63   LOAD_ARGS_3 (a0, a1, a2)			\
64   _a3tmp = (long) (a3);				\
65   _a3 = _a3tmp;
66 # define LOAD_ARGS_5(a0, a1, a2, a3, a4)	\
67   register long _a4 __asm__ ("a4");		\
68   long _a4tmp;					\
69   LOAD_ARGS_4 (a0, a1, a2, a3)			\
70   _a4tmp = (long) (a4);				\
71   _a4 = _a4tmp;
72 # define LOAD_ARGS_6(a0, a1, a2, a3, a4, a5)	\
73   register long _a5 __asm__ ("a5");		\
74   long _a5tmp;					\
75   LOAD_ARGS_5 (a0, a1, a2, a3, a4)		\
76   _a5tmp = (long) (a5);				\
77   _a5 = _a5tmp;
78 # define LOAD_ARGS_7(a0, a1, a2, a3, a4, a5, a6)\
79   register long _a6 __asm__ ("a6");		\
80   long _a6tmp;					\
81   LOAD_ARGS_6 (a0, a1, a2, a3, a4, a5)		\
82   _a6tmp = (long) (a6);				\
83   _a6 = _a6tmp;
84 
85 #endif
86