mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
1998-09-14 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/mach/hurd/dl-cache.c (_dl_unload_cache): New dummy function. Reported by okuji@kuicr.kyoto-u.ac.jp [PR libc/789]. 1998-09-15 David S. Miller <davem@pierdol.cobaltmicro.com> * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup): Add profiling support. (TRAMPOLINE_TEMPLATE): New macro. (ELF_MACHINE_RUNTIME_TRAMPOLINE): Define in terms of that. (RTLD_START): Prettify, and set __libc_stack_end properly. (elf_machine_rela) [R_SPARC_COPY]: Remove RTLD_BOOTSTRAP ifndef and check for sym being NULL instead. * sysdeps/sparc/sparc64/addmul_1.S: Adjust to allocate 192 bytes of stack space. * sysdeps/sparc/sparc64/lshift.S: Likewise. * sysdeps/sparc/sparc64/mul_1.S: Likewise. * sysdeps/sparc/sparc64/rshift.S: Likewise. * sysdeps/sparc/sparc64/submul_1.S: Likewise. * sysdeps/sparc/sparc64/elf/crtbegin.S: Likewise and remove old MEDANY code model %g4 usage. * sysdeps/sparc/sparc64/elf/crtend.S: Likewise and remove old MEDANY code model %g4 usage. * sysdeps/sparc/sparc64/elf/start.S: Rework to not use old FULLANY code model address formation. * sysdeps/sparc/sparc64/dl-machine.h: Don't include link.h, do include elf/ldsodefs.h (DT_SPARC): Remove. (elf_machine_matches_host): It is now EM_SPARCV9. (elf_machine_dynamic): Clean up to remove ugly cast. (elf_machine_fixup_plt): Rework for new V9 ABI, add support for new PLT formats. (elf_machine_rela): Don't do anything at all for R_SPARC_NONE. Prettify rest of function. [R_SPARC_COPY]: Check for sym being NULL. [R_SPARC_32]: Handle it. [R_SPARC_H44, R_SPARC_M44, R_SPARC_L44]: Handle them for the MEDMID code model. [R_SPARC_HH22, R_SPARC_HM10, R_SPARC_LM22]: Handle them for the MEDANY code model. [R_SPARC_NONE]: Remove this case, as it is now checked earlier. (elf_machine_runtime_setup): Rewrite for new V9 ABI plt formats. Add profiling support. (TRAMPOLINE_TEMPLATE): New macro. (ELF_MACHINE_RUNTIME_TRAMPOLINE): Define in terms of that. (RTLD_START): Prettify and set __libc_stack_end. * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h (SA_SIGINFO): Define. * sysdeps/unix/sysv/linux/sparc/bits/signum.h (_NSIG): Set to 64. (SIGRTMIN, SIGRTMAX, __SIGRTMIN, __SIGRTMAX): Define. * sysdeps/unix/sysv/linux/sparc/sparc32/brk.c (__brk): Remove unused variable scratch. * sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c (__syscall_rt_sigaction, __rt_sigreturn_stub, __sigreturn_stub): Declare. (__sigaction): Rewrite rt_sigaction case to pass correct sigreturn stub to rt_sigaction syscalls. Rewrite non-rt case to use correct old format kernel sigaction structures. * sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h: Move... * sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h: to here. * sysdeps/unix/sysv/linux/sparc/sparc64/Dist: Remove ucontext.h * sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h: Fix ucontext include. (_JMPBUF_UNWINDS): Define. * sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h: Declare statfs64 structure, which is exactly the same as the normal one. * sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Allocate 192 bytes of stack. Use correct syscall trap number. Add branch prediction settings to branch instructions. Remove old MEDANY code model %g4 referneces for non-PIC. * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S: Add __libc_longjmp and __libc_siglongjmp strong aliases. * sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c (__readdir64): Also define to __no__readdir64_decl around readdir.c inclusion. (__readdir64): Add strong alias. * sysdeps/unix/sysv/linux/sparc/sparc64/socket.S: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list (getrlimit): Set strong and weak names properly. 1998-09-16 11:25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * manual/Makefile (AWK): Default to gawk if standalone. 1998-09-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makefile (distribute): Undo last change. * Make-dist (+tsrc) [not subdir]: Also include indirection headers for sysdep headers. (+subdir-headers): Removed, unused. 1998-09-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * stdio-common/Makefile ($(inst_includedir)/bits/stdio_lim.h): Use $(do-install). 1998-09-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makerules ($(+sysdir_pfx)sysd-Makefile): Don't check for absolute name in $(config-sysdirs), can never happen. ($(+sysdir_pfx)sysd-rules): Likewise. * Makeconfig (full-config-sysdirs): Likewise. (all-Subdirs-files): Prepend $(..). * configure.in: Don't check for absolute name in $add_ons_pfx, can not happen. Let --enable-add-ons=yes work if no add-ons actually exist. 1998-09-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Rules ($(common-objpfx)bits/stdio_%.h): Remove extra continuations in command. 1998-09-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * libio/oldstdfiles.c (_IO_stdin_used): Update declaration.
This commit is contained in:
@ -40,6 +40,8 @@ struct sigaction
|
||||
|
||||
/* Bits in `sa_flags'. */
|
||||
#define SA_NOCLDSTOP 0x00000008 /* Don't send SIGCHLD when children stop. */
|
||||
#define SA_SIGINFO 0x00000200 /* Invoke signal-catching function with
|
||||
three arguments instead of one. */
|
||||
#ifdef __USE_MISC
|
||||
# define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */
|
||||
# define SA_RESTART 0x00000002 /* Restart syscall on signal return. */
|
||||
|
@ -32,8 +32,6 @@
|
||||
* Linux/SPARC has different signal numbers that Linux/i386: I'm trying
|
||||
* to make it OSF/1 binary compatible, at least for normal binaries.
|
||||
*/
|
||||
#define _NSIG 32 /* Biggest signal number + 1. */
|
||||
|
||||
#define SIGHUP 1
|
||||
#define SIGINT 2
|
||||
#define SIGQUIT 3
|
||||
@ -70,4 +68,15 @@
|
||||
#define SIGUSR1 30
|
||||
#define SIGUSR2 31
|
||||
|
||||
#define _NSIG 64 /* Biggest signal number + 1
|
||||
(including real-time signals). */
|
||||
|
||||
#define SIGRTMIN (__libc_current_sigrtmin ())
|
||||
#define SIGRTMAX (__libc_current_sigrtmax ())
|
||||
|
||||
/* These are the hard limits of the kernel. These values should not be
|
||||
used directly at user level. */
|
||||
#define __SIGRTMIN 32
|
||||
#define __SIGRTMAX (_NSIG - 1)
|
||||
|
||||
#endif /* <signal.h> included. */
|
||||
|
@ -33,7 +33,7 @@ weak_alias (__curbrk, ___brk_addr)
|
||||
int
|
||||
__brk (void *addr)
|
||||
{
|
||||
void *newbrk, *scratch;
|
||||
void *newbrk;
|
||||
|
||||
{
|
||||
register void *o0 __asm__("%o0") = addr;
|
||||
|
@ -23,6 +23,13 @@
|
||||
#include <errno.h>
|
||||
#include <kernel_sigaction.h>
|
||||
|
||||
extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *,
|
||||
struct kernel_sigaction *, unsigned long,
|
||||
size_t);
|
||||
|
||||
static void __rt_sigreturn_stub (void);
|
||||
static void __sigreturn_stub (void);
|
||||
|
||||
/* The variable is shared between all wrappers around signal handling
|
||||
functions which have RT equivalents. */
|
||||
int __libc_missing_rt_sigs;
|
||||
@ -30,8 +37,49 @@ int __libc_missing_rt_sigs;
|
||||
int
|
||||
__sigaction (int sig, __const struct sigaction *act, struct sigaction *oact)
|
||||
{
|
||||
struct old_kernel_sigaction k_sigact, k_osigact;
|
||||
int ret;
|
||||
struct kernel_sigaction k_sigact, k_osigact;
|
||||
|
||||
/* First try the RT signals. */
|
||||
if (!__libc_missing_rt_sigs)
|
||||
{
|
||||
struct kernel_sigaction kact, koact;
|
||||
unsigned long stub = 0;
|
||||
int saved_errno = errno;
|
||||
|
||||
if (act)
|
||||
{
|
||||
kact.k_sa_handler = act->sa_handler;
|
||||
memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
|
||||
if (((kact.sa_flags = act->sa_flags) & SA_SIGINFO) != 0)
|
||||
stub = (unsigned long) &__rt_sigreturn_stub;
|
||||
else
|
||||
stub = (unsigned long) &__sigreturn_stub;
|
||||
stub -= 8;
|
||||
kact.sa_restorer = NULL;
|
||||
}
|
||||
|
||||
/* XXX The size argument hopefully will have to be changed to the
|
||||
real size of the user-level sigset_t. */
|
||||
ret = __syscall_rt_sigaction (sig, act ? &kact : 0,
|
||||
oact ? &koact : 0,
|
||||
stub, _NSIG / 8);
|
||||
|
||||
if (ret >= 0 || errno != ENOSYS)
|
||||
{
|
||||
if (oact && ret >= 0)
|
||||
{
|
||||
oact->sa_handler = koact.k_sa_handler;
|
||||
memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t));
|
||||
oact->sa_flags = koact.sa_flags;
|
||||
oact->sa_restorer = koact.sa_restorer;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
__set_errno (saved_errno);
|
||||
__libc_missing_rt_sigs = 1;
|
||||
}
|
||||
|
||||
/* Magic to tell the kernel we are using "new-style" signals, in that
|
||||
the signal table is not kept in userspace. Not the same as the
|
||||
@ -41,15 +89,16 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact)
|
||||
if (act)
|
||||
{
|
||||
k_sigact.k_sa_handler = act->sa_handler;
|
||||
memcpy (&k_sigact.sa_mask, &act->sa_mask, sizeof (sigset_t));
|
||||
k_sigact.sa_mask = act->sa_mask.__val[0];
|
||||
k_sigact.sa_flags = act->sa_flags;
|
||||
k_sigact.sa_restorer = NULL;
|
||||
}
|
||||
|
||||
{
|
||||
register int r_syscallnr __asm__("%g1") = __NR_sigaction;
|
||||
register int r_sig __asm__("%o0") = sig;
|
||||
register struct kernel_sigaction *r_act __asm__("%o1");
|
||||
register struct kernel_sigaction *r_oact __asm__("%o2");
|
||||
register struct old_kernel_sigaction *r_act __asm__("%o1");
|
||||
register struct old_kernel_sigaction *r_oact __asm__("%o2");
|
||||
|
||||
r_act = act ? &k_sigact : NULL;
|
||||
r_oact = oact ? &k_osigact : NULL;
|
||||
@ -57,7 +106,7 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact)
|
||||
__asm__ __volatile__("t 0x10\n\t"
|
||||
"bcc 1f\n\t"
|
||||
" nop\n\t"
|
||||
" sub %%g0,%%o0,%%o0\n"
|
||||
"sub %%g0,%%o0,%%o0\n"
|
||||
"1:"
|
||||
: "=r"(r_sig)
|
||||
: "r"(r_syscallnr), "r"(r_act), "r"(r_oact),
|
||||
@ -66,16 +115,13 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact)
|
||||
ret = r_sig;
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
if (oact && ret >= 0)
|
||||
{
|
||||
if (oact)
|
||||
{
|
||||
oact->sa_handler = k_osigact.k_sa_handler;
|
||||
memcpy (&oact->sa_mask, &k_osigact.sa_mask, sizeof (sigset_t));
|
||||
oact->sa_flags = k_osigact.sa_flags;
|
||||
oact->sa_restorer = NULL;
|
||||
}
|
||||
return 0;
|
||||
oact->sa_handler = k_osigact.k_sa_handler;
|
||||
oact->sa_mask.__val[0] = k_osigact.sa_mask;
|
||||
oact->sa_flags = k_osigact.sa_flags;
|
||||
oact->sa_restorer = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
__set_errno (-ret);
|
||||
@ -83,3 +129,21 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact)
|
||||
}
|
||||
|
||||
weak_alias (__sigaction, sigaction);
|
||||
|
||||
static void
|
||||
__rt_sigreturn_stub (void)
|
||||
{
|
||||
__asm__ ("mov %0, %%g1\n\t"
|
||||
"ta 0x10\n\t"
|
||||
: /* no outputs */
|
||||
: "i" (__NR_rt_sigreturn));
|
||||
}
|
||||
|
||||
static void
|
||||
__sigreturn_stub (void)
|
||||
{
|
||||
__asm__ ("mov %0, %%g1\n\t"
|
||||
"ta 0x10\n\t"
|
||||
: /* no outputs */
|
||||
: "i" (__NR_sigreturn));
|
||||
}
|
||||
|
@ -4,5 +4,4 @@ kernel_stat.h
|
||||
getcontext.S
|
||||
setcontext.S
|
||||
sizes.h
|
||||
ucontext.h
|
||||
init-first.h
|
||||
|
@ -21,6 +21,11 @@
|
||||
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
|
||||
#endif
|
||||
|
||||
#include <ucontext.h>
|
||||
#include <sys/ucontext.h>
|
||||
|
||||
typedef ucontext_t __jmp_buf[1];
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
||||
((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp)
|
||||
|
@ -39,4 +39,20 @@ struct statfs
|
||||
long int f_spare[6];
|
||||
};
|
||||
|
||||
/* We already use 64-bit types in the normal structure,
|
||||
so this is the same as the above. */
|
||||
struct statfs64
|
||||
{
|
||||
long int f_type;
|
||||
long int f_bsize;
|
||||
long int f_blocks;
|
||||
long int f_bfree;
|
||||
long int f_bavail;
|
||||
long int f_files;
|
||||
long int f_ffree;
|
||||
__fsid_t f_fsid;
|
||||
long int f_namelen;
|
||||
long int f_spare[6];
|
||||
};
|
||||
|
||||
#endif /* bits/statfs.h */
|
||||
|
@ -38,7 +38,7 @@ __curbrk: .skip 8
|
||||
|
||||
.text
|
||||
ENTRY(__brk)
|
||||
save %sp, -160, %sp
|
||||
save %sp, -192, %sp
|
||||
#ifdef PIC
|
||||
1: call 2f
|
||||
sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
|
||||
@ -49,24 +49,23 @@ ENTRY(__brk)
|
||||
LOADSYSCALL(brk)
|
||||
mov %i0, %o0
|
||||
|
||||
ta 0x11
|
||||
ta 0x6d
|
||||
|
||||
/* All the ways we can fail... */
|
||||
bcs,pn %xcc, .Lerr1
|
||||
nop
|
||||
brz %i0, .Lok
|
||||
brz,pt %i0, .Lok
|
||||
subcc %i0, %o0, %g0
|
||||
bne,pn %xcc, .Lerr0
|
||||
nop
|
||||
|
||||
/* Update __curbrk and return cleanly. */
|
||||
.Lok: sethi %hi(__curbrk), %g1
|
||||
or %g1, %lo(__curbrk), %g1
|
||||
#ifdef PIC
|
||||
ldx [%l7+%g1], %g1
|
||||
stx %o0, [%g1]
|
||||
#else
|
||||
stx %o0, [%g4+%g1]
|
||||
#endif
|
||||
stx %o0, [%g1]
|
||||
mov %g0, %i0
|
||||
|
||||
/* Don't use "ret" cause the preprocessor will eat it. */
|
||||
@ -81,10 +80,8 @@ ENTRY(__brk)
|
||||
or %g1, %lo(errno), %g1
|
||||
#ifdef PIC
|
||||
ldx [%l7+%g1], %g1
|
||||
st %o0, [%g1]
|
||||
#else
|
||||
st %o0, [%g4+%g1]
|
||||
#endif
|
||||
st %o0, [%g1]
|
||||
#else
|
||||
call __errno_location
|
||||
mov %o0,%l1
|
||||
|
@ -30,7 +30,7 @@
|
||||
.type __clone,@function
|
||||
|
||||
__clone:
|
||||
save %sp,-160,%sp
|
||||
save %sp, -192, %sp
|
||||
|
||||
/* sanity check arguments */
|
||||
brz,pn %i0, 99f
|
||||
@ -42,10 +42,10 @@ __clone:
|
||||
mov %i1, %o1
|
||||
mov %i2, %o0
|
||||
set __NR_clone, %g1
|
||||
ta 0x11
|
||||
ta 0x6d
|
||||
bcs,pn %xcc, 99f
|
||||
nop
|
||||
brnz %o0, __thread_start
|
||||
brnz,pn %o0, __thread_start
|
||||
mov %o0, %i0
|
||||
ret
|
||||
restore
|
||||
@ -62,7 +62,6 @@ __clone:
|
||||
st %i0, [%l7+%g2]
|
||||
#else
|
||||
sethi %hi(errno), %g2
|
||||
add %g2, %g4, %g2
|
||||
set EINVAL, %i0
|
||||
st %i0, [%g2+%lo(errno)]
|
||||
#endif
|
||||
|
@ -33,7 +33,7 @@
|
||||
.global " #NAME "
|
||||
.type " #NAME ",@function
|
||||
" #NAME ":
|
||||
save %sp, -128, %sp
|
||||
save %sp, -192, %sp
|
||||
1: call 11f
|
||||
sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
|
||||
11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
|
||||
@ -73,11 +73,10 @@
|
||||
or %g2, %lo(_dl_starting_up), %g2
|
||||
brz,pt %g2, 3f
|
||||
sethi %hi(__libc_multiple_libcs), %g3
|
||||
ld [%g4+%g2], %g1
|
||||
ld [%g2], %g1
|
||||
mov %g0, %g2
|
||||
movrz %g1, 1, %g2
|
||||
3: or %g3, %lo(__libc_multiple_libcs), %g3
|
||||
st %g2, [%g3+%g4]
|
||||
3: st %g2, [%g3 + %lo(__libc_multiple_libcs)]
|
||||
/* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */
|
||||
brnz,pn %g2, " #INIT "
|
||||
nop
|
||||
|
@ -44,5 +44,7 @@ ENTRY(longjmp)
|
||||
END(longjmp)
|
||||
|
||||
strong_alias(longjmp, __longjmp)
|
||||
strong_alias(longjmp, __libc_longjmp)
|
||||
strong_alias(longjmp, __libc_siglongjmp)
|
||||
weak_alias(longjmp, _longjmp)
|
||||
weak_alias(longjmp, siglongjmp)
|
||||
|
@ -22,7 +22,7 @@
|
||||
ENTRY (__libc_pipe)
|
||||
mov %o0, %o2 /* Save PIPEDES. */
|
||||
LOADSYSCALL(pipe)
|
||||
ta 0x11
|
||||
ta 0x6d
|
||||
bcc,pn %xcc, 2f
|
||||
nop
|
||||
SYSCALL_ERROR_HANDLER
|
||||
|
@ -1,4 +1,7 @@
|
||||
#define readdir64 __no_readdir64_decl
|
||||
#define __readdir64 __no___readdir64_decl
|
||||
#include <sysdeps/unix/readdir.c>
|
||||
#undef __readdir64
|
||||
strong_alias (__readdir, __readdir64)
|
||||
#undef readdir64
|
||||
weak_alias (__readdir, readdir64)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef _UCONTEXT_H
|
||||
#define _UCONTEXT_H
|
||||
#ifndef _SYS_UCONTEXT_H
|
||||
#define _SYS_UCONTEXT_H
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
@ -64,4 +64,4 @@ struct ucontext {
|
||||
};
|
||||
typedef struct ucontext ucontext_t;
|
||||
|
||||
#endif /* ucontext.h */
|
||||
#endif /* sys/ucontext.h */
|
@ -28,7 +28,7 @@ ENTRY (syscall)
|
||||
mov %o4,%o3
|
||||
mov %o5,%o4
|
||||
|
||||
ta 0x11
|
||||
ta 0x6d
|
||||
|
||||
bcc,pt %xcc,1f
|
||||
nop
|
||||
|
@ -6,7 +6,7 @@ pread - pread 4 __pread pread __pread64 pread64
|
||||
pwrite - pwrite 4 __pwrite pwrite __pwrite64 pwrite64
|
||||
fstatfs - fstatfs 2 __fstatfs fstatfs fstatfs64
|
||||
statfs - statfs 2 __statfs statfs statfs64
|
||||
getrlimit - getrlimit 2 getrlimit getrlimit64
|
||||
getrlimit - getrlimit 2 __getrlimit getrlimit getrlimit64
|
||||
setrlimit - setrlimit 2 setrlimit setrlimit64
|
||||
ftruncate - ftruncate 2 __ftruncate ftruncate ftruncate64
|
||||
truncate - truncate 2 truncate truncate64
|
||||
|
@ -46,49 +46,48 @@
|
||||
#ifdef PIC
|
||||
# ifdef _LIBC_REENTRANT
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
save %sp,-160,%sp; \
|
||||
call __errno_location; \
|
||||
save %sp, -192, %sp; \
|
||||
call __errno_location; \
|
||||
nop; \
|
||||
st %i0,[%o0]; \
|
||||
sub %g0,1,%i0; \
|
||||
jmpl %i7+8, %g0; \
|
||||
st %i0,[%o0]; \
|
||||
sub %g0,1,%i0; \
|
||||
jmpl %i7+8, %g0; \
|
||||
restore
|
||||
# else
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
.global C_SYMBOL_NAME(errno); \
|
||||
.type C_SYMBOL_NAME(errno),@object; \
|
||||
mov %o7,%g3; \
|
||||
101: call 102f; \
|
||||
sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \
|
||||
102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \
|
||||
sethi %hi(errno),%o1; \
|
||||
add %g2,%o7,%l7; \
|
||||
or %o1,%lo(errno),%o1; \
|
||||
mov %g3,%o7; \
|
||||
ldx [%l7+%o1],%g2; \
|
||||
st %o0,[%g2]; \
|
||||
mov %o7, %g3; \
|
||||
101: call 102f; \
|
||||
sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)), %g2; \
|
||||
102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)), %g2; \
|
||||
sethi %hi(errno), %o1; \
|
||||
add %g2, %o7, %l7; \
|
||||
or %o1, %lo(errno), %o1; \
|
||||
mov %g3,%o7; \
|
||||
ldx [%l7+%o1], %g2; \
|
||||
st %o0, [%g2]; \
|
||||
retl; \
|
||||
sub %g0,1,%i0
|
||||
sub %g0, 1, %i0
|
||||
# endif
|
||||
#else
|
||||
# ifdef _LIBC_REENTRANT
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
save %sp,-160,%sp; \
|
||||
call __errno_location; \
|
||||
save %sp, -192, %sp; \
|
||||
call __errno_location; \
|
||||
nop; \
|
||||
st %i0,[%o0]; \
|
||||
sub %g0,1,%i0; \
|
||||
jmpl %i7+8, %g0; \
|
||||
st %i0, [%o0]; \
|
||||
sub %g0, 1, %i0; \
|
||||
jmpl %i7+8, %g0; \
|
||||
restore
|
||||
# else
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
.global C_SYMBOL_NAME(errno); \
|
||||
.type C_SYMBOL_NAME(errno),@object; \
|
||||
sethi %hi(errno),%g1; \
|
||||
or %g1,%lo(errno),%g1; \
|
||||
st %i0,[%g1+%g4]; \
|
||||
sethi %hi(errno), %g1; \
|
||||
st %i0, [%g1 + %lo(errno)]; \
|
||||
retl; \
|
||||
sub %g0,1,%i0
|
||||
sub %g0, 1, %i0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@ -96,8 +95,8 @@
|
||||
.text; \
|
||||
ENTRY(name); \
|
||||
LOADSYSCALL(syscall_name); \
|
||||
ta 0x11; \
|
||||
bcc,pt %xcc,1f; \
|
||||
ta 0x6d; \
|
||||
bcc,pt %xcc, 1f; \
|
||||
nop; \
|
||||
SYSCALL_ERROR_HANDLER; \
|
||||
1:
|
||||
|
Reference in New Issue
Block a user