Caller:
eax: pointer to parameter info block (PIB)
- Call the 32-bit address stored at 0x7fff0000 to invoke the method.
+ Call 0x7fff0000 to invoke the method.
Upon return:
ebx, esi, edi, ebp, esp: preserved
function will search for an exception handling function
that covers the calling address. If none is found,
it will assume that it is a language without exception
- handling, and return the exception to the caller in eax.
+ handling, an5Ad return the exception to the caller in eax.
edx: length of exception segment, if any
ecx: may be clobbered
requested
esp: NULL.
- Jump to the 32-bit address stored at 0x7fff0004 to return.
+ Jump to 0x7fff0080 to return.
Upon return:
eax: pointer to exception, or NULL if none
edx: length of exception segment, if any
- ebx, esi, edi, ebp, esp: may be clobbered
+ ebx, ecx, esi, edi, ebp, esp: may be clobbered
+
+Other system calls:
+ eax, edx, ecx: syscall arguments.
+
+ Call 0x7fff0000 + 0x80 * syscallnum
+
+ eax: return value
+ edx, ecx: may be clobbered
#include <arch/addrs.h>
-#define ROSHARED_PTR(x) (x - x86_syscall_ptr + 0x7fff0000)
+#define ROSHARED_PTR(x) (x - roshared + 0x7fff0000)
.org 0
.code32
iret
.section ".roshared","ax"
- .align 4096
-
- // The vsyscall table must be the first thing in roshared
- // (at vaddr 0x7fff0000).
-
- .global x86_syscall_ptr
-x86_syscall_ptr:
- .long ROSHARED_PTR(x86_shared_int98)
-
- .global x86_sysret_ptr
-x86_sysret_ptr:
- .long ROSHARED_PTR(x86_shared_int99)
-
+roshared:
x86_shared_int98:
// FIXME: This must be unpreemptible by traps
pushl %gs
popl %gs
ret
+ . = roshared + 0x80
x86_shared_int99:
int $0x99
ret
.global test_user_ptr
- .align 4
test_user_ptr:
.long ROSHARED_PTR(test_user)
test_user:
movl $ROSHARED_PTR(test_pib), %eax
- call *0x7fff0000
+ movl $0x7fff0000, %ecx
+ call *%ecx
1: jmp 1b
.section ".rwshared","a"