about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/sparc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-02-27 06:01:16 +0000
committerUlrich Drepper <drepper@redhat.com>1997-02-27 06:01:16 +0000
commitceb2d9aaa86cc3d3d4accc294751c98d49bdc5c2 (patch)
tree977724555bd3c1007b415b88ed3994e6290f4451 /sysdeps/unix/sysv/linux/sparc
parent867a8743a42f28c5a50de893c82db66ae215f69c (diff)
downloadglibc-ceb2d9aaa86cc3d3d4accc294751c98d49bdc5c2.tar.gz
glibc-ceb2d9aaa86cc3d3d4accc294751c98d49bdc5c2.tar.xz
glibc-ceb2d9aaa86cc3d3d4accc294751c98d49bdc5c2.zip
update from main archive 970226 cvs/libc-970301 cvs/libc-970228 cvs/libc-970227
1997-02-27 05:12  Ulrich Drepper  <drepper@cygnus.com>

	* manual/Makefile: Add rules to run and distribute xtract-typefun.
	* manual/xtract-typefun.awk: New file.  Script to extract function,
	variable, macro anchor to put into the `dir' file.
	* manual/signal.texi: Document difference between SysV and BSD
	signal(3) function and add documentation for sysv_signal.

	* sysdeps/libm-i387/e_acoshl.c: Clear upper half of word containing
	exponent before comparing.

1997-02-27 01:13  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/netinet/in.h (htonl, htons, ntohl, ntohs): Change
	prototypes to use types with explicit width.  `unsigned long' is
	different on 64 bit systems.
	* sysdeps/unix/sysv/linux/netinet/in.h: Likewise.
	* sysdeps/generic/htonl.c: Likewise.
	* sysdeps/generic/htons.c: Likewise.
	* sysdeps/generic/ntohl.c: Likewise.
	* sysdeps/generic/ntohs.c: Likewise.
	Suggested by a sun <asun@zoology.washington.edu>.

1997-02-26 08:30  Andreas Jaeger  <aj@arthur.pfalz.de>

	* math/math.h: Include <__math.h> if __NO_MATH_INLINES is not
	defined and we want optimization.

