[section .data]
; GDT
[global gGDT]
-[global gGDTptr]
gGDT:
; PL0 - Kernel
; PL3 - User
dd 0x0000FFFF, 0x00CF9200 ; 10 PL0 Data
dd 0x0000FFFF, 0x00CFFA00 ; 18 PL3 Code
dd 0x0000FFFF, 0x00CFF200 ; 20 PL3 Data
- dd 26*4-1, 0x00408900 ; Double Fault TSS
- times MAX_CPUS dd 26*4-1, 0x00408900
-gGDTptr:
+ dd 26*4-1, 0x00408900 ; 28 Double Fault TSS
+ times MAX_CPUS dd 26*4-1, 0x00408900 ; 30+ TSSes
+[global gGDTPtr]
+gGDTPtr:
dw GDT_SIZE-1
dd gGDT
; IDT
ALIGN 8
+[global gIDT]
gIDT:
times 256 dd 0x00080000,0x00000F00
+[global gIDTPtr]
gIDTPtr:
dw 256 * 16 - 1 ; Limit
dd gIDT ; Base
[section .text]
+
[global Desctab_Install]
Desctab_Install:
; Set GDT
- lgdt [gGDTptr]
+ lgdt [gGDTPtr]
mov ax, 0x10 ; PL0 Data
mov ss, ax
mov ds, ax
mov WORD [gIDT + %1*8], ax
shr eax, 16
mov WORD [gIDT + %1*8+6], ax
+ ; Enable
mov ax, WORD [gIDT + %1*8 + 4]
or ax, 0x8000
mov WORD [gIDT + %1*8 + 4], ax
SETISR 0xAC
SETUSER 0xAC
+ %if USE_MP
+ SETISR 0xEE ; 0xEE Timer
+ SETISR 0xEF ; 0xEF Spurious Interrupt
+ %endif
+
%assign i 0xF0
%rep 16
SETISR i
%macro ISR_NOERR 1
[global Isr%1]
Isr%1:
- xchg bx, bx
+ ;xchg bx, bx
push 0
push %1
jmp ErrorCommon
%macro DEF_IRQ 1
[global Isr%1]
Isr%1:
- ;cli ; HACK!
push 0
push %1
jmp IRQCommon
DEF_SYSCALL 0xAC ; Acess System Call
+%if USE_MP
+[global Isr0xEE]
+[extern SchedulerBase]
+; AP's Timer Interrupt
+Isr0xEE:
+ push 0
+ xchg bx, bx ; MAGIC BREAK
+ jmp SchedulerBase
+; Spurious Interrupt
+[global Isr0xEF]
+Isr0xEF:
+ xchg bx, bx ; MAGIC BREAK
+ iret
+%endif
+
; IRQs
; - Timer
[global Isr240]
+[global Isr240.jmp]
+[extern SchedulerBase]
+[extern SetAPICTimerCount]
Isr240:
push 0
+ ;xchg bx, bx ; MAGIC BREAK
+Isr240.jmp:
+ %if USE_MP
+ jmp SetAPICTimerCount ; This is reset once the bus speed has been calculated
+ %else
jmp SchedulerBase
+ %endif
; - Assignable
%assign i 0xF1
%rep 16
; ---------------------
[extern ErrorHandler]
ErrorCommon:
+ ;xchg bx, bx ; MAGIC BREAK
pusha
push ds
push es
push fs
push gs
+ mov ax, 0x10
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+
push esp
call ErrorHandler
add esp, 4
; IRQ Handling
; ------------
[extern IRQ_Handler]
+[global IRQCommon]
IRQCommon:
pusha
push ds
push fs
push gs
+ mov ax, 0x10
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+
push esp
call IRQ_Handler
add esp, 4
popa
add esp, 8 ; Error Code and ID
iret
-
-; --------------
-; Task Scheduler
-; --------------
-[extern Proc_Scheduler]
-SchedulerBase:
- pusha
- push ds
- push es
- push fs
- push gs
-
- mov eax, [esp+12*4] ; CPU Number
- push eax ; Pus as argument
-
- call Proc_Scheduler
-
- add esp, 4 ; Remove Argument
-
- pop gs
- pop fs
- pop es
- pop ds
-
- mov dx, 0x20
- mov al, 0x20
- out dx, al ; ACK IRQ
- popa
- add esp, 4 ; CPU ID
- ; No Error code / int num
- iret