. add cpufeature detection of both . use it for both ipc and kernelcall traps, using a register for call number . SYSENTER/SYSCALL does not save any context, therefore userland has to save it . to accomodate multiple kernel entry/exit types, the entry type is recorded in the process struct. hitherto all types were interrupt (soft int, exception, hard int); now SYSENTER/SYSCALL is new, with the difference that context is not fully restored from proc struct when running the process again. this can't be done as some information is missing. . complication: cases in which the kernel has to fully change process context (i.e. sigreturn). in that case the exit type is changed from SYSENTER/SYSEXIT to soft-int (i.e. iret) and context is fully restored from the proc struct. this does mean the PC and SP must change, as the sysenter/sysexit userland code will otherwise try to restore its own context. this is true in the sigreturn case. . override all usage by setting libc_ipc=1
17 lines
398 B
ArmAsm
17 lines
398 B
ArmAsm
#include <minix/ipcconst.h>
|
|
#include <machine/asm.h>
|
|
|
|
MSGTAB = 8 /* message table */
|
|
TABCOUNT = 12 /* number of entries in message table */
|
|
|
|
ENTRY(_senda_orig)
|
|
push %ebp
|
|
movl %esp, %ebp
|
|
push %ebx
|
|
movl TABCOUNT(%ebp), %eax /* eax = count */
|
|
movl MSGTAB(%ebp), %ebx /* ebx = table */
|
|
movl $SENDA, %ecx /* _senda(table, count) */
|
|
int $IPCVEC /* trap to the kernel */
|
|
pop %ebx
|
|
pop %ebp
|
|
ret
|