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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
.code64
.extern printk
.extern apic_ack
.macro CALL_PRINTK msg
mov \msg, %rdi
mov $0, %eax # Required for variadic functions
mov $printk,%rcx
call *(%rcx)
.endm
.macro SAVE_REGS
push %r8
push %r9
push %r10
push %r11
push %r12
push %r13
push %r14
push %r15
push %rax
push %rbx
push %rcx
push %rdx
push %rbp
push %rsi
push %rdi
xor %rax,%rax # Because I am picky
mov %gs, %rax
push %rax
mov %es, %rax
push %rax
mov %fs, %rax
push %rax
mov %ds, %rax
push %rax
mov $0x10, %ax
mov %ax, %ds
mov 80(%rsp), %rax
.endm
.macro RESTORE_REGS
pop %rax
mov %ax, %ds
pop %rax
mov %ax, %fs
pop %rax
mov %ax, %es
pop %rax
mov %ax, %gs
pop %rdi
pop %rsi
pop %rbp
pop %rdx
pop %rcx
pop %rbx
pop %rax
pop %r15
pop %r14
pop %r13
pop %r12
pop %r11
pop %r10
pop %r9
pop %r8
.endm
.globl INT_DEFAULT
INT_DEFAULT:
SAVE_REGS
RESTORE_REGS
iretq
.globl INT_0
INT_0:
CALL_PRINTK $MSG_INT_0
INT_0_INFINITE:
jmp INT_0_INFINITE
iretq
.globl INT_10
INT_10:
CALL_PRINTK $MSG_INT_10
INT_10_INFINITE:
jmp INT_10_INFINITE
iretq
.globl INT_14
INT_14:
pop %rsi
CALL_PRINTK $MSG_INT_14
INT_14_INFINITE:
jmp INT_14_INFINITE
iretq
.globl INT_KBD
INT_KBD:
SAVE_REGS
CALL_PRINTK $MSG_INT_KBD
call apic_ack
RESTORE_REGS
iretq
.globl INT_CLK
.extern clock
INT_CLK:
SAVE_REGS
call clock
call apic_ack
RESTORE_REGS
iretq
.globl INT_SYSCALL
.extern syscall
INT_SYSCALL:
SAVE_REGS
call syscall
RESTORE_REGS
iretq
MSG_INT_0:
.asciz "Zero Division error!"
MSG_INT_10:
.asciz "Invalid TSS!"
MSG_INT_14:
.asciz "Page fault: error %x !"
MSG_INT_KBD:
.asciz "Key press!"
MSG:
.asciz "Called :)\n"
|