]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
(PSEUDO): Remove .type directive.
authorUlrich Drepper <drepper@redhat.com>
Wed, 8 Jan 2003 00:15:07 +0000 (00:15 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 8 Jan 2003 00:15:07 +0000 (00:15 +0000)
(PSEUDO_RET): Use SYSCALL_ERROR in place of __syscall_error.
(SYSCALL_ERROR): New.
(SYSCALL_ERROR_HANDLER) [NOT_IN_libc]: Provide local copy of error
handling code.
(INTERNAL_SYSCALL): Define.
(INLINE_SYSCALL): Use it.
(INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): Define.

sysdeps/unix/sysv/linux/arm/sysdep.h

index cdb1d8ed3ba9e634bfdf760c86516ce5e50b3bb7..e7caaa14806bbf48f1428e0e05b554e06eef8c49 100644 (file)
 #undef PSEUDO
 #define        PSEUDO(name, syscall_name, args)                                      \
   .text;                                                                     \
-  .type syscall_error,%function;                                             \
   ENTRY (name);                                                                      \
     DO_CALL (syscall_name, args);                                            \
     cmn r0, $4096;
 
 #define PSEUDO_RET                                                           \
     RETINSTR(movcc, pc, lr);                                                 \
-    b PLTJMP(__syscall_error)
+    b PLTJMP(SYSCALL_ERROR)
 #undef ret
 #define ret PSEUDO_RET
 
   SYSCALL_ERROR_HANDLER                                                              \
   END (name)
 
-#define SYSCALL_ERROR_HANDLER  /* Nothing here; code in sysdep.S is used.  */
+#if NOT_IN_libc
+# define SYSCALL_ERROR __local_syscall_error
+# define SYSCALL_ERROR_HANDLER                                 \
+__local_syscall_error:                                         \
+       str     lr, [sp, #-4]!;                                 \
+       str     r0, [sp, #-4]!;                                 \
+       bl      PLTJMP(C_SYMBOL_NAME(__errno_location));        \
+       ldr     r1, [sp], #4;                                   \
+       rsb     r1, r1, #0;                                     \
+       str     r1, [r0];                                       \
+       mvn     r0, #0;                                         \
+       ldr     pc, [sp], #4;
+#else
+# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used.  */
+# define SYSCALL_ERROR __syscall_error
+#endif
 
 /* Linux takes system call args in registers:
        syscall number  in the SWI instruction
 /* Define a macro which expands into the inline wrapper code for a system
    call.  */
 #undef INLINE_SYSCALL
-#define INLINE_SYSCALL(name, nr, args...)                      \
+#define INLINE_SYSCALL(name, nr, args...)                              \
+  ({ unsigned int _sys_result = INTERNAL_SYSCALL (name, nr, args);     \
+     if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result), 0)) \
+       {                                                               \
+        __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result));            \
+        _sys_result = (unsigned int) -1;                               \
+       }                                                               \
+     (int) _sys_result; })
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, nr, args...)                    \
   ({ unsigned int _sys_result;                                 \
      {                                                         \
        register int _a1 asm ("a1");                            \
                     : "a1", "memory");                         \
        _sys_result = _a1;                                      \
      }                                                         \
-     if (_sys_result >= (unsigned int) -4095)                  \
-       {                                                       \
-        __set_errno (-_sys_result);                            \
-        _sys_result = (unsigned int) -1;                       \
-       }                                                       \
      (int) _sys_result; })
 
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val)  ((unsigned int) (val) >= 0xfffff001u)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val)    (-(val))
+
 #define LOAD_ARGS_0()
 #define ASM_ARGS_0
 #define LOAD_ARGS_1(a1)                                \