1997-02-27 01:13  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/netinet/in.h (htonl, htons, ntohl, ntohs): Change
	prototypes to use types with explicit width.  `unsigned long' is
	different on 64 bit systems.
	Suggested by a sun <asun@zoology.washington.edu>.

1997-02-02 19:53  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* misc/getpass.c: Don't disable canonical input.
	Reverted patch of Mon Jan  6 01:35:29 1997.

1996-12-14 22:07  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libio/libioP.h (_IO_finish_t): Take additional parameter, to
	match the hidden __in_chrg parameter of the destructor.
	(_IO_FINISH): Pass zero for it.
	* libio/genops.c (_IO_default_finish): Add second parameter, which
	is ignored.
	* libio/memstream.c (_IO_mem_finish): Likewise.
	* libio/fileops.c (_IO_mem_finish): Likewise.
	* libio/strops.c (_IO_str_finish): Likewise.  All callers changed.

1997-02-27 00:23  H.J. Lu  <hjl@lucon.org>

	* time/Makefile: Avoid using patterns in dependencies.

1997-02-26 00:56  Miguel de Icaza  <miguel@nuclecu.unam.mx>

	* elf/rtld.c: Make _dl_start static.  Otherwise the linker on the
	SPARC will convert the call _dl_start into a call into the PLT.

	* elf/rtld.c (_dl_start): On the SPARC we need to adjust the value
	of arg to make it point to the actual values.

	* sysdeps/sparc/elf/DEFS.h: New ELF specific version.
	* sysdeps/sparc/Dist: Mention sysdeps/sparc/elf/DEFS.h.

	* sysdeps/sparc/bsd-_setjmp.S, sysdeps/sparc/bsd-setjmp.S: Make
	them PIC aware.

	* sysdeps/sparc/dl-machine.h (elf_machine_load_address):
	Implemented.
	(elf_machine_rela): Make it compile; fix existing relocation
	types; add unhandled relocation types.
	(ELF_ADJUST_ARG): Get pointer to arguments at program startup.
	(RTLD_START): Initial implementation, not yet finished.

	* sysdeps/sparc/elf/start.S: Fix.

	* sysdeps/sparc/fpu_control.h: Remove duplicate declaration of
	__setfpucw.

	* sysdeps/sparc/divrem.m4: Make compilable under Linux.
	* sysdeps/sparc/rem.S, sysdeps/sparc/sdiv.S, sysdeps/sparc/udiv.S,
	sysdeps/sparc/urem.S : Regenerated.

	* sysdeps/sparc/setjmp.S: Make it PIC aware.

	* sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: Define
	__ASSEMBLY__ before using kernel header.

	* sysdeps/unix/sysv/linux/sparc/Makefile: Use -mv8 flag to compile
	rtld.c.

	* sysdeps/unix/sysv/linux/sparc/brk.c: Implement.
	* sysdeps/unix/sysv/linux/sparc/profil-counter.h: Remove code
	to handle old signals.
	* sysdeps/unix/sysv/linux/sparc/sigaction.c: Implements sigaction
	for all Linux/SPARC kernels.
	* sysdeps/unix/sysv/linux/sparc/syscall.S: Add code to store
	errno using __errno_location.
	* sysdeps/unix/sysv/linux/sparc/sysdep.h: Add various handler
	macros for assembler sources.
	* sysdeps/unix/sysv/linux/sparc/errno.c: Define errno.

1997-02-25 16:02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/rtld.c (dl_main): Remove dead code that is never executed.
	Rename local variable l to main_map where it is used to point to
	the load_map for the executable.

1997-02-25 15:03  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/dl-version.c (_dl_check_all_versions): Ignore libraries that
	could not be found.

1997-02-24 23:18  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makerules: Generate implicit object suffix rules automagically.
	(o-iterator): Move before first use.

	* Makeconfig (all-object-suffixes): Add .bo suffix.

1997-02-25 15:11  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-i387/e_acoshf.S (__ieee754_acoshf): Test correct
	word on stack for overflow.

	C++.  Use __exception instead.
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/Makefile8
-rw-r--r--sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S109
-rw-r--r--sysdeps/unix/sysv/linux/sparc/errno.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/profil-counter.h11
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sigaction.c21
-rw-r--r--sysdeps/unix/sysv/linux/sparc/syscall.S19
-rw-r--r--sysdeps/unix/sysv/linux/sparc/syscalls.list3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sysdep.S3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sysdep.h41
9 files changed, 132 insertions, 84 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile
index 629e6b37df..30ef946c19 100644
--- a/sysdeps/unix/sysv/linux/sparc/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/Makefile
@@ -1,3 +1,11 @@
 ifeq ($(subdir),signal)
 sysdep_routines += __sigtrampoline
 endif
+
+# When I get this to work, this is the right thing
+ifeq ($(subdir),elf)
+CFLAGS-rtld.c += -mv8
+#rtld-routines += dl-sysdepsparc
+endif   # elf
+
+asm-CPPFLAGS = -fPIC
diff --git a/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S b/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S
index 4fea850ee3..2dd13062fc 100644
--- a/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S
+++ b/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S
@@ -4,10 +4,10 @@
 /* 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 	        */
+/* Sources:     David Miller, 4.4BSD/SPARC code                */
 
 #include <sysdep.h>
-
+#define __ASSEMBLY__
 /* For REGWIN_SZ */
 #include <asm/ptrace.h>
 #include <asm/psr.h>
@@ -18,13 +18,13 @@
 	.text
 
 ENTRY(____sparc_signal_trampoline)
-	.global SYMBOL_NAME(____sig_table)
+	.global C_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
+	 * this is 132 bytes + alignement = 136
+	 * 96 is the C frame size
+	 */
+	save    %sp,-136-CCFSZ,%sp
 
 	/* save regular registers */
 	mov	%g2,%l2
@@ -34,31 +34,31 @@ ENTRY(____sparc_signal_trampoline)
 	mov	%g6,%l6
 	mov	%g7,%l7
 
-	/* save fpu registers */
-	ld	[%fp+64+16+20],%l0      /* load the psr from sigcontext */
+       /* 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?   */
+	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]
+	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 */
@@ -69,7 +69,7 @@ ENTRY(____sparc_signal_trampoline)
 	/* Sanity check */
 	cmp	%o0,33
 	bl	1f
-	or	%g0,%g0,%g1	/*Call sys_setup */
+	or	%g0,%g0,%g1     /*Call sys_setup */
 	t	0x10
 1:
 #ifdef __PIC__
@@ -79,16 +79,16 @@ ___sxx:
 	call	___syy
 	nop
 ___syy:
-	sethi   %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
-	or      %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
+	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
+	sethi	%hi(C_SYMBOL_NAME(____sig_table)),%o5
+	or	%o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5
 #ifdef __PIC__
 	add	%o5,%o4,%o4
 	ld	[%o4],%o5
@@ -97,9 +97,10 @@ ___syy:
 	add	%o5,%o4,%o4
 	ld	[%o4],%o4
 	ld	[%fp + REGWIN_SZ + 4],%o1         /* Load subcode */
-	ld      [%fp + REGWIN_SZ + 8],%o2         /* pointer to sigcontext */
+	ld	[%fp + REGWIN_SZ + 8],%o2         /* pointer to sigcontext */
 	call	%o4
-	ld      [%fp + REGWIN_SZ + 12],%o3        /* Address where signal occurred */
+	ld	[%fp + REGWIN_SZ + 12],%o3        /* Address where signal ocurre
+ */
 
 	/* handler returned, restore state */
 	tst	%l0
@@ -107,23 +108,23 @@ ___syy:
 	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
+	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
@@ -133,10 +134,10 @@ ___syy:
 	mov	%l6,%g6
 	mov	%l7,%g7
 
-	/* call sigreturn */
-	restore	%g0,SYS_sigreturn,%g1 	 /* register back and set syscall */
+       /* call sigreturn */
+	restore	%g0,SYS_ify(sigreturn),%g1	/* register back and set syscal */
 	add	%sp,64+16,%o0
 	t	0x10
 	/* if we return, sysreturn failed */
-	mov	SYS_exit,%g1
+	mov	SYS_ify(exit),%g1
 	t	0x10
diff --git a/sysdeps/unix/sysv/linux/sparc/errno.c b/sysdeps/unix/sysv/linux/sparc/errno.c
new file mode 100644
index 0000000000..663ab33e93
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/errno.c
@@ -0,0 +1 @@
+itn errno;
diff --git a/sysdeps/unix/sysv/linux/sparc/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/profil-counter.h
index 1998c34ed5..258df5ba93 100644
--- a/sysdeps/unix/sysv/linux/sparc/profil-counter.h
+++ b/sysdeps/unix/sysv/linux/sparc/profil-counter.h
@@ -22,14 +22,5 @@
 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);
+  profil_count ((void *) si.si_regs.pc);
 }
diff --git a/sysdeps/unix/sysv/linux/sparc/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sigaction.c
index e7bda77de2..d39eb7cc76 100644
--- a/sysdeps/unix/sysv/linux/sparc/sigaction.c
+++ b/sysdeps/unix/sysv/linux/sparc/sigaction.c
@@ -22,6 +22,10 @@
 #include <sys/signal.h>
 #include <errno.h>
 
+/* Commented out while I figure out what the fuck goes on */
+long ____sig_table [NSIG];
+#if 0
+
 /* 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.
@@ -30,7 +34,6 @@
    using at runtime.  */
 
 extern void ____sparc_signal_trampoline (int);
-long ____sig_table [NSIG];
 
 int
 __trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
@@ -60,7 +63,7 @@ __trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
 	  "1:"
 	  : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
 	    "=r" ((long int) old)
-	  : "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
+	  : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old)
 	  : "g1", "o0", "o1", "o2");
 
   if (ret >= 0)
@@ -79,9 +82,12 @@ __trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
   __set_errno (-ret);
   return -1;
 }
+#else
+#    define __new_sigaction __sigaction
+#endif
 
 int
-__new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
+__new_sigaction (int sig, __const struct sigaction *new, struct sigaction *old)
 {
   int ret;
 
@@ -98,7 +104,7 @@ __new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
 	  "1:"
 	  : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
 	    "=r" ((long int) old)
-	  : "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
+	  : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old)
 	  : "g1", "o0", "o1", "o2");
   if (ret >= 0)
     return 0;
@@ -106,10 +112,11 @@ __new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
   return -1;
 }
 
+#if 0
 int
-__sigaction (int sig, struct sigaction *new, struct sigaction *old)
+__sigaction (int sig, __const struct sigaction *new, struct sigaction *old)
 {
-  static (*sigact_routine) (int, struct sigaction *, struct sigaction *);
+  static (*sigact_routine) (int, __const struct sigaction *, struct sigaction *);
   int ret;
   struct sigaction sa;
 
@@ -124,4 +131,6 @@ __sigaction (int sig, struct sigaction *new, struct sigaction *old)
 
   return __sigaction (sig, new, old);
 }
+#endif
+
 weak_alias (__sigaction, sigaction);
diff --git a/sysdeps/unix/sysv/linux/sparc/syscall.S b/sysdeps/unix/sysv/linux/sparc/syscall.S
index 4166e4231b..3921ca52dc 100644
--- a/sysdeps/unix/sysv/linux/sparc/syscall.S
+++ b/sysdeps/unix/sysv/linux/sparc/syscall.S
@@ -16,15 +16,26 @@
    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)
+	.text
+ENTRY (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)
+	ta	0x10
+	bcc	1f
+	nop
+	save %sp, -96, %sp
+	call __errno_location
+	nop
+	st %i0,[%o0]
+	restore
+	retl
+	mov -1, %o0
+1:
 	ret
-SYSCALL__POST(syscall,5)
+
+PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/sparc/syscalls.list b/sysdeps/unix/sysv/linux/sparc/syscalls.list
new file mode 100644
index 0000000000..7883d70719
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/syscalls.list
@@ -0,0 +1,3 @@
+# File name	Caller	Syscall name	# args	Strong name	Weak names
+
+s_llseek	llseek	_llseek		5	__sys_llseek
diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sysdep.S
new file mode 100644
index 0000000000..7e9023901b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sysdep.S
@@ -0,0 +1,3 @@
+/* Define errno */
+
+	.common errno,4,4
diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sysdep.h
index 0251a1f014..5ae440152b 100644
--- a/sysdeps/unix/sysv/linux/sparc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sysdep.h
@@ -20,6 +20,11 @@
 #ifndef _LINUX_SPARC_SYSDEP_H
 #define _LINUX_SPARC_SYSDEP_H 1
 
+/* Kernel headers use __ASSEMBLY__ */
+#ifdef ASSEMBLER
+#define __ASSEMBLY__
+#endif
+
 #include <sysdeps/unix/sparc/sysdep.h>
 
 #undef SYS_ify
@@ -30,12 +35,34 @@
 #ifdef DONT_LOAD_G1
 # define LOADSYSCALL(x)
 #else
-# define LOADSYSCALL(x) mov SYS_##n, %g1
+# define LOADSYSCALL(x) mov __NR_##x, %g1
 #endif
 
-/* Linux/SPARC uses a different trap number and uses __errno_location always */
+/* Linux/SPARC uses a different trap number */
 #undef PSEUDO
 
+#ifdef PIC
+#define SYSCALL_ERROR_HANDLER \
+	.global C_SYMBOL_NAME(__errno_location);\
+        .type   C_SYMBOL_NAME(__errno_location),@function;\
+	save   %sp,-96,%sp;\
+	call   __errno_location;\
+	nop;\
+	st %i0,[%o0];\
+	restore;\
+	retl;\
+	mov -1,%o0;
+#else
+#define SYSCALL_ERROR_HANDLER \
+	save %sp,-96,%sp;						      \
+	call __errno_location;						      \
+	nop;								      \
+	st %i0,[%o0];							      \
+	restore;							      \
+	retl;								      \
+	mov -1,%o0;
+#endif   /* PIC */
+
 #define PSEUDO(name, syscall_name, args) \
 	.text;								      \
 	ENTRY(name);							      \
@@ -43,14 +70,8 @@
 	ta 0x10;							      \
 	bcc,a 1f;							      \
 	nop;								      \
-	save %sp,96,%sp;						      \
-	call __errno_location;						      \
-	nop;								      \
-	st %i0,[%o0];							      \
-	restore;							      \
-	retl;								      \
-	mov -1,%o0;							      \
-1:
+	SYSCALL_ERROR_HANDLER;						      \
+1:;
 
 #endif	/* ASSEMBLER */