80 lines
1.1 KiB
ArmAsm
80 lines
1.1 KiB
ArmAsm
#include <int.h>
|
|
.intel_syntax noprefix
|
|
|
|
.extern int_handler
|
|
.global isr_common
|
|
.global isr_return
|
|
|
|
isr_common:
|
|
// Push all registers
|
|
push r15
|
|
push r14
|
|
push r13
|
|
push r12
|
|
push r11
|
|
push r10
|
|
push r9
|
|
push r8
|
|
push rbp
|
|
push rdi
|
|
push rsi
|
|
push rdx
|
|
push rcx
|
|
push rbx
|
|
push rax
|
|
|
|
# Clear RFLAGS
|
|
pushq 0
|
|
popf
|
|
|
|
# Check stored RFLAGS to see if we came here from user mode
|
|
mov rax, [rsp + REG_OFFSET_RFLAGS]
|
|
and rax, RFLAGS_IOPL
|
|
jz .kernel_mode
|
|
swapgs
|
|
|
|
.kernel_mode:
|
|
mov rdi, rsp
|
|
call int_handler
|
|
mov rdi, rax
|
|
|
|
isr_return:
|
|
mov rsp, rdi
|
|
|
|
# Check stored RFLAGS to see if we are going into user mode
|
|
mov rax, [rsp + REG_OFFSET_RFLAGS]
|
|
and rax, RFLAGS_IOPL
|
|
jz .kernel_return
|
|
swapgs
|
|
|
|
.kernel_return:
|
|
// Return and restore stack
|
|
pop rax
|
|
pop rbx
|
|
pop rcx
|
|
pop rdx
|
|
pop rsi
|
|
pop rdi
|
|
pop rbp
|
|
pop r8
|
|
pop r9
|
|
pop r10
|
|
pop r11
|
|
pop r12
|
|
pop r13
|
|
pop r14
|
|
pop r15
|
|
|
|
// Jump to syscall_return if we're in a syscall
|
|
push rax
|
|
mov rax, [rsp + 8]
|
|
cmp rax, INT_SYSCALL
|
|
.extern syscall_return
|
|
jz syscall_return
|
|
pop rax
|
|
|
|
// Pop error code and fault number
|
|
add rsp, 16
|
|
iretq
|
|
|