mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
update from main archive 970120
Tue Jan 21 04:05:20 1997 Ulrich Drepper <drepper@cygnus.com> * version.h (VERSION): Bump to 1.101. Implement -d and -r option to `ldd' to check relocations. * elf/dl-error.c: Add another method to intercept errors. (_dl_receive_error): New function. Install user defined handler. (receiver): New variable. Contains pointer to user provided handler. (_dl_signal_error): If user provided handler is installed call this. * elf/dl-load.c (_dl_map_object): When shared object is not found in trace mode initialize a few more fields so that lookup can actually happen but always fails. * elf/ldd.sh.in: Rewrite argument handling. Recognize new arguments to trigger reloation test. Return with appropriate error code if a file wasn't found. Print warning if object is not executable. * elf/ldd.bash.in: Likewise. * elf/link.h (receiver_fct): New type. Used in _dl_receive_error. (_dl_sysdep_error): New prototype. (_dl_receive_error): New prototype. (_dl_signal_error): Remove __attribute__ ((__noreturn__)). * elf/rtld.c (dl_main): Rewrite argument handling. More than one argument allowed. Recognize --data-relocs and --function-relocs arguments. Don't determine `lazy' mode from LD_BIND_NOW environment variable when in trace mode. If in trace mode and either --data-relocs or --function-relocs is given perform relocation. Report errors using print_unresolved function. (print_unresolved): New function. Print information about missing symbol on stderr. * sysdeps/generic/dl-sysdep.c (_dl_sysdep_error): New function. Like _dl_sysdep_message but print to stderr. * sysdeps/mach/hurd/dl-sysdep.c: Likewise. * sysdeps/generic/sockaddrcom.h: Add definition of sa_family_t. Reported by Andreas Schwab. (__SOCKADDR_COMMON): Use sa_family_t for family member. * sysdeps/unix/bsd/bsd4.4/sockaddrcom.h: Likewise. Linux/Sparc support by Miguel de Icaza. * sysdeps/sparc/fpu_control.h: New file. * sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: New file. * sysdeps/unix/sysv/linux/sparc/brk.c: New file. * sysdeps/unix/sysv/linux/sparc/profil-counter.h: New file. * sysdeps/unix/sysv/linux/sparc/sigaction.c: New file. * sysdeps/unix/sysv/linux/sparc/socket.S: New file. * sysdeps/unix/sysv/linux/sparc/syscall.S: New file. * sysdeps/unix/sysv/linux/sparc/sysdep.h: New file. * sysdeps/unix/sysv/linux/sparc/Dist: New file. * sysdeps/unix/sysv/linux/sparc/Makefile: New file. * sysdeps/unix/sysv/linux/net/if_arp.h: Don't use kernel header. Provide own definition based on 4.4BSD and Linux. * sysdeps/unix/sysv/linux/net/ppp_defs.h: Define __u32 before including <linux/ppp_defs.h>. * sysdeps/unix/sysv/linux/sys/msq_buf.h (struct msqid_ds): Don't use __pid_t since the kernel might have a different size. * sysdeps/unix/sysv/linux/sys/shm_buf.h (struct shmid_ds): Likewise. Reported by Andreas Schwab. * time/asctime.c: Update copyright. * time/dysize.c: Likewise. * time/gmtime.c: Likewise. * time/timegm.c: Likewise. * time/offtime.c: Likewise. De-ANSI-declfy. * time/tzset.c (__tzset_internal): When TZ envvar does not name a DST timezone don't default to offset -1. * sysdeps/unix/sysv/linux/net/route.h: Don't use kernel header. Reported by a sun <asun@zoology.washington.edu>. * resolv/Makefile: Correct spelling: subdirs-dirs -> subdir-dirs. * sysdeps/stub/sysv_signal.c: New file. Stub implementation. * Makefile (distribute): Add mcheck.h. * nis/Makefile (distribute): Add nss-nis.h. * libio/Makefile (routines): Change vdprintf to iovdprintf to prevent dist problem. * nss/Makefile (distribute): Add digits_dots.c. * sysdeps/unix/sysv/linux/Dist: Add kernel_sigaction.h. * sysdeps/unix/sysv/linux/alpha/Dist: Add sys/procfs.h. * sysdeps/unix/sysv/linux/sparc/Dist: Add clone.S. * new-malloc/Makefile (distribute): Add mcheck-init.c and mcheck.h. Mon Jan 20 17:54:28 1997 Sven Verdoolaege <skimo@breughel.ufsia.ac.be> * manual/filesys.texi: Fix little problem (reentrant->readdir). Fri Jan 17 19:07:07 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * configure.in [$elf=yes]: Check for support of .previous and .popsection in the assembler. * config.h.in: Add HAVE_ASM_PREVIOUS_DIRECTIVE and HAVE_ASM_POPSECTION_DIRECTIVE. * libc-symbols.h (__make_section_unallocated) [HAVE_ELF]: Define appropriate if either .previous or .popsection is supported. (libc_warning) [HAVE_ELF]: Use it here. Sat Jan 18 22:15:26 1997 Richard Henderson <rth@tamu.edu> * Makeconfig (CFLAGS-.so): Add -fno-common to prevent odd sorts of errors that can occur when linking libc.so. Mon Jan 20 05:20:49 1997 Ulrich Drepper <drepper@cygnus.com> * elf/dl-load.c (open_path): When running setuid don't try a directory if it is not given with the full name. * elf/Makefile (before-compile): New variable. Mention trusted-dirs.h. (trusted-dirs.h): Construct file from $(default-rpath) and $(user-defined-trusted-dirs) variables. * elf/dl-load.c (_dl_map_object): Pass additional argument to open_path which is NULL except for the LD_LIBRARY_PATH pass in which case it is a pointer to the list of directories from the trusted-dirs.h file. (open_path): Accept additional argument with list of trusted dirs. When running setuid and a list of trusted dirs is given only use those which are mentioned in the list. * elf/rtld.c (dl_main): Don't reject whole LD_LIBRARY_PATH when running setuid. Instead accept entries which do not contain a '/'. * Makeconfig: Correct comment about +(default_cflags). Mon Jan 20 05:11:14 1997 Hrvoje Niksic <hniksic@srce.hr> * time/strptime.c (recursive): Use && not || to test for valid argument. Mon Jan 20 05:06:50 1997 Ulrich Drepper <drepper@cygnus.com> * elf/ldd.sh.in: Exit with value 1 if an error occured. * elf/ldd.bash.in: Likewise. * elf/rtld.c (dl_main): Do not always ignore LD_PRELOAD when the binary runs setuid. It is save to use those entries which do not contain a '/'. This is compatible with Solaris-2.
This commit is contained in:
2
sysdeps/unix/sysv/linux/sparc/Dist
Normal file
2
sysdeps/unix/sysv/linux/sparc/Dist
Normal file
@ -0,0 +1,2 @@
|
||||
__sigtrampoline.S
|
||||
clone.S
|
3
sysdeps/unix/sysv/linux/sparc/Makefile
Normal file
3
sysdeps/unix/sysv/linux/sparc/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(subdir),signal)
|
||||
sysdep_routines += __sigtrampoline
|
||||
endif
|
142
sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S
Normal file
142
sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S
Normal file
@ -0,0 +1,142 @@
|
||||
/* Userland trampoline code for sigaction on Linux/SPARC */
|
||||
/* (C) 1996, 1997 Free Software Foundation, Inc. */
|
||||
/* This file is part of the GNU C Library. */
|
||||
/* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu) */
|
||||
/* Many thanks go to David Miller for explaining all this to me */
|
||||
/* miguel@nuclecu.unam.mx */
|
||||
/* Sources: David Miller, 4.4BSD/SPARC code */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* For REGWIN_SZ */
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/psr.h>
|
||||
|
||||
/* The C compiler frame size */
|
||||
#define CCFSZ 96
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(____sparc_signal_trampoline)
|
||||
.global SYMBOL_NAME(____sig_table)
|
||||
|
||||
/* Make room for 32 %f registers + %fsr
|
||||
* this is 132 bytes + alignement = 136
|
||||
* 96 is the C frame size
|
||||
*/
|
||||
save %sp,-136-CCFSZ,%sp
|
||||
|
||||
/* save regular registers */
|
||||
mov %g2,%l2
|
||||
mov %g3,%l3
|
||||
mov %g4,%l4
|
||||
mov %g5,%l5
|
||||
mov %g6,%l6
|
||||
mov %g7,%l7
|
||||
|
||||
/* save fpu registers */
|
||||
ld [%fp+64+16+20],%l0 /* load the psr from sigcontext */
|
||||
sethi %hi(PSR_EF),%l1
|
||||
andcc %l0,%l1,%l0 /* is floating point enabled? */
|
||||
be 1f
|
||||
rd %y,%l1 /* save y anyways */
|
||||
|
||||
/* save fpu registers */
|
||||
st %fsr, [%sp + CCFSZ + 0]
|
||||
std %f0, [%sp + CCFSZ + 8]
|
||||
std %f2, [%sp + CCFSZ + 16]
|
||||
std %f4, [%sp + CCFSZ + 24]
|
||||
std %f6, [%sp + CCFSZ + 32]
|
||||
std %f8, [%sp + CCFSZ + 40]
|
||||
std %f10, [%sp + CCFSZ + 48]
|
||||
std %f12, [%sp + CCFSZ + 56]
|
||||
std %f14, [%sp + CCFSZ + 64]
|
||||
std %f16, [%sp + CCFSZ + 72]
|
||||
std %f18, [%sp + CCFSZ + 80]
|
||||
std %f20, [%sp + CCFSZ + 88]
|
||||
std %f22, [%sp + CCFSZ + 96]
|
||||
std %f24, [%sp + CCFSZ + 104]
|
||||
std %f26, [%sp + CCFSZ + 112]
|
||||
std %f28, [%sp + CCFSZ + 120]
|
||||
std %f30, [%sp + CCFSZ + 128]
|
||||
|
||||
1:
|
||||
/* Load signal number */
|
||||
ld [%fp + REGWIN_SZ],%o0
|
||||
mov %fp,%o1
|
||||
mov 0xfea,%o2
|
||||
|
||||
/* Sanity check */
|
||||
cmp %o0,33
|
||||
bl 1f
|
||||
or %g0,%g0,%g1 /*Call sys_setup */
|
||||
t 0x10
|
||||
1:
|
||||
#ifdef __PIC__
|
||||
/* Save return address */
|
||||
mov %o7,%o4
|
||||
___sxx:
|
||||
call ___syy
|
||||
nop
|
||||
___syy:
|
||||
sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
|
||||
or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
|
||||
add %o7,%o5,%o5
|
||||
/* restore return address */
|
||||
mov %o4,%o7
|
||||
mov %o5,%o4
|
||||
/* o4 has the GOT pointer */
|
||||
#endif
|
||||
sethi %hi(SYMBOL_NAME(____sig_table)),%o5
|
||||
or %o5,%lo(SYMBOL_NAME(____sig_table)),%o5
|
||||
#ifdef __PIC__
|
||||
add %o5,%o4,%o4
|
||||
ld [%o4],%o5
|
||||
#endif
|
||||
sll %o0,2,%o4
|
||||
add %o5,%o4,%o4
|
||||
ld [%o4],%o4
|
||||
ld [%fp + REGWIN_SZ + 4],%o1 /* Load subcode */
|
||||
ld [%fp + REGWIN_SZ + 8],%o2 /* pointer to sigcontext */
|
||||
call %o4
|
||||
ld [%fp + REGWIN_SZ + 12],%o3 /* Address where signal ocurred */
|
||||
|
||||
/* handler returned, restore state */
|
||||
tst %l0
|
||||
be 1f
|
||||
wr %l1,%g0,%y
|
||||
|
||||
/* fpu restoration */
|
||||
ld [%sp + CCFSZ + 0], %fsr
|
||||
ldd [%sp + CCFSZ + 8], %f0
|
||||
ldd [%sp + CCFSZ + 16], %f2
|
||||
ldd [%sp + CCFSZ + 24], %f4
|
||||
ldd [%sp + CCFSZ + 32], %f6
|
||||
ldd [%sp + CCFSZ + 40], %f8
|
||||
ldd [%sp + CCFSZ + 48], %f10
|
||||
ldd [%sp + CCFSZ + 56], %f12
|
||||
ldd [%sp + CCFSZ + 64], %f14
|
||||
ldd [%sp + CCFSZ + 72], %f16
|
||||
ldd [%sp + CCFSZ + 80], %f18
|
||||
ldd [%sp + CCFSZ + 88], %f20
|
||||
ldd [%sp + CCFSZ + 96], %f22
|
||||
ldd [%sp + CCFSZ + 104], %f24
|
||||
ldd [%sp + CCFSZ + 112], %f26
|
||||
ldd [%sp + CCFSZ + 120], %f28
|
||||
ldd [%sp + CCFSZ + 128], %f30
|
||||
|
||||
1:
|
||||
mov %l2,%g2
|
||||
mov %l3,%g3
|
||||
mov %l4,%g4
|
||||
mov %l5,%g5
|
||||
mov %l6,%g6
|
||||
mov %l7,%g7
|
||||
|
||||
/* call sigreturn */
|
||||
restore %g0,SYS_sigreturn,%g1 /* register back and set syscall */
|
||||
add %sp,64+16,%o0
|
||||
t 0x10
|
||||
/* if we return, sysreturn failed */
|
||||
mov SYS_exit,%g1
|
||||
t 0x10
|
56
sysdeps/unix/sysv/linux/sparc/brk.c
Normal file
56
sysdeps/unix/sysv/linux/sparc/brk.c
Normal file
@ -0,0 +1,56 @@
|
||||
/* brk system call for Linux/SPARC.
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx)
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
/* This must be initialized data because commons can't have aliases. */
|
||||
void *__curbrk = 0;
|
||||
|
||||
/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
|
||||
to work around different old braindamage in the old Linux ELF dynamic
|
||||
linker. */
|
||||
weak_alias (__curbrk, ___brk_addr)
|
||||
|
||||
int
|
||||
__brk (void *addr)
|
||||
{
|
||||
void *newbrk, *scratch;
|
||||
|
||||
asm ("mov %1, %%g1\n\t"
|
||||
"mov %2, %%o0\n\t"
|
||||
"t 0x10\n\t"
|
||||
"mov %%o0, %0\n\t"
|
||||
: "=r" (newbrk)
|
||||
: "0" (SYS_brk), "r" (addr)
|
||||
: "g1", "o0");
|
||||
|
||||
__curbrk = newbrk;
|
||||
|
||||
if (newbrk < addr)
|
||||
{
|
||||
__set_errno (ENOMEM);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
weak_alias (__brk, brk)
|
35
sysdeps/unix/sysv/linux/sparc/profil-counter.h
Normal file
35
sysdeps/unix/sysv/linux/sparc/profil-counter.h
Normal file
@ -0,0 +1,35 @@
|
||||
/* Low-level statistical profiling support function. Linux/SPARC version.
|
||||
Copyright (C) 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sigcontext.h>
|
||||
|
||||
void
|
||||
profil_counter (int signo, __siginfo_t si)
|
||||
{
|
||||
extern int __sparc_old_signals;
|
||||
|
||||
if (__sparc_old_signals)
|
||||
{
|
||||
struct sigcontext_struct *s = (void *) &si;
|
||||
|
||||
profil_count ((void *) s->sigc_pc);
|
||||
}
|
||||
else
|
||||
profil_count ((void *) si.si_regs.pc);
|
||||
}
|
127
sysdeps/unix/sysv/linux/sparc/sigaction.c
Normal file
127
sysdeps/unix/sysv/linux/sparc/sigaction.c
Normal file
@ -0,0 +1,127 @@
|
||||
/* POSIX.1 sigaction call for Linux/SPARC.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx), 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <syscall.h>
|
||||
#include <sys/signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* The kernel will deliver signals in the old way if the signal
|
||||
number is a positive number. The kernel will deliver a signal
|
||||
with the new stack layout if the signal number is a negative number.
|
||||
|
||||
Our sigaction code takes care of selecting the type of kernel we are
|
||||
using at runtime. */
|
||||
|
||||
extern void ____sparc_signal_trampoline (int);
|
||||
long ____sig_table [NSIG];
|
||||
|
||||
int
|
||||
__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
||||
{
|
||||
int ret;
|
||||
int need_to_hide_trick = 0;
|
||||
__sighandler_t old_sh;
|
||||
|
||||
if (new)
|
||||
{
|
||||
if (new->sa_handler != SIG_DFL && new->sa_handler != SIG_IGN)
|
||||
{
|
||||
old_sh = ____sig_table[sig];
|
||||
____sig_table[sig] = (long int) new->sa_handler;
|
||||
new->sa_handler = ____sparc_signal_trampoline;
|
||||
need_to_hide_trick = 1;
|
||||
}
|
||||
}
|
||||
__asm__("or %%g0,%0,%%g1\n\t"
|
||||
"or %%g0,%1,%%o0\n\t"
|
||||
"or %%g0,%2,%%o1\n\t"
|
||||
"or %%g0,%3,%%o2\n\t"
|
||||
"t 0x10\n\t"
|
||||
"bcc 1f\n\t"
|
||||
"or %%o0, %%g0, %0\n\t"
|
||||
"sub %%g0, %%o0, %0\n\t"
|
||||
"1:"
|
||||
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
|
||||
"=r" ((long int) old)
|
||||
: "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
|
||||
: "g1", "o0", "o1", "o2");
|
||||
|
||||
if (ret >= 0)
|
||||
{
|
||||
if (old && old->sa_handler == ____sparc_signal_trampoline)
|
||||
{
|
||||
if (need_to_hide_trick)
|
||||
old->sa_handler = old_sh;
|
||||
else
|
||||
old->sa_handler = ____sig_table[sig];
|
||||
}
|
||||
if (need_to_hide_trick)
|
||||
new->sa_handler = ____sig_table[sig];
|
||||
return 0;
|
||||
}
|
||||
__set_errno (-ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
__new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
||||
{
|
||||
int ret;
|
||||
|
||||
sig = -sig;
|
||||
|
||||
__asm__("or %%g0,%0,%%g1\n\t"
|
||||
"or %%g0,%1,%%o0\n\t"
|
||||
"or %%g0,%2,%%o1\n\t"
|
||||
"or %%g0,%3,%%o2\n\t"
|
||||
"t 0x10\n\t"
|
||||
"bcc 1f\n\t"
|
||||
"or %%o0, %%g0, %0\n\t"
|
||||
"sub %%g0,%%o0,%0\n\t"
|
||||
"1:"
|
||||
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
|
||||
"=r" ((long int) old)
|
||||
: "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
|
||||
: "g1", "o0", "o1", "o2");
|
||||
if (ret >= 0)
|
||||
return 0;
|
||||
__set_errno (-ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
__sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
||||
{
|
||||
static (*sigact_routine) (int, struct sigaction *, struct sigaction *);
|
||||
int ret;
|
||||
struct sigaction sa;
|
||||
|
||||
if (sigact_routine)
|
||||
return (*sigact_routine) (sig, new, old);
|
||||
|
||||
ret = __new_sigaction (1, NULL, &sa);
|
||||
if (ret == -1)
|
||||
sigact_routine = __trampoline_sigaction;
|
||||
else
|
||||
sigact_routine = __new_sigaction;
|
||||
|
||||
return __sigaction (sig, new, old);
|
||||
}
|
||||
weak_alias (__sigaction, sigaction);
|
58
sysdeps/unix/sysv/linux/sparc/socket.S
Normal file
58
sysdeps/unix/sysv/linux/sparc/socket.S
Normal file
@ -0,0 +1,58 @@
|
||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/socketcall.h>
|
||||
|
||||
#define P(a, b) P2(a, b)
|
||||
#define P2(a, b) a##b
|
||||
|
||||
.text
|
||||
/* The socket-oriented system calls are handled unusally in Linux.
|
||||
They are all gated through the single `socketcall' system call number.
|
||||
`socketcall' takes two arguments: the first is the subcode, specifying
|
||||
which socket function is being called; and the second is a pointer to
|
||||
the arguments to the specific function.
|
||||
|
||||
The .S files for the other calls just #define socket and #include this. */
|
||||
|
||||
.globl P(__,socket)
|
||||
ENTRY (P(__,socket))
|
||||
mov SYS_ify(socketcall), %g1 /* System call number */
|
||||
|
||||
/* Use ## so `socket' is a separate token that might be #define'd. */
|
||||
mov P(SOCKOP_,socket), %o0 /* Subcode is first arg to syscall. */
|
||||
mov %i0,%o1 /* args pointer is second arg to syscall */
|
||||
|
||||
t 0x10
|
||||
bcc,a 1
|
||||
nop
|
||||
save %sp,96,%sp
|
||||
call __errno_location
|
||||
nop
|
||||
st %i0,[%o0]
|
||||
restore
|
||||
retl
|
||||
mov -1,%o0
|
||||
1:
|
||||
ret
|
||||
|
||||
PSEUDO_END (P(__,socket))
|
||||
|
||||
weak_alias (P(__,socket), socket)
|
30
sysdeps/unix/sysv/linux/sparc/syscall.S
Normal file
30
sysdeps/unix/sysv/linux/sparc/syscall.S
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1991, 1992, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define DONT_LOAD_G1
|
||||
#include <sysdep.h>
|
||||
ENTRY (__libc_syscall)
|
||||
or %o0,%g0,%g1
|
||||
or %o1,%g0,%o0
|
||||
or %o2,%g0,%o1
|
||||
or %o3,%g0,%o2
|
||||
or %o4,%g0,%o3
|
||||
or %o5,%g0,%o4
|
||||
PSEUDO_NOENT(__libc_syscall, syscall, 5)
|
||||
ret
|
||||
SYSCALL__POST(syscall,5)
|
57
sysdeps/unix/sysv/linux/sparc/sysdep.h
Normal file
57
sysdeps/unix/sysv/linux/sparc/sysdep.h
Normal file
@ -0,0 +1,57 @@
|
||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _LINUX_SPARC_SYSDEP_H
|
||||
#define _LINUX_SPARC_SYSDEP_H 1
|
||||
|
||||
#include <sysdeps/unix/sparc/sysdep.h>
|
||||
|
||||
#undef SYS_ify
|
||||
#define SYS_ify(syscall_name) __NR_##syscall_name
|
||||
|
||||
#ifdef ASSEMBLER
|
||||
|
||||
#ifdef DONT_LOAD_G1
|
||||
# define LOADSYSCALL(x)
|
||||
#else
|
||||
# define LOADSYSCALL(x) mov SYS_##n, %g1
|
||||
#endif
|
||||
|
||||
/* Linux/SPARC uses a different trap number and uses __errno_location always */
|
||||
#undef PSEUDO
|
||||
|
||||
#define PSEUDO(name, syscall_name, args) \
|
||||
.text; \
|
||||
ENTRY(name); \
|
||||
LOADSYSCALL(syscall_name); \
|
||||
ta 0x10; \
|
||||
bcc,a 1f; \
|
||||
nop; \
|
||||
save %sp,96,%sp; \
|
||||
call __errno_location; \
|
||||
nop; \
|
||||
st %i0,[%o0]; \
|
||||
restore; \
|
||||
retl; \
|
||||
mov -1,%o0; \
|
||||
1:
|
||||
|
||||
#endif /* ASSEMBLER */
|
||||
|
||||
#endif /* linux/sparc/sysdep.h */
|
Reference in New Issue
Block a user