metal-cos/sys/amd64/trapentry.S
2023-09-10 16:36:43 -04:00

215 lines
3.3 KiB
ArmAsm

/*
* Trap Handlers
*/
.extern trap_entry
.text
.macro TRAP_NOEC TRAPNUM
trap\TRAPNUM:
# Push top of the trap frame
pushq %rax
pushq $\TRAPNUM
pushq %rax
xorq %rax, %rax
movw %ds, %ax
pushq %rax
jmp trap_common
.endm
.macro TRAP_EC TRAPNUM
trap\TRAPNUM:
# Push top of the trap frame
pushq $\TRAPNUM
pushq %rax
xorq %rax, %rax
movw %ds, %ax
pushq %rax
jmp trap_common
.endm
.globl trap_table
trap_table:
.quad trap0
.quad trap1
.quad trap2
.quad trap3
.quad trap4
.quad trap5
.quad trap6
.quad trap7
.quad trap8
.quad trap9
.quad trap10
.quad trap11
.quad trap12
.quad trap13
.quad trap14
.quad trap15
.quad trap16
.quad trap17
.quad trap18
.quad trap19
.quad trap20
.quad trap21
.quad trap22
.quad trap23
.quad trap24
.quad trap25
.quad trap26
.quad trap27
.quad trap28
.quad trap29
.quad trap30
.quad trap31
.quad trap32
.quad trap33
.quad trap34
.quad trap35
.quad trap36
.quad trap37
.quad trap38
.quad trap39
.quad trap40
.quad trap41
.quad trap42
.quad trap43
.quad trap44
.quad trap45
.quad trap46
.quad trap47
.quad trap48
.quad trap49
.quad trap50
.quad trap51
.quad trap52
.quad trap53
.quad trap54
.quad trap55
.quad trap56
.quad trap57
.quad trap58
.quad trap59
.quad trap60
.quad trap61
.quad trap62
.quad trap63
TRAP_NOEC 0 // DE
TRAP_NOEC 1 // DB
TRAP_NOEC 2 // NMI
TRAP_NOEC 3 // BP
TRAP_NOEC 4 // OF
TRAP_NOEC 5 // BR
TRAP_NOEC 6 // UD
TRAP_NOEC 7 // NM
TRAP_EC 8 // DF
TRAP_NOEC 9
TRAP_EC 10 // TS
TRAP_EC 11 // NP
TRAP_EC 12 // SS
TRAP_EC 13 // GP
TRAP_EC 14 // PF
TRAP_NOEC 15
TRAP_NOEC 16 // MF
TRAP_EC 17 // AC
TRAP_NOEC 18 // MC
TRAP_NOEC 19 // XF
TRAP_NOEC 20 // VE
TRAP_NOEC 21
TRAP_NOEC 22
TRAP_NOEC 23
TRAP_NOEC 24
TRAP_NOEC 25
TRAP_NOEC 26
TRAP_NOEC 27
TRAP_NOEC 28
TRAP_NOEC 29
TRAP_NOEC 30
TRAP_NOEC 31
TRAP_NOEC 32 // IRQ 0
TRAP_NOEC 33
TRAP_NOEC 34
TRAP_NOEC 35
TRAP_NOEC 36
TRAP_NOEC 37
TRAP_NOEC 38
TRAP_NOEC 39
TRAP_NOEC 40
TRAP_NOEC 41
TRAP_NOEC 42
TRAP_NOEC 43
TRAP_NOEC 44
TRAP_NOEC 45
TRAP_NOEC 46
TRAP_NOEC 47 // IRQ 15
TRAP_NOEC 48 // IRQ 16 (PCI)
TRAP_NOEC 49
TRAP_NOEC 50
TRAP_NOEC 51
TRAP_NOEC 52
TRAP_NOEC 53
TRAP_NOEC 54
TRAP_NOEC 55 // IRQ 23 (PCI)
TRAP_NOEC 56 // LAPIC Spurious
TRAP_NOEC 57 // LAPIC Error
TRAP_NOEC 58 // LAPIC Thermal
TRAP_NOEC 59
TRAP_NOEC 60 // System Call
TRAP_NOEC 61
TRAP_NOEC 62
TRAP_NOEC 63
trap_common:
# Create the rest of the trap frame
pushq %rbx
pushq %rcx
pushq %rdx
pushq %rsi
pushq %rdi
pushq %rbp
pushq %r8
pushq %r9
pushq %r10
pushq %r11
pushq %r12
pushq %r13
pushq %r14
pushq %r15
# Pass the trap frame as an argument to trap_entry
movq %rsp, %rdi
call trap_entry
.globl trap_return
trap_return:
popq %r15
popq %r14
popq %r13
popq %r12
popq %r11
popq %r10
popq %r9
popq %r8
popq %rbp
popq %rdi
popq %rsi
popq %rdx
popq %rcx
popq %rbx
popq %rax
movw %ax, %ds
popq %rax
# Skip error code and vector number
addq $16, %rsp
# Return to userspace
iretq
.globl Trap_Pop
Trap_Pop:
movq %rdi, %rsp
jmp trap_return