summaryrefslogtreecommitdiff
path: root/stage3/isr.lua
blob: 3c88c5e7348ab79ab89a9e9128af1a1b8fa56aaa (plain)
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
print("global idt_entries")
print("extern interrupt_handler")

local has_error_code = {}
for _, x in pairs({8, 10, 11, 12, 13, 14, 17, 21, 29, 30}) do
	has_error_code[x] = true
end

for i = 0, 255 do
	print("isr_" .. i .. ":")
	print("cli")

	if not has_error_code[i] then
		print("push 0")
	end

	print("push " .. i)
	print("jmp isr_common")
end

print("idt_entries:")
for i = 0, 255 do
	print("dq isr_"..i)
end

print([[
isr_common:
	push r15
	push r14
	push r13
	push r12
	push r11
	push r10
	push r9
	push r8
	push rsi
	push rdi
	push rbp
	push rdx
	push rcx
	push rbx
	push rax

	cld
	mov rdi, rsp
	call interrupt_handler

	pop rax
	pop rbx
	pop rcx
	pop rdx
	pop rbp
	pop rdi
	pop rsi
	pop r8
	pop r9
	pop r10
	pop r11
	pop r12
	pop r13
	pop r14
	pop r15

	add rsp, 16

	iretq
]])