Merge branch 'master' of git://git.ucc.asn.au/acess2
[tpg/acess2.git] / Kernel / arch / x86 / desctab.asm
1 ; AcessOS Microkernel Version
2 ;
3 ; desctab.asm
4 [BITS 32]
5
6 %if USE_MP
7 MAX_CPUS        equ     8
8 %else
9 MAX_CPUS        equ     1
10 %endif
11 GDT_SIZE        equ     (1+2*2+1+MAX_CPUS)*8
12
13 [section .data]
14 ; GDT
15 [global gGDT]
16 gGDT:
17         ; PL0 - Kernel
18         ; PL3 - User
19         dd 0x00000000, 0x00000000       ; 00 NULL Entry
20         dd 0x0000FFFF, 0x00CF9A00       ; 08 PL0 Code
21         dd 0x0000FFFF, 0x00CF9200       ; 10 PL0 Data
22         dd 0x0000FFFF, 0x00CFFA00       ; 18 PL3 Code
23         dd 0x0000FFFF, 0x00CFF200       ; 20 PL3 Data
24         dd 26*4-1, 0x00408900   ; Double Fault TSS
25         times MAX_CPUS  dd 26*4-1, 0x00408900
26 [global gGDTPtr]
27 gGDTPtr:
28         dw      GDT_SIZE-1
29         dd      gGDT
30 ; IDT
31 ALIGN 8
32 [global gIDT]
33 gIDT:
34         times   256     dd      0x00080000,0x00000F00
35 [global gIDTPtr]
36 gIDTPtr:
37         dw      256 * 16 - 1    ; Limit
38         dd      gIDT            ; Base
39
40 [section .text]
41
42 [global Desctab_Install]
43 Desctab_Install:
44         ; Set GDT
45         lgdt [gGDTPtr]
46         mov ax, 0x10    ; PL0 Data
47         mov ss, ax
48         mov ds, ax
49         mov es, ax
50         mov gs, ax
51         mov fs, ax
52         jmp 0x08:.pl0code
53 .pl0code:
54
55         ; Set IDT
56 %macro SETISR   1
57         mov eax, Isr%1
58         mov     WORD [gIDT + %1*8], ax
59         shr eax, 16
60         mov     WORD [gIDT + %1*8+6], ax
61         mov     ax, WORD [gIDT + %1*8 + 4]
62         or ax, 0x8000
63         mov     WORD [gIDT + %1*8 + 4], ax
64 %endmacro
65 %macro SETUSER  1
66         mov     ax, WORD [gIDT + %1*8 + 4]
67         or ax, 0x6000
68         mov     WORD [gIDT + %1*8 + 4], ax
69 %endmacro
70         %assign i       0
71         %rep 32
72         SETISR  i
73         %assign i i+1
74         %endrep
75         
76         SETISR  0xAC
77         SETUSER 0xAC
78         
79         %assign i       0xF0
80         %rep 16
81         SETISR  i
82         %assign i i+1
83         %endrep
84
85         ; Load IDT
86         lidt [gIDTPtr]
87
88         ; Remap PIC
89         push edx        ; Save EDX
90         mov dx, 0x20
91         mov al, 0x11
92         out dx, al      ;       Init Command
93     mov dx, 0x21
94         mov al, 0xF0
95         out dx, al      ;       Offset (Start of IDT Range)
96     mov al, 0x04
97         out dx, al      ;       IRQ connected to Slave (00000100b) = IRQ2
98     mov al, 0x01
99         out dx, al      ;       Set Mode
100     mov al, 0x00
101         out dx, al      ;       Set Mode
102         
103         mov dx, 0xA0
104         mov al, 0x11
105         out dx, al      ;       Init Command
106     mov dx, 0xA1
107         mov al, 0xF8
108         out dx, al      ;       Offset (Start of IDT Range)
109     mov al, 0x02
110         out dx, al      ;       IRQ Line connected to master
111     mov al, 0x01
112         out dx, al      ;       Set Mode
113     mov dl, 0x00
114         out dx, al      ;       Set Mode
115         pop edx
116         
117         ret
118
119
120 ; ===============
121 ; = Define ISRs =
122 ; ===============
123 %macro  ISR_ERRNO       1
124 [global Isr%1]
125 Isr%1:
126         ;xchg bx, bx
127         push    %1
128         jmp     ErrorCommon
129 %endmacro
130 %macro  ISR_NOERR       1
131 [global Isr%1]
132 Isr%1:
133         xchg bx, bx
134         push    0
135         push    %1
136         jmp     ErrorCommon
137 %endmacro
138
139 %macro DEF_SYSCALL      1
140 [global Isr%1]
141 Isr%1:
142         push    0
143         push    %1
144         jmp     SyscallCommon
145 %endmacro
146
147 %macro DEF_IRQ  1
148 [global Isr%1]
149 Isr%1:
150         push    0
151         push    %1
152         jmp     IRQCommon
153 %endmacro
154
155 ISR_NOERR       0;  0: Divide By Zero Exception
156 ISR_NOERR       1;  1: Debug Exception
157 ISR_NOERR       2;  2: Non Maskable Interrupt Exception
158 ISR_NOERR       3;  3: Int 3 Exception
159 ISR_NOERR       4;  4: INTO Exception
160 ISR_NOERR       5;  5: Out of Bounds Exception
161 ISR_NOERR       6;  6: Invalid Opcode Exception
162 ISR_NOERR       7;  7: Coprocessor Not Available Exception
163 ISR_ERRNO       8;  8: Double Fault Exception (With Error Code!)
164 ISR_NOERR       9;  9: Coprocessor Segment Overrun Exception
165 ISR_ERRNO       10; 10: Bad TSS Exception (With Error Code!)
166 ISR_ERRNO       11; 11: Segment Not Present Exception (With Error Code!)
167 ISR_ERRNO       12; 12: Stack Fault Exception (With Error Code!)
168 ISR_ERRNO       13; 13: General Protection Fault Exception (With Error Code!)
169 ISR_ERRNO       14; 14: Page Fault Exception (With Error Code!)
170 ISR_NOERR       15; 15: Reserved Exception
171 ISR_NOERR       16; 16: Floating Point Exception
172 ISR_NOERR       17; 17: Alignment Check Exception
173 ISR_NOERR       18; 18: Machine Check Exception
174 ISR_NOERR       19; 19: Reserved
175 ISR_NOERR       20; 20: Reserved
176 ISR_NOERR       21; 21: Reserved
177 ISR_NOERR       22; 22: Reserved
178 ISR_NOERR       23; 23: Reserved
179 ISR_NOERR       24; 24: Reserved
180 ISR_NOERR       25; 25: Reserved
181 ISR_NOERR       26; 26: Reserved
182 ISR_NOERR       27; 27: Reserved
183 ISR_NOERR       28; 28: Reserved
184 ISR_NOERR       29; 29: Reserved
185 ISR_NOERR       30; 30: Reserved
186 ISR_NOERR       31; 31: Reserved
187
188 DEF_SYSCALL     0xAC    ; Acess System Call
189
190 ; IRQs
191 ; - Timer
192 [global Isr240]
193 Isr240:
194         push 0
195         jmp SchedulerBase
196 ; - Assignable
197 %assign i       0xF1
198 %rep 16
199         DEF_IRQ i
200 %assign i i+1
201 %endrep
202
203 ; ---------------------
204 ; Common error handling
205 ; ---------------------
206 [extern ErrorHandler]
207 ErrorCommon:
208         ;xchg bx, bx
209         pusha
210         push ds
211         push es
212         push fs
213         push gs
214         
215         mov ax, 0x10
216         mov ds, ax
217         mov es, ax
218         mov fs, ax
219         mov gs, ax
220         
221         push esp
222         call ErrorHandler
223         add esp, 4
224         
225         pop gs
226         pop fs
227         pop es
228         pop ds
229         popa
230         add esp, 8      ; Error Code and ID
231         iret
232
233 ; --------------------------
234 ; Common System Call Handler
235 ; --------------------------
236 [extern SyscallHandler]
237 SyscallCommon:
238         pusha
239         push ds
240         push es
241         push fs
242         push gs
243         
244         push esp
245         call SyscallHandler
246         add esp, 4
247         
248         pop gs
249         pop fs
250         pop es
251         pop ds
252         popa
253         add esp, 8      ; Error Code and ID
254         iret
255
256 ; ------------
257 ; IRQ Handling
258 ; ------------
259 [extern IRQ_Handler]
260 IRQCommon:
261         pusha
262         push ds
263         push es
264         push fs
265         push gs
266         
267         mov ax, 0x10
268         mov ds, ax
269         mov es, ax
270         mov fs, ax
271         mov gs, ax
272         
273         push esp
274         call IRQ_Handler
275         add esp, 4
276         
277         pop gs
278         pop fs
279         pop es
280         pop ds
281         popa
282         add esp, 8      ; Error Code and ID
283         iret
284
285 ; --------------
286 ; Task Scheduler
287 ; --------------
288 [extern Proc_Scheduler]
289 SchedulerBase:
290         pusha
291         push ds
292         push es
293         push fs
294         push gs
295         
296         mov ax, 0x10
297         mov ds, ax
298         mov es, ax
299         mov fs, ax
300         mov gs, ax
301         
302         mov eax, [esp+12*4]     ; CPU Number
303         push eax        ; Pus as argument
304         
305         call Proc_Scheduler
306         
307         add esp, 4      ; Remove Argument
308         
309         pop gs
310         pop fs
311         pop es
312         pop ds
313
314         mov dx, 0x20
315         mov al, 0x20
316         out dx, al              ; ACK IRQ
317         popa
318         add esp, 4      ; CPU ID
319         ; No Error code / int num
320         iret

UCC git Repository :: git.ucc.asn.au