30 lines
747 B
ArmAsm
30 lines
747 B
ArmAsm
.global syscall_entry
|
|
|
|
syscall_entry:
|
|
swapgs
|
|
|
|
push %rcx
|
|
push %r11
|
|
|
|
# Save original args before we clobber them
|
|
push %rdi # orig rdi (arg1)
|
|
push %rsi # orig rsi (arg2)
|
|
push %rdx # orig rdx (arg3)
|
|
|
|
# Handle r8/r9 before r8 gets clobbered
|
|
mov %r8, %r9 # r9 = orig r8 (6th param)
|
|
mov %r10, %r8 # r8 = orig r10 (5th param)
|
|
|
|
# Pop in reverse order to place into correct SysV registers
|
|
pop %rcx # rcx = orig rdx (4th param)
|
|
pop %rdx # rdx = orig rsi (3rd param)
|
|
pop %rsi # rsi = orig rdi (2nd param)
|
|
mov %rax, %rdi # rdi = rax (1st param = syscall number)
|
|
|
|
call syscall_handler
|
|
|
|
pop %r11
|
|
pop %rcx
|
|
|
|
swapgs
|
|
sysretq |