about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/sparc/sysdep.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sysdep.h41
1 files changed, 31 insertions, 10 deletions
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 */