diff options
author | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-09-16 14:10:30 +0000 |
---|---|---|
committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-09-16 14:10:30 +0000 |
commit | 28134dd75c6cc13dde7ce586614e5c7ba83def40 (patch) | |
tree | 7c2e70dbbcb535b6a24062cdaa85384eb94df841 /libc/sysdeps/linux/sh | |
parent | 5c742ff1a53e556b8f6ad4c3ea89d67380c22adf (diff) |
Add INTERNAL_SYSCALL macros for sh
Diffstat (limited to 'libc/sysdeps/linux/sh')
-rw-r--r-- | libc/sysdeps/linux/sh/bits/syscalls.h | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/sh/bits/syscalls.h b/libc/sysdeps/linux/sh/bits/syscalls.h index 234f80653..e0ab65b82 100644 --- a/libc/sysdeps/linux/sh/bits/syscalls.h +++ b/libc/sysdeps/linux/sh/bits/syscalls.h @@ -140,6 +140,151 @@ __asm__ __volatile__ ("trapa %1" \ __syscall_return(type,__sc0); \ } +#define SYSCALL_INST_STR0 "trapa #0x10\n\t" +#define SYSCALL_INST_STR1 "trapa #0x11\n\t" +#define SYSCALL_INST_STR2 "trapa #0x12\n\t" +#define SYSCALL_INST_STR3 "trapa #0x13\n\t" +#define SYSCALL_INST_STR4 "trapa #0x14\n\t" +#define SYSCALL_INST_STR5 "trapa #0x15\n\t" +#define SYSCALL_INST_STR6 "trapa #0x16\n\t" + +# ifdef NEED_SYSCALL_INST_PAD +# define SYSCALL_INST_PAD "\ + or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0" +# else +# define SYSCALL_INST_PAD +# endif + +#define ASMFMT_0 +#define ASMFMT_1 \ + , "r" (r4) +#define ASMFMT_2 \ + , "r" (r4), "r" (r5) +#define ASMFMT_3 \ + , "r" (r4), "r" (r5), "r" (r6) +#define ASMFMT_4 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7) +#define ASMFMT_5 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0) +#define ASMFMT_6 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1) +#define ASMFMT_7 \ + , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1), "r" (r2) + +#define SUBSTITUTE_ARGS_0() +#define SUBSTITUTE_ARGS_1(arg1) \ + long int _arg1 = (long int) (arg1); \ + register long int r4 __asm__ ("%r4") = (long int) (_arg1) +#define SUBSTITUTE_ARGS_2(arg1, arg2) \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + register long int r4 __asm__ ("%r4") = (long int) (_arg1); \ + register long int r5 __asm__ ("%r5") = (long int) (_arg2) +#define SUBSTITUTE_ARGS_3(arg1, arg2, arg3) \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + register long int r4 __asm__ ("%r4") = (long int) (_arg1); \ + register long int r5 __asm__ ("%r5") = (long int) (_arg2); \ + register long int r6 __asm__ ("%r6") = (long int) (_arg3) +#define SUBSTITUTE_ARGS_4(arg1, arg2, arg3, arg4) \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + register long int r4 __asm__ ("%r4") = (long int) (_arg1); \ + register long int r5 __asm__ ("%r5") = (long int) (_arg2); \ + register long int r6 __asm__ ("%r6") = (long int) (_arg3); \ + register long int r7 __asm__ ("%r7") = (long int) (_arg4) +#define SUBSTITUTE_ARGS_5(arg1, arg2, arg3, arg4, arg5) \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + long int _arg5 = (long int) (arg5); \ + register long int r4 __asm__ ("%r4") = (long int) (_arg1); \ + register long int r5 __asm__ ("%r5") = (long int) (_arg2); \ + register long int r6 __asm__ ("%r6") = (long int) (_arg3); \ + register long int r7 __asm__ ("%r7") = (long int) (_arg4); \ + register long int r0 __asm__ ("%r0") = (long int) (_arg5) +#define SUBSTITUTE_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + long int _arg5 = (long int) (arg5); \ + long int _arg6 = (long int) (arg6); \ + register long int r4 __asm__ ("%r4") = (long int)(_arg1); \ + register long int r5 __asm__ ("%r5") = (long int) (_arg2); \ + register long int r6 __asm__ ("%r6") = (long int) (_arg3); \ + register long int r7 __asm__ ("%r7") = (long int) (_arg4); \ + register long int r0 __asm__ ("%r0") = (long int) (_arg5); \ + register long int r1 __asm__ ("%r1") = (long int) (_arg6) +#define SUBSTITUTE_ARGS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + long int _arg5 = (long int) (arg5); \ + long int _arg6 = (long int) (arg6); \ + long int _arg7 = (long int) (arg7); \ + register long int r4 __asm__ ("%r4") = (long int) (_arg1); \ + register long int r5 __asm__ ("%r5") = (long int) (_arg2); \ + register long int r6 __asm__ ("%r6") = (long int) (_arg3); \ + register long int r7 __asm__ ("%r7") = (long int) (_arg4); \ + register long int r0 __asm__ ("%r0") = (long int) (_arg5); \ + register long int r1 __asm__ ("%r1") = (long int) (_arg6); \ + register long int r2 __asm__ ("%r2") = (long int) (_arg7) + +#undef INLINE_SYSCALL +#define INLINE_SYSCALL(name, nr, args...) \ + ({ \ + unsigned int __resultvar = INTERNAL_SYSCALL (name, , nr, args); \ + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (__resultvar, ), 0)) \ + { \ + __set_errno (INTERNAL_SYSCALL_ERRNO (__resultvar, )); \ + __resultvar = 0xffffffff; \ + } \ + (int) __resultvar; }) + +#undef INTERNAL_SYSCALL +#define INTERNAL_SYSCALL(name, err, nr, args...) \ + ({ \ + unsigned long int resultvar; \ + register long int r3 __asm__ ("%r3") = SYS_ify (name); \ + SUBSTITUTE_ARGS_##nr(args); \ + \ + __asm__ volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \ + : "=z" (resultvar) \ + : "r" (r3) ASMFMT_##nr \ + : "memory"); \ + \ + (int) resultvar; }) + +/* The _NCS variant allows non-constant syscall numbers. */ +#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ + ({ \ + unsigned long int resultvar; \ + register long int r3 __asm__ ("%r3") = (name); \ + SUBSTITUTE_ARGS_##nr(args); \ + \ + __asm__ volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \ + : "=z" (resultvar) \ + : "r" (r3) ASMFMT_##nr \ + : "memory"); \ + \ + (int) resultvar; }) + +#undef INTERNAL_SYSCALL_DECL +#define INTERNAL_SYSCALL_DECL(err) do { } while (0) + +#undef INTERNAL_SYSCALL_ERROR_P +#define INTERNAL_SYSCALL_ERROR_P(val, err) \ + ((unsigned int) (val) >= 0xfffff001u) + +#undef INTERNAL_SYSCALL_ERRNO +#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) + #endif /* __ASSEMBLER__ */ #endif /* _BITS_SYSCALLS_H */ |