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
]])
|