|
@@ -1,3 +1,21 @@
|
|
|
+/*
|
|
|
+ * June 27, 2001 Manuel Novoa III
|
|
|
+ *
|
|
|
+ * This is a heavily modified version of gcc's output for the syscall5 macro.
|
|
|
+ * The idea (originally from dietlibc) is that all syscall functions simply
|
|
|
+ * set the syscall number in %al (since <= 255) and then jump here. All the
|
|
|
+ * common work is done by __uClibc_syscall, saving a fair amount of generated
|
|
|
+ * code where a number of syscalls are used. The (potential) cost is some
|
|
|
+ * unnecessary pushes, pops, and movs but the execution time penalty should
|
|
|
+ * be relatively small compared to the cost of the syscall itself.
|
|
|
+ *
|
|
|
+ * WARNING: If the startup code for uClibc changes, I suppose it is possible
|
|
|
+ * that this code might try to access memory under the bottom of
|
|
|
+ * the stack.
|
|
|
+ * WARNING: This will need to be modified if the number of syscalls ever
|
|
|
+ * exceeds 255. So will the associated syscall macros.
|
|
|
+ */
|
|
|
+
|
|
|
.text
|
|
|
.align 4
|
|
|
.globl __uClibc_syscall
|
|
@@ -16,15 +34,39 @@ __uClibc_syscall:
|
|
|
int $0x80
|
|
|
#NO_APP
|
|
|
cmpl $-4095,%eax
|
|
|
- jbe .L5
|
|
|
+ jbe .Ldone
|
|
|
+
|
|
|
+#ifdef PIC
|
|
|
+ call Lhere
|
|
|
+Lhere:
|
|
|
+ popl %ebx
|
|
|
+ addl $_GLOBAL_OFFSET_TABLE_+[.-Lhere],%ebx
|
|
|
+ negl %eax
|
|
|
+ movl %eax,%ecx
|
|
|
+#ifdef _LIBC_REENTRANT
|
|
|
+ call __errno_location@PLT
|
|
|
+#else
|
|
|
+ movl errno@GOT(%ebx),%eax
|
|
|
+#endif /* _LIBC_REENTRANT */
|
|
|
+ movl %ecx,(%eax)
|
|
|
+#else
|
|
|
negl %eax
|
|
|
+#ifdef _LIBC_REENTRANT
|
|
|
+ movl %eax,%ecx
|
|
|
+ call __errno_location
|
|
|
+ movl %ecx,(%eax)
|
|
|
+#else
|
|
|
movl %eax,errno
|
|
|
+#endif /* _LIBC_REENTRANT */
|
|
|
+
|
|
|
+#endif /* PIC */
|
|
|
+
|
|
|
movl $-1,%eax
|
|
|
.p2align 4,,7
|
|
|
-.L5:
|
|
|
+.Ldone:
|
|
|
popl %ebx
|
|
|
popl %esi
|
|
|
popl %edi
|
|
|
ret
|
|
|
-.Lfe1:
|
|
|
- .size __uClibc_syscall,.Lfe1-__uClibc_syscall
|
|
|
+.Lsize:
|
|
|
+ .size __uClibc_syscall,.Lsize-__uClibc_syscall
|