comment possibly-confusing i386 vsyscall asm
authorRich Felker <dalias@aerifal.cx>
Fri, 12 Oct 2012 03:09:17 +0000 (23:09 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 12 Oct 2012 03:09:17 +0000 (23:09 -0400)
src/internal/i386/syscall.s

index 79296ba..291168c 100644 (file)
@@ -1,5 +1,11 @@
 .hidden __sysinfo
 
+# The calling convention for __vsyscall has the syscall number
+# and 5 args arriving as:  eax, edx, ecx, edi, esi, 4(%esp).
+# This ensures that the inline asm in the C code never has to touch
+# ebx or ebp (which are unavailable in PIC and frame-pointer-using
+# code, respectively), and optimizes for size/simplicity in the caller.
+
 .global __vsyscall
 .type __vsyscall,@function
 __vsyscall:
@@ -22,11 +28,17 @@ __vsyscall:
        jz 1f
        push %eax
        mov 8(%esp),%eax
-       ret
+       ret                     # tail call to kernel vsyscall entry
 1:     mov 4(%esp),%eax
        int $128
        ret
 
+# The __vsyscall6 entry point is used only for 6-argument syscalls.
+# Instead of passing the 5th argument on the stack, a pointer to the
+# 5th and 6th arguments is passed. This is ugly, but there are no
+# register constraints the inline asm could use that would make it
+# possible to pass two arguments on the stack.
+
 .global __vsyscall6
 .type __vsyscall6,@function
 __vsyscall6: