Fixing behavior of Threads_CloneTCB
[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   ; 28 Double Fault TSS
25         times MAX_CPUS  dd 26*4-1, 0x00408900   ; 30+ TSSes
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 [extern SchedulerBase]
194 Isr240:
195         push 0
196         jmp SchedulerBase
197 ; - Assignable
198 %assign i       0xF1
199 %rep 16
200         DEF_IRQ i
201 %assign i i+1
202 %endrep
203
204 ; ---------------------
205 ; Common error handling
206 ; ---------------------
207 [extern ErrorHandler]
208 ErrorCommon:
209         ;xchg bx, bx
210         pusha
211         push ds
212         push es
213         push fs
214         push gs
215         
216         mov ax, 0x10
217         mov ds, ax
218         mov es, ax
219         mov fs, ax
220         mov gs, ax
221         
222         push esp
223         call ErrorHandler
224         add esp, 4
225         
226         pop gs
227         pop fs
228         pop es
229         pop ds
230         popa
231         add esp, 8      ; Error Code and ID
232         iret
233
234 ; --------------------------
235 ; Common System Call Handler
236 ; --------------------------
237 [extern SyscallHandler]
238 SyscallCommon:
239         pusha
240         push ds
241         push es
242         push fs
243         push gs
244         
245         push esp
246         call SyscallHandler
247         add esp, 4
248         
249         pop gs
250         pop fs
251         pop es
252         pop ds
253         popa
254         add esp, 8      ; Error Code and ID
255         iret
256
257 ; ------------
258 ; IRQ Handling
259 ; ------------
260 [extern IRQ_Handler]
261 IRQCommon:
262         pusha
263         push ds
264         push es
265         push fs
266         push gs
267         
268         mov ax, 0x10
269         mov ds, ax
270         mov es, ax
271         mov fs, ax
272         mov gs, ax
273         
274         push esp
275         call IRQ_Handler
276         add esp, 4
277         
278         pop gs
279         pop fs
280         pop es
281         pop ds
282         popa
283         add esp, 8      ; Error Code and ID
284         iret

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