63 lines
922 B
ArmAsm
63 lines
922 B
ArmAsm
%include "push_all.inc"
|
|
%include "tasking.inc"
|
|
|
|
; Make sure to keep MAX_SYSCALLS in sync with
|
|
; syscall::MAX in syscall.h
|
|
MAX_SYSCALLS equ 0x40
|
|
|
|
extern __counter_syscall_enter
|
|
extern __counter_syscall_sysret
|
|
|
|
extern syscall_registry
|
|
extern syscall_invalid
|
|
|
|
global syscall_handler_prelude
|
|
global syscall_handler_prelude.return
|
|
syscall_handler_prelude:
|
|
swapgs
|
|
mov [gs:CPU_DATA.rsp3], rsp
|
|
mov rsp, [gs:CPU_DATA.rsp0]
|
|
|
|
push rcx
|
|
push rbp
|
|
mov rbp, rsp
|
|
|
|
push rbx
|
|
push r11
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
|
|
inc qword [rel __counter_syscall_enter]
|
|
|
|
cmp rax, MAX_SYSCALLS
|
|
jle .ok_syscall
|
|
|
|
mov rdi, rax
|
|
call syscall_invalid
|
|
|
|
.ok_syscall:
|
|
lea r11, [rel syscall_registry]
|
|
mov r11, [r11 + rax * 8]
|
|
call r11
|
|
|
|
inc qword [rel __counter_syscall_sysret]
|
|
|
|
.return:
|
|
pop r15
|
|
pop r14
|
|
pop r13
|
|
pop r12
|
|
pop r11
|
|
pop rbx
|
|
|
|
pop rbp
|
|
pop rcx
|
|
|
|
mov [gs:CPU_DATA.rsp0], rsp
|
|
mov rsp, [gs:CPU_DATA.rsp3]
|
|
|
|
swapgs
|
|
o64 sysret
|