X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fdesctab.asm;h=039fe95ed5497afa456f3b3416c5979eec6fa64b;hb=7d7952eb5cab57587c50a9c0d8c1bc45c55c0f2c;hp=05e283d6758dcfaaaa330af8a9fc4845540f4ef6;hpb=c6061d381c0af2dcc7c971347d036dc17399887a;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/desctab.asm b/Kernel/arch/x86_64/desctab.asm index 05e283d6..039fe95e 100644 --- a/Kernel/arch/x86_64/desctab.asm +++ b/Kernel/arch/x86_64/desctab.asm @@ -48,11 +48,7 @@ MM_LOCALAPIC equ 0xFFFFFD0000000000 [section .text] [global Desctab_Init] -Desctab_Init: - ; Install IDT - mov rax, gIDTPtr - lidt [rax] - +Desctab_Init: ; Save to make following instructions smaller mov rdi, gIDT @@ -61,9 +57,9 @@ Desctab_Init: mov rax, %2 mov WORD [rdi + %1*16], ax shr rax, 16 - mov WORD [rdi + %1*16+6], ax + mov WORD [rdi + %1*16 + 6], ax shr rax, 16 - mov DWORD [rdi+%1*16+8], eax + mov DWORD [rdi + %1*16 + 8], eax ; Enable mov ax, WORD [rdi + %1*16 + 4] or ax, 0x8000 @@ -82,17 +78,59 @@ Desctab_Init: %endrep ; Install IRQs - %macro SETIRQ 2 - SETIDT %2, Irq%1 - %endmacro + SETIDT 0xF0, Irq0 + SETIDT 0xF1, Irq1 + SETIDT 0xF2, Irq2 + SETIDT 0xF3, Irq3 + SETIDT 0xF4, Irq4 + SETIDT 0xF5, Irq5 + SETIDT 0xF6, Irq6 + SETIDT 0xF7, Irq7 + SETIDT 0xF8, Irq8 + SETIDT 0xF9, Irq9 + SETIDT 0xFA, Irq10 + SETIDT 0xFB, Irq11 + SETIDT 0xFC, Irq12 + SETIDT 0xFD, Irq13 + SETIDT 0xFE, Irq14 + SETIDT 0xFF, Irq15 + + ; Remap PIC + push rdx ; Save RDX + mov dx, 0x20 + mov al, 0x11 + out dx, al ; Init Command + mov dx, 0x21 + mov al, 0xF0 + out dx, al ; Offset (Start of IDT Range) + mov al, 0x04 + out dx, al ; IRQ connected to Slave (00000100b) = IRQ2 + mov al, 0x01 + out dx, al ; Set Mode + mov al, 0x00 + out dx, al ; Set Mode - %assign i 0 - %rep 16 - SETIRQ i, 0xF0+i - %assign i i+1 - %endrep + mov dx, 0xA0 + mov al, 0x11 + out dx, al ; Init Command + mov dx, 0xA1 + mov al, 0xF8 + out dx, al ; Offset (Start of IDT Range) + mov al, 0x02 + out dx, al ; IRQ Line connected to master + mov al, 0x01 + out dx, al ; Set Mode + mov dl, 0x00 + out dx, al ; Set Mode + pop rdx - ; Remap PIC + + ; Install IDT + mov rax, gIDTPtr + lidt [rax] + + ; Start interrupts + sti ret @@ -141,13 +179,13 @@ IRQ_AddHandler: %macro ISR_NOERRNO 1 Isr%1: - push 0 - push %1 + push QWORD 0 + push QWORD %1 jmp ErrorCommon %endmacro %macro ISR_ERRNO 1 Isr%1: - push %1 + push QWORD %1 jmp ErrorCommon %endmacro @@ -184,9 +222,26 @@ ISR_NOERRNO 29; 29: Reserved ISR_NOERRNO 30; 30: Reserved ISR_NOERRNO 31; 31: Reserved +[extern Error_Handler] +[global ErrorCommon] ErrorCommon: + PUSH_GPR + push gs + push fs + ;PUSH_FPU + ;PUSH_XMM + + mov rdi, rsp + xchg bx, bx + call Error_Handler + + ;POP_XMM + ;POP_FPU + pop fs + pop gs + POP_GPR add rsp, 2*8 - iret + iretq %macro DEFIRQ 1 Irq%1: @@ -201,6 +256,7 @@ DEFIRQ i %assign i i+1 %endrep +[global IrqCommon] IrqCommon: PUSH_GPR @@ -209,18 +265,22 @@ IrqCommon: mov rax, gaIRQ_Handlers add rbx, rax + ; Check all callbacks %assign i 0 %rep NUM_IRQ_CALLBACKS + ; Get callback address mov rax, [rbx] - test rax, rax - mov rdi, [rsp+16*8] ; Get IRQ number + test rax, rax ; Check if it exists jz .skip.%[i] - call rax ; 2 Bytes (Op and Mod/RM) + ; Set RDI to IRQ number + mov rdi, [rsp+16*8] ; Get IRQ number + call rax ; Call .skip.%[i]: - add rbx, 8 + add rbx, 8 ; Next! %assign i i+1 %endrep + ; ACK mov rdi, [rsp+16*8] ; Get IRQ number cmp rdi, 8 mov al, 0x20 @@ -232,10 +292,12 @@ IrqCommon: out dx, al POP_GPR - add rsp, 16 - iret + add rsp, 8*2 + ;xchg bx, bx + iretq [extern Proc_Scheduler] +[global SchedulerIRQ] SchedulerIRQ: ; TODO: Find Current CPU PUSH_GPR @@ -250,11 +312,13 @@ SchedulerIRQ: ;POP_XMM ;POP_FPU POP_GPR - iret + add rsp, 8*2 + iretq [section .data] gIDT: - times 256 dd 0x00080000, 0x00008E00, 0, 0 ; 64-bit Interrupt Gate, CS = 0x8, IST0 + ; 64-bit Interrupt Gate, CS = 0x8, IST0 (Disabled) + times 256 dd 0x00080000, 0x00000E00, 0, 0 gIDTPtr: dw 256*16-1 dq gIDT