mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 02:03:35 +08:00
Update.
2003-01-06 Philip Blundell <philb@gnu.org> * sysdeps/unix/arm/sysdep.S (syscall_error): Optimise a little. [__LIBC_REENTRANT]: Unify PIC and non-PIC cases. * sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO): Remove .type directive. (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/socket.S (__socket): Use SYSCALL_ERROR in place of __syscall_error. 2003-01-07 Jakub Jelinek <jakub@redhat.com> * sysdeps/ia64/bits/byteswap.h [__GNUC__ >= 2] (__bswap_16, __bswap_32, __bswap_64): Put x into temporary variable to avoid warnings. [!__GNUC__] (__bswap_16, __bswap_32, __bswap_64): Change into static (inline) functions. * sysdeps/s390/bits/byteswap.h [__GNUC__ >= 2] (__bswap_16, __bswap_32, __bswap_64): Put x into temporary variable to avoid warnings. [!__GNUC__] (__bswap_16, __bswap_32, __bswap_64): Change into static (inline) functions. * sysdeps/i386/bits/byteswap.h [!__GNUC__] (__bswap_16, __bswap_32): Likewise. 2003-01-07 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/alpha/adjtime.c (ntp_adjtime): New weak alias.
This commit is contained in:
parent
e9c7764ec9
commit
b5facfdac0
37
ChangeLog
37
ChangeLog
@ -1,3 +1,40 @@
|
||||
2003-01-06 Philip Blundell <philb@gnu.org>
|
||||
|
||||
* sysdeps/unix/arm/sysdep.S (syscall_error): Optimise a little.
|
||||
[__LIBC_REENTRANT]: Unify PIC and non-PIC cases.
|
||||
|
||||
* sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO): Remove .type
|
||||
directive.
|
||||
(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/socket.S (__socket): Use
|
||||
SYSCALL_ERROR in place of __syscall_error.
|
||||
|
||||
2003-01-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/ia64/bits/byteswap.h [__GNUC__ >= 2] (__bswap_16,
|
||||
__bswap_32, __bswap_64): Put x into temporary variable
|
||||
to avoid warnings.
|
||||
[!__GNUC__] (__bswap_16, __bswap_32, __bswap_64): Change into static
|
||||
(inline) functions.
|
||||
* sysdeps/s390/bits/byteswap.h [__GNUC__ >= 2] (__bswap_16,
|
||||
__bswap_32, __bswap_64): Put x into temporary variable
|
||||
to avoid warnings.
|
||||
[!__GNUC__] (__bswap_16, __bswap_32, __bswap_64): Change into static
|
||||
(inline) functions.
|
||||
* sysdeps/i386/bits/byteswap.h [!__GNUC__] (__bswap_16, __bswap_32):
|
||||
Likewise.
|
||||
|
||||
2003-01-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/alpha/adjtime.c (ntp_adjtime): New weak
|
||||
alias.
|
||||
|
||||
2003-01-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* elf/rtld.c (_rtld_global): Remove _dl_dynamic_weak initializer.
|
||||
|
@ -1,5 +1,7 @@
|
||||
2003-01-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* pthreadP.h (__pthread_cond_timedwait): Add prototype.
|
||||
|
||||
* sysdeps/unix/sysv/linux/i386/dl-sysdep.h
|
||||
(RTLD_CORRECT_DYNAMIC_WEAK): Remove.
|
||||
(DL_SYSINFO_IMPLEMENTATION): Change into .text section and back.
|
||||
|
@ -260,6 +260,9 @@ extern int __pthread_cond_init (pthread_cond_t *cond,
|
||||
const pthread_condattr_t *cond_attr);
|
||||
extern int __pthread_cond_signal (pthread_cond_t *cond);
|
||||
extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
|
||||
extern int __pthread_cond_timedwait (pthread_cond_t *cond,
|
||||
pthread_mutex_t *mutex,
|
||||
const struct timespec *abstime);
|
||||
extern int __pthread_condattr_destroy (pthread_condattr_t *attr);
|
||||
extern int __pthread_condattr_init (pthread_condattr_t *attr);
|
||||
extern int __pthread_key_create (pthread_key_t *key, void (*destr) (void *));
|
||||
|
@ -1,4 +1,8 @@
|
||||
2003-01-05 Ulrich Drepper <drepper@redhat.com>
|
||||
2003-01-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* td_ta_event_getmsg.c: Include assert.h.
|
||||
|
||||
-2003-01-05 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* Makefile (libthread_db.so-no-z-defs): Define.
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Retrieve event.
|
||||
Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 1999.
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -28,8 +28,9 @@
|
||||
#define __bswap_constant_16(x) \
|
||||
((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bswap_16(x) \
|
||||
#ifdef __GNUC__
|
||||
# if __GNUC__ >= 2
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned short int __v, __x = (x); \
|
||||
if (__builtin_constant_p (__x)) \
|
||||
@ -40,24 +41,31 @@
|
||||
: "0" (__x) \
|
||||
: "cc"); \
|
||||
__v; }))
|
||||
#else
|
||||
# else
|
||||
/* This is better than nothing. */
|
||||
# define __bswap_16(x) \
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
|
||||
# endif
|
||||
#else
|
||||
static __inline unsigned short int
|
||||
__bswap_16 (unsigned short int __bsx)
|
||||
{
|
||||
return __bswap_constant_16 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Swap bytes in 32 bit value. */
|
||||
#define __bswap_constant_32(x) \
|
||||
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
|
||||
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
#ifdef __GNUC__
|
||||
# if __GNUC__ >= 2
|
||||
/* To swap the bytes in a word the i486 processors and up provide the
|
||||
`bswap' opcode. On i386 we have to use three instructions. */
|
||||
# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
|
||||
# define __bswap_32(x) \
|
||||
# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (__x)) \
|
||||
@ -70,8 +78,8 @@
|
||||
: "0" (__x) \
|
||||
: "cc"); \
|
||||
__v; }))
|
||||
# else
|
||||
# define __bswap_32(x) \
|
||||
# else
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (__x)) \
|
||||
@ -79,11 +87,18 @@
|
||||
else \
|
||||
__asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); \
|
||||
__v; }))
|
||||
# endif
|
||||
#else
|
||||
# define __bswap_32(x) \
|
||||
# endif
|
||||
# else
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __x = (x); __bswap_constant_32 (__x); }))
|
||||
# endif
|
||||
#else
|
||||
static __inline unsigned int
|
||||
__bswap_32 (unsigned int __bsx)
|
||||
{
|
||||
return __bswap_constant_32 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Macros to swap the order of bytes in integer values.
|
||||
Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -31,18 +31,22 @@
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned short int __v; \
|
||||
({ register unsigned short int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_16 (x); \
|
||||
__v = __bswap_constant_16 (__x); \
|
||||
else \
|
||||
__asm__ __volatile__ ("shl %0 = %1, 48 ;;" \
|
||||
"mux1 %0 = %0, @rev ;;" \
|
||||
: "=r" (__v) \
|
||||
: "r" ((unsigned short int) (x))); \
|
||||
: "r" ((unsigned short int) (__x))); \
|
||||
__v; }))
|
||||
#else
|
||||
/* This is better than nothing. */
|
||||
# define __bswap_16(x) __bswap_constant_16 (x)
|
||||
static __inline unsigned short int
|
||||
__bswap_16 (unsigned short int __bsx)
|
||||
{
|
||||
return __bswap_constant_16 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -54,17 +58,21 @@
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned int __v; \
|
||||
({ register unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_32 (x); \
|
||||
__v = __bswap_constant_32 (__x); \
|
||||
else \
|
||||
__asm__ __volatile__ ("shl %0 = %1, 32 ;;" \
|
||||
"mux1 %0 = %0, @rev ;;" \
|
||||
: "=r" (__v) \
|
||||
: "r" ((unsigned int) (x))); \
|
||||
: "r" ((unsigned int) (__x))); \
|
||||
__v; }))
|
||||
#else
|
||||
# define __bswap_32(x) __bswap_constant_32 (x)
|
||||
static __inline unsigned int
|
||||
__bswap_32 (unsigned int __bsx)
|
||||
{
|
||||
return __bswap_constant_32 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -82,17 +90,21 @@
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bswap_64(x) \
|
||||
(__extension__ \
|
||||
({ register unsigned long int __v; \
|
||||
({ register unsigned long int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_64 (x); \
|
||||
__v = __bswap_constant_64 (__x); \
|
||||
else \
|
||||
__asm__ __volatile__ ("mux1 %0 = %1, @rev ;;" \
|
||||
: "=r" (__v) \
|
||||
: "r" ((unsigned long int) (x))); \
|
||||
: "r" ((unsigned long int) (__x))); \
|
||||
__v; }))
|
||||
|
||||
#else
|
||||
# define __bswap_64(x) __bswap_constant_64 (x)
|
||||
static __inline unsigned long int
|
||||
__bswap_64 (unsigned long int __bsx)
|
||||
{
|
||||
return __bswap_constant_64 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BITS_BYTESWAP_H */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Macros to swap the order of bytes in integer values. s390 version.
|
||||
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@ -35,11 +35,11 @@
|
||||
# if __WORDSIZE == 64
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ unsigned short int __v; \
|
||||
({ unsigned short int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_16 (x); \
|
||||
__v = __bswap_constant_16 (__x); \
|
||||
else { \
|
||||
unsigned short int __tmp = (unsigned short int) (x); \
|
||||
unsigned short int __tmp = (unsigned short int) (__x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"lrvh %0,%1" \
|
||||
: "=&d" (__v) : "m" (__tmp) ); \
|
||||
@ -48,11 +48,11 @@
|
||||
# else
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ unsigned short int __v; \
|
||||
({ unsigned short int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_16 (x); \
|
||||
__v = __bswap_constant_16 (__x); \
|
||||
else { \
|
||||
unsigned short int __tmp = (unsigned short int) (x); \
|
||||
unsigned short int __tmp = (unsigned short int) (__x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"sr %0,%0\n" \
|
||||
"la 1,%1\n" \
|
||||
@ -64,7 +64,11 @@
|
||||
# endif
|
||||
#else
|
||||
/* This is better than nothing. */
|
||||
#define __bswap_16(x) __bswap_constant_16 (x)
|
||||
static __inline unsigned short int
|
||||
__bswap_16 (unsigned short int __bsx)
|
||||
{
|
||||
return __bswap_constant_16 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Swap bytes in 32 bit value. */
|
||||
@ -76,11 +80,11 @@
|
||||
# if __WORDSIZE == 64
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ unsigned int __v; \
|
||||
({ unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_32 (x); \
|
||||
__v = __bswap_constant_32 (__x); \
|
||||
else { \
|
||||
unsigned int __tmp = (unsigned int) (x); \
|
||||
unsigned int __tmp = (unsigned int) (__x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"lrv %0,%1" \
|
||||
: "=&d" (__v) : "m" (__tmp)); \
|
||||
@ -89,11 +93,11 @@
|
||||
# else
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ unsigned int __v; \
|
||||
({ unsigned int __v, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_32 (x); \
|
||||
__v = __bswap_constant_32 (__x); \
|
||||
else { \
|
||||
unsigned int __tmp = (unsigned int) (x); \
|
||||
unsigned int __tmp = (unsigned int) (__x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"la 1,%1\n" \
|
||||
"icm %0,8,3(1)\n" \
|
||||
@ -105,7 +109,11 @@
|
||||
__v; }))
|
||||
# endif
|
||||
#else
|
||||
# define __bswap_32(x) __bswap_constant_32 (x)
|
||||
static __inline unsigned int
|
||||
__bswap_32 (unsigned int __bsx)
|
||||
{
|
||||
return __bswap_constant_32 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Swap bytes in 64 bit value. */
|
||||
@ -119,11 +127,11 @@
|
||||
# if __WORDSIZE == 64
|
||||
# define __bswap_64(x) \
|
||||
(__extension__ \
|
||||
({ unsigned long __w; \
|
||||
({ unsigned long __w, __x = (x); \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__w = __bswap_constant_64 (x); \
|
||||
__w = __bswap_constant_64 (__x); \
|
||||
else { \
|
||||
unsigned long __tmp = (unsigned long) (x); \
|
||||
unsigned long __tmp = (unsigned long) (__x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"lrvg %0,%1" \
|
||||
: "=&d" (__w) : "m" (__tmp)); \
|
||||
@ -140,7 +148,11 @@
|
||||
__r.__ll; })
|
||||
# endif
|
||||
#else
|
||||
# define __bswap_64(x) __bswap_constant_64 (x)
|
||||
static __inline unsigned long long int
|
||||
__bswap_64 (unsigned long long int __bsx)
|
||||
{
|
||||
return __bswap_constant_64 (__bsx);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _BITS_BYTESWAP_H */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,98,2002,03 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -37,42 +37,34 @@ syscall_error:
|
||||
moveq r0, $EAGAIN /* Yes; translate it to EAGAIN. */
|
||||
#endif
|
||||
|
||||
#ifndef PIC
|
||||
ldr r1, _errno_loc
|
||||
str r0, [r1]
|
||||
#ifdef _LIBC_REENTRANT
|
||||
stmdb sp!, {r0, lr}
|
||||
/* put another copy of r0 at a specific errno location */
|
||||
bl C_SYMBOL_NAME(__errno_location)
|
||||
ldmia sp!, {r1, lr}
|
||||
str lr, [sp, #-4]!
|
||||
str r0, [sp, #-4]!
|
||||
bl PLTJMP(C_SYMBOL_NAME(__errno_location))
|
||||
ldr r1, [sp], #4
|
||||
str r1, [r0]
|
||||
#endif
|
||||
mvn r0, $0
|
||||
ldr pc, [sp], #4
|
||||
#else
|
||||
stmdb sp!,{r10, lr}
|
||||
@ we have to establish our PIC register
|
||||
ldr r10, 1f
|
||||
add r10, pc, r10
|
||||
0: ldr r1, 2f
|
||||
ldr r1, [r10, r1]
|
||||
@ store a copy in _errno_loc
|
||||
#ifndef PIC
|
||||
ldr r1, 1f
|
||||
str r0, [r1]
|
||||
#ifdef _LIBC_REENTRANT
|
||||
@ and another copy in thread copy of _errno_loc
|
||||
mov r10, r0
|
||||
bl __errno_location(PLT)
|
||||
str r10, [r0]
|
||||
#endif
|
||||
ldmia sp!, {r10, lr}
|
||||
b 4f
|
||||
1: .word _GLOBAL_OFFSET_TABLE_ - 0b - 4
|
||||
2: .word C_SYMBOL_NAME(errno)(GOT)
|
||||
4:
|
||||
#endif
|
||||
mvn r0, $0
|
||||
RETINSTR(mov, pc, r14)
|
||||
|
||||
#ifndef PIC
|
||||
_errno_loc: .long C_SYMBOL_NAME(errno)
|
||||
1: .long C_SYMBOL_NAME(errno)
|
||||
#else
|
||||
@ we have to establish our PIC register
|
||||
ldr r2, 1f
|
||||
ldr r1, 2f
|
||||
0: add r2, pc, r2
|
||||
str r0, [r1, r2]
|
||||
mvn r0, $0
|
||||
RETINSTR(mov, pc, r14)
|
||||
|
||||
1: .word _GLOBAL_OFFSET_TABLE_ - 0b - 8
|
||||
2: .word C_SYMBOL_NAME(errno)(GOTOFF)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef __syscall_error
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -191,5 +191,6 @@ __adjtimex_tv64 (struct timex *tx)
|
||||
|
||||
strong_alias (__adjtimex_tv64, __adjtimex_internal);
|
||||
strong_alias (__adjtimex_tv64, __adjtimex_tv64p);
|
||||
weak_alias (__adjtimex_tv64, ntp_adjtime);
|
||||
versioned_symbol (libc, __adjtimex_tv64, __adjtimex, GLIBC_2_1);
|
||||
versioned_symbol (libc, __adjtimex_tv64p, adjtimex, GLIBC_2_1);
|
||||
|
@ -79,7 +79,7 @@ ENTRY (__socket)
|
||||
/* r0 is < 0 if there was an error. */
|
||||
cmn r0, $124
|
||||
RETINSTR(movcc, pc, r14)
|
||||
b PLTJMP(syscall_error)
|
||||
b PLTJMP(SYSCALL_ERROR)
|
||||
|
||||
PSEUDO_END (__socket)
|
||||
|
||||
|
@ -49,14 +49,13 @@
|
||||
#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
|
||||
|
||||
@ -65,7 +64,22 @@
|
||||
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
|
||||
@ -123,7 +137,17 @@
|
||||
/* 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"); \
|
||||
@ -134,13 +158,14 @@
|
||||
: "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) \
|
||||
|
Loading…
Reference in New Issue
Block a user