206 lines
3.1 KiB
ArmAsm
206 lines
3.1 KiB
ArmAsm
/*
|
|
* Trap Handlers
|
|
*/
|
|
|
|
.extern trap_entry
|
|
|
|
.text
|
|
|
|
.macro TRAP_NOEC TRAPNUM
|
|
trap\TRAPNUM:
|
|
pushq %rax
|
|
pushq $\TRAPNUM
|
|
pushq %rax
|
|
xorq %rax, %rax
|
|
movw %ds, %ax
|
|
pushq %rax
|
|
jmp trap_common
|
|
.endm
|
|
|
|
.macro TRAP_EC TRAPNUM
|
|
trap\TRAPNUM:
|
|
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:
|
|
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
|
|
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
|
|
addq $16, %rsp // Skip error code and vector number
|
|
iretq
|
|
|
|
.globl Trap_Pop
|
|
Trap_Pop:
|
|
movq %rdi, %rsp
|
|
jmp trap_return
|
|
|