summaryrefslogtreecommitdiff
path: root/src/nasty.S
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