[PATCH] MIPS: move __syscall_error into syscall stub
Guido Guenther
agx@sigxcpu.org
Tue Mar 18 00:50:00 GMT 2003
Hi,
the attached patch moves the __syscall_error code on linux mips for the
__PIC__ case right behind the syscall stub itself saving the overhead of
jumping to __syscall_error (with all the .cpload, etc.) and also making
it unnecessary to pull in sysdep.S in linuxthreads (but enlarging glibc
by about +8k). Is this optimation worthwhile?
The rest of the patch is merely a cleanup of __SYSCALL_CLOBBERS and
and the stack layout in sysdep-cancel.h.
Regards,
-- Guido
-------------- next part --------------
2003-02-03 Guido Guenther <agx@sigxcpu.org>
* sysdeps/unix/sysv/linux/mips/sysdep.h: (SYSCALL_ERROR_HANDLER,
PSEUDO, PSEUDO_END) [__PIC__]: define
* sysdeps/unix/sysv/linux/mips/sysdep.h: remove $3, $25 from
__SYSCALL_CLOBBERS
2003-02-03 Guido Guenther <agx@sigxcpu.org>
* linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h:
cleaner stack layout, use SYSCALL_ERROR_HANDLER
* linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile: no need
to pull in sysdep.S anymore, deleted.
Index: sysdeps/unix/sysv/linux/mips/sysdep.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/sysdep.h,v
retrieving revision 1.4
diff -u -u -r1.4 sysdep.h
--- sysdeps/unix/sysv/linux/mips/sysdep.h 27 Jan 2003 20:15:03 -0000 1.4
+++ sysdeps/unix/sysv/linux/mips/sysdep.h 3 Feb 2003 21:02:04 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000,01,02,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
@@ -35,11 +35,51 @@
#ifdef __ASSEMBLER__
-/* We don't want the label for the error handler to be visible in the symbol
- table when we define it here. */
#ifdef __PIC__
-# define SYSCALL_ERROR_LABEL 99b
-#endif
+# define SYSCALL_ERROR_LABEL 0f
+
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ ENTRY(name) \
+ .set noreorder; \
+ .cpload t9; \
+ li v0, SYS_ify(syscall_name); \
+ syscall; \
+ .set reorder; \
+ bne a3, zero, SYSCALL_ERROR_LABEL; \
+ syse1:
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ SYSCALL_ERROR_HANDLER; \
+ END (name)
+
+#if defined _LIBC_REENTRANT
+# define SYSCALL_ERROR_HANDLER \
+0: \
+ subu sp, 32; \
+ .cprestore 16; \
+ sw v0, 20(sp); \
+ sw ra, 24(sp); \
+ jal __errno_location; \
+ /* store error value */ \
+ lw t0, 20(sp); \
+ sw t0, 0(v0); \
+ lw ra, 24(sp); \
+ addiu sp, 32; \
+ /* And just kick back a -1. */ \
+ li v0, -1; \
+ j ra
+#else /* ! _LIBC_REENTRANT. */
+# define SYSCALL_ERROR_HANDLER \
+0: \
+ /* Store it in errno... */ \
+ sw v0, errno; \
+ /* And just kick back a -1. */ \
+ li v0, -1; \
+ j ra
+#endif /* ! _LIBC_REENTRANT */
+#endif /* PIC */
#else /* ! __ASSEMBLER__ */
@@ -68,6 +108,8 @@
#undef INTERNAL_SYSCALL
#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args)
+#define __SYSCALL_CLOBBERS "$1", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"
+
#define internal_syscall0(name, err, dummy...) \
({ \
long _sys_result; \
@@ -275,8 +317,6 @@
_sys_result; \
})
-#define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
-
-#endif /* __ASSEMBLER__ */
+#endif /* ! __ASSEMBLER__ */
#endif /* linux/mips/sysdep.h */
Index: linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
===================================================================
RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h,v
retrieving revision 1.1
diff -u -u -r1.1 sysdep-cancel.h
--- linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h 27 Jan 2003 18:56:29 -0000 1.1
+++ linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h 3 Feb 2003 20:44:03 -0000
@@ -27,9 +27,6 @@
#ifdef __PIC__
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
- .align 2; \
- 99: la t9,__syscall_error; \
- jr t9; \
ENTRY (name) \
.set noreorder; \
.cpload t9; \
@@ -44,25 +41,25 @@
ret; \
Lpseudo_cancel: \
SAVESTK_##args; \
- sw ra, 28(sp); \
- sw gp, 32(sp); \
+ sw gp, 28(sp); \
+ sw ra, 32(sp); \
PUSHARGS_##args; /* save syscall args */ \
CENABLE; \
- lw gp, 32(sp); \
- sw v0, 44(sp); /* save mask */ \
+ lw gp, 28(sp); \
+ sw v0, 36(sp); /* save mask */ \
POPARGS_##args; /* restore syscall args */ \
.set noreorder; \
li v0, SYS_ify (syscall_name); \
syscall; \
.set reorder; \
- sw v0, 36(sp); /* save syscall result */ \
- sw a3, 40(sp); /* save syscall error flag */ \
- lw a0, 44(sp); /* pass mask as arg1 */ \
+ sw v0, 40(sp); /* save syscall result */ \
+ sw a3, 44(sp); /* save syscall error flag */ \
+ lw a0, 36(sp); /* pass mask as arg1 */ \
CDISABLE; \
- lw gp, 32(sp); \
- lw v0, 36(sp); /* restore syscall result */ \
- lw a3, 40(sp); /* restore syscall error flag */ \
- lw ra, 28(sp); /* restore return address */ \
+ lw gp, 28(sp); \
+ lw v0, 40(sp); /* restore syscall result */ \
+ lw a3, 44(sp); /* restore syscall error flag */ \
+ lw ra, 32(sp); /* restore return address */ \
RESTORESTK; \
bne a3, zero, SYSCALL_ERROR_LABEL; \
Lpseudo_end:
Index: linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile
===================================================================
RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile,v
retrieving revision 1.1
diff -u -r1.1 Makefile
--- linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile 27 Jan 2003 18:57:22 -0000 1.1
+++ linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile 18 Mar 2003 00:45:29 -0000
@@ -1,2 +0,0 @@
-# pull in __syscall_error routine
-libpthread-routines += sysdep
More information about the Libc-alpha
mailing list