blob: 9fdab5f8a9fd133cb1e6204d819a48fca3156c1b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
.intel_syntax noprefix
.section .text
.global halt
halt:
1: hlt
jmp 1b
.global set_gdt
set_gdt:
lgdt [rdi]
push rsi
lea rax, 1f
push rax
retfq
1: mov ds, rdx
mov es, rdx
mov fs, rdx
mov gs, rdx
mov ss, rdx
ltr rcx
ret
.global set_idt
set_idt:
lidt [rdi]
ret
.global disable_interrupts
disable_interrupts:
cli
ret
.global enable_interrupts
enable_interrupts:
sti
ret
.global get_cr2
get_cr2:
mov rax, cr2
ret
.global get_cr3
get_cr3:
mov rax, cr3
ret
#define DEFINE_ISRS \
ISR(0) \
ISR(1) \
ISR(2) \
ISR(3) \
ISR(4) \
ISR(5) \
ISR(6) \
ISR(7) \
ISR_E(8) \
ISR(9) \
ISR_E(10) \
ISR_E(11) \
ISR_E(12) \
ISR_E(13) \
ISR_E(14) \
ISR(15) \
ISR(16) \
ISR_E(17) \
ISR(18) \
ISR(19) \
ISR(20) \
ISR_E(21) \
ISR(22) \
ISR(23) \
ISR(24) \
ISR(25) \
ISR(26) \
ISR(27) \
ISR(28) \
ISR(29) \
ISR(30) \
ISR(31)
.extern interrupt_handler
#define ISR(n) \
isr_stub_##n: \
mov rdi, n; \
mov rsi, 0; \
call interrupt_handler; \
iretq;
#define ISR_E(n) \
isr_stub_##n: \
pop rsi; \
mov rdi, n; \
call interrupt_handler;
iretq;
DEFINE_ISRS
#undef ISR
#undef ISR_E
#define ISR(n) .quad isr_stub_##n;
#define ISR_E(n) .quad isr_stub_##n;
.section .data
.global isr_stubs
isr_stubs:
DEFINE_ISRS
#undef ISR
|