On Mon, Apr 21, 2008 at 12:33:06AM -0700, Khem Raj wrote: >Hi > >There was some duplication when defining INTERNAL_SYSCALL macro for ARM. >I have tried to clean this up with attached patch. Tested on ARM EABI >and ARM OABI. Deleted commented out code too. >OK for trunk ?
Ok, from the looks (didn't test it) with two minor changes: s/asm/__asm__/g s/volatile/__volatile__/g thanks, >Thanks > >-Khem > >Signed-off-by: Khem Raj <[EMAIL PROTECTED]> > >Index: libc/sysdeps/linux/arm/bits/syscalls.h >=================================================================== >--- libc/sysdeps/linux/arm/bits/syscalls.h (revision 21775) >+++ libc/sysdeps/linux/arm/bits/syscalls.h (working copy) >@@ -106,100 +106,55 @@ > #define INTERNAL_SYSCALL_DECL(err) do { } while (0) > > #undef INTERNAL_SYSCALL >-#if defined(__ARM_EABI__) > #if !defined(__thumb__) >-#define INTERNAL_SYSCALL(name, err, nr, args...) \ >- ({unsigned int __sys_result; >\ >- { >\ >- register int _a1 __asm__ ("r0"), _nr __asm__ ("r7"); >\ >- LOAD_ARGS_##nr (args) \ >- _nr = SYS_ify(name); \ >- __asm__ volatile ("swi 0x0 @ syscall " #name \ >- : "=r" (_a1) \ >- : "r" (_nr) ASM_ARGS_##nr \ >- : "memory"); \ >- __sys_result = _a1; \ >- } >\ >- (int) __sys_result; }) >-#else /* !defined(__thumb__) */ >-/* So hide the use of r7 from the compiler, this would be a lot >- * easier but for the fact that the syscalls can exceed 255. >- * For the moment the LOAD_ARG_7 is sacrificed. >- */ >-#define INTERNAL_SYSCALL(name, err, nr, args...) \ >- ({ unsigned int __sys_result; \ >- { \ >- register int _a1 asm ("a1"); \ >- LOAD_ARGS_##nr (args) \ >- register int _v3 asm ("v3") = (int) (SYS_ify(name)); \ >- asm volatile ("push {r7}\n" \ >- "\tmov r7, v3\n" \ >- "\tswi 0 @ syscall " #name "\n" \ >- "\tpop {r7}" \ >- : "=r" (_a1) \ >- : "r" (_v3) ASM_ARGS_##nr \ >- : "memory"); \ >- __sys_result = _a1; \ >- } \ >- (int) __sys_result; }) >-#endif /*!defined(__thumb__)*/ >-#else /* !defined(__ARM_EABI__) */ >-#if !defined(__thumb__) >+#if defined(__ARM_EABI__) > #define INTERNAL_SYSCALL(name, err, nr, args...) \ >- ({ unsigned int __sys_result; \ >+ ({unsigned int __sys_result; \ > { \ >- register int _a1 __asm__ ("a1"); \ >+ register int _a1 __asm__ ("r0"), _nr __asm__ ("r7"); \ > LOAD_ARGS_##nr (args) \ >- __asm__ volatile ("swi %1 @ syscall " #name \ >+ _nr = SYS_ify(name); \ >+ __asm__ volatile ("swi 0x0 @ syscall " #name \ > : "=r" (_a1) \ >- : "i" (SYS_ify(name)) ASM_ARGS_##nr \ >+ : "r" (_nr) ASM_ARGS_##nr \ > : "memory"); \ > __sys_result = _a1; \ > } \ > (int) __sys_result; }) >-#else >-#if 0 >-/* This doesn't work because GCC uses r7 as a frame pointer in >- * some cases and doesn't notice that the _r7 value changes >- * it, resulting in mysterious crashes after the SWI. >- */ >+#else /* defined(__ARM_EABI__) */ >+ > #define INTERNAL_SYSCALL(name, err, nr, args...) \ > ({ unsigned int __sys_result; \ > { \ > register int _a1 __asm__ ("a1"); \ > LOAD_ARGS_##nr (args) \ >- register int _r7 __asm__ ("r7") = (int) (SYS_ify(name)); \ >- __asm__ volatile ("swi 0 @ syscall " #name \ >+ __asm__ volatile ("swi %1 @ syscall " #name \ > : "=r" (_a1) \ >- : "r" (_r7) ASM_ARGS_##nr \ >+ : "i" (SYS_ify(name)) ASM_ARGS_##nr \ > : "memory"); \ > __sys_result = _a1; \ > } \ > (int) __sys_result; }) >-#else >-/* So hide the use of r7 from the compiler, this would be a lot >- * easier but for the fact that the syscalls can exceed 255. >- * For the moment the LOAD_ARG_7 is sacrificed. >- */ >+#endif >+#else /* !defined(__thumb__) */ >+ > #define INTERNAL_SYSCALL(name, err, nr, args...) \ > ({ unsigned int __sys_result; \ >- { \ >- register int _a1 __asm__ ("a1"); \ >- LOAD_ARGS_##nr (args) \ >- register int _v3 __asm__ ("v3") = (int) (SYS_ify(name)); \ >- __asm__ volatile ("push {r7}\n" \ >- "\tmov r7, v3\n" \ >- "\tswi 0 @ syscall " #name "\n" \ >- "\tpop {r7}" \ >- : "=r" (_a1) \ >- : "r" (_v3) ASM_ARGS_##nr \ >- : "memory"); \ >- __sys_result = _a1; \ >- } \ >- (int) __sys_result; }) >-#endif >-#endif >-#endif /* !defined(__ARM_EABI__) */ >+ { \ >+ register int _a1 asm ("a1"); \ >+ LOAD_ARGS_##nr (args) \ >+ register int _v3 asm ("v3") = (int) (SYS_ify(name)); \ >+ asm volatile ("push {r7}\n" \ >+ "\tmov r7, v3\n" \ >+ "\tswi 0 @ syscall " #name "\n" \ >+ "\tpop {r7}" \ >+ : "=r" (_a1) \ >+ : "r" (_v3) ASM_ARGS_##nr \ >+ : "memory"); \ >+ __sys_result = _a1; \ >+ } \ >+ (int) __sys_result; }) >+#endif /*!defined(__thumb__)*/ > > #undef INTERNAL_SYSCALL_ERROR_P > #define INTERNAL_SYSCALL_ERROR_P(val, err) \ > >_______________________________________________ >uClibc mailing list >uClibc@uclibc.org >http://busybox.net/cgi-bin/mailman/listinfo/uclibc _______________________________________________ uClibc mailing list uClibc@uclibc.org http://busybox.net/cgi-bin/mailman/listinfo/uclibc