summaryrefslogtreecommitdiff
path: root/src/kernel/isrs.asm
blob: 1aba88491a52e44945873a0c6f335af39ec6cec6 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
bits 32

global syscall_isr
global quit_isr
global yield_isr
global _start_user_mode
global kbd_isr

global udf_isr
global dfa_isr
global tsf_isr
global npf_isr
global ssf_isr
global gpf_isr
global pff_isr

extern syscall_table
extern active_task

extern delete_task
extern advance_active_task
extern on_kbd_isr
extern make_sure_tasks
extern exception_halt
extern pf_check_stack
extern dump

n_syscalls equ 0x1c

;section .bss
;_debug_is_start_task resb 1
;extern switch_to_kernel_cr3
;extern switch_to_task_cr3

section .text
syscall_isr:
  cmp eax, n_syscalls
  jge .bad

;  mov byte [_debug_is_start_task], 0
;  cmp eax, 0x4
;  jne .dont_set_debug
;  mov byte [_debug_is_start_task], 1
;.dont_set_debug:

  mov eax, dword [syscall_table + eax * 4]

  push edi
  push esi
  push edx
  push ecx
  push ebx

  call eax

  add esp, 20

;  cmp byte [_debug_is_start_task], 0
;  je .dont_do_debug
;  push eax
;  call switch_to_kernel_cr3
;  jmp $
;  call switch_to_task_cr3
;  pop eax
;.dont_do_debug:

._before_return:
  iret

.bad:
  mov eax, -1
  iret

quit_isr:
  push dword [active_task]
  call delete_task
  call make_sure_tasks
  mov dword [esp], yield_isr.return_to_task
  jmp advance_active_task

yield_isr:
  mov eax, dword [active_task]

  mov dword [eax +  8], ebx
  mov dword [eax + 12], ecx
  mov dword [eax + 16], edx
  mov dword [eax + 20], esi
  mov dword [eax + 24], edi
  mov dword [eax + 28], ebp

  mov edx, dword [esp]
  mov dword [eax], edx

  mov edx, cr3
  mov dword [eax + 4], edx

  mov edx, dword [esp + 12]
  mov dword [eax + 32], edx

  call advance_active_task

.return_to_task:
  mov eax, dword [active_task]

  mov edx, dword [eax]
  mov dword [esp], edx

  mov edx, dword [eax + 4]
  mov cr3, edx

  mov edx, dword [eax + 32]
  mov dword [esp + 12], edx

  mov ebx, dword [eax +  8]
  mov ecx, dword [eax + 12]
  mov edx, dword [eax + 16]
  mov esi, dword [eax + 20]
  mov edi, dword [eax + 24]
  mov ebp, dword [eax + 28]

._before_return:
  iret

_start_user_mode:
  mov ax, 0x2b
  mov ds, ax
  mov es, ax

  push dword 0x2b
  sub esp, 4
  push dword 0x00000200;interrupt flag
  push dword 0x23
  sub esp, 4
  jmp yield_isr.return_to_task

kbd_isr:
  push eax
  push ecx
  push edx

  call on_kbd_isr

  test eax, eax
  jz .no_debug

  push ebx
  push esi
  push edi
  push eax
  call dump
  add esp, 16

.no_debug:
  mov al, 0x20
  out 0x0020, al

  pop edx
  pop ecx
  pop eax
  iret

udf_isr:
  push 0
  push udid
  jmp exception

dfa_isr:
  push dfid
  jmp exception

tsf_isr:
  push tsid
  jmp exception

npf_isr:
  push npid
  jmp exception

ssf_isr:
  push ssid
  jmp exception

gpf_isr:
  push gpid
  jmp exception

pff_isr:
  push eax
  push ecx
  push edx

  mov eax, cr2
  push eax
  call pf_check_stack
  add esp, 4

  pop edx
  pop ecx
  test eax, eax
  jz .not_stack

  pop eax
  add esp, 4
  iret

.not_stack:
  pop eax
  push pfid
  jmp exception

exception:
  push edi
  push esi
  push edx
  push ecx
  push ebx
  push eax
  call exception_halt

section .rodata
udid db "UD", 0
dfid db "DF", 0
tsid db "TS", 0
npid db "NP", 0
ssid db "SS", 0
gpid db "GP", 0
pfid db "PF", 0