Kernel/x86_64 - Debugging iret->CPL3 crash
[tpg/acess2.git] / Kernel / arch / x86_64 / desctab.asm
index 411cea3..739b219 100644 (file)
@@ -1,6 +1,7 @@
 ;
 ;
 ;
+%include "arch/x86_64/include/common.inc.asm"
 [BITS 64]
 
 [extern Log]
 
 MM_LOCALAPIC   equ     0xFFFFFD0000000000
 
-%macro PUSH_GPR        0
-       mov [rsp-0x60], rsp
-       mov [rsp-0x08], r15
-       mov [rsp-0x10], r14
-       mov [rsp-0x18], r13
-       mov [rsp-0x20], r12
-       mov [rsp-0x28], r11
-       mov [rsp-0x30], r10
-       mov [rsp-0x38], r9
-       mov [rsp-0x40], r8
-       mov [rsp-0x48], rdi
-       mov [rsp-0x50], rsi
-       mov [rsp-0x58], rbp
-       mov [rsp-0x68], rbx
-       mov [rsp-0x70], rdx
-       mov [rsp-0x78], rcx
-       mov [rsp-0x80], rax
-       sub rsp, 0x80
-%endmacro
-%macro POP_GPR 0
-       add rsp, 0x80
-       mov r15, [rsp-0x08]
-       mov r14, [rsp-0x10]
-       mov r13, [rsp-0x18]
-       mov r12, [rsp-0x20]
-       mov r11, [rsp-0x28]
-       mov r10, [rsp-0x30]
-       mov r9,  [rsp-0x38]
-       mov r8,  [rsp-0x40]
-       mov rdi, [rsp-0x48]
-       mov rsi, [rsp-0x50]
-       mov rbp, [rsp-0x58]
-       ;mov rsp, [rsp-0x60]
-       mov rbx, [rsp-0x68]
-       mov rdx, [rsp-0x70]
-       mov rcx, [rsp-0x78]
-       mov rax, [rsp-0x80]
-%endmacro
-
 [section .text]
 [global Desctab_Init]
 Desctab_Init:  
@@ -229,6 +191,8 @@ IRQ_AddHandler:
 [section .rodata]
 csIRQ_Assigned:
        db      "IRQ %p := %p (IRQ %i)",0
+csIRQ_Fired:
+       db      "IRQ %i fired",0
 [section .text]
 
 %macro ISR_NOERRNO     1
@@ -315,10 +279,14 @@ IrqCommon:
        PUSH_GPR
        push gs
        push fs
+
+;      mov rdi, csIRQ_Fired
+;      mov rsi, [rsp+(16+2)*8]
+;      call Log
        
-       mov rbx, [rsp+(16+2)*8] ; Get interrupt number (16 GPRS + 2 SRs)
+       mov ebx, [rsp+(16+2)*8] ; Get interrupt number (16 GPRS + 2 SRs)
 ;      xchg bx, bx     ; Bochs Magic break (NOTE: will clear the high-bits of RBX)
-       shl rbx, 2      ; *8*4
+       shl ebx, 2      ; *4
        mov rax, gaIRQ_Handlers
        lea rbx, [rax+rbx*8]
        
@@ -341,20 +309,17 @@ IrqCommon:
        
        ; ACK
        mov al, 0x20
-       mov rdi, [rsp+16*8]     ; Get IRQ number
+       mov rdi, [rsp+(16+2)*8] ; Get IRQ number
        cmp rdi, 8
        jb .skipAckSecondary
-       mov dx, 0x00A0
-       out dx, al
+       out 0xA0, al
 .skipAckSecondary:
-       mov dx, 0x0020
-       out dx, al
+       out 0x20, al
        
        pop fs
        pop gs
        POP_GPR
        add rsp, 8*2
-       ;xchg bx, bx
        iretq
 
 [extern Proc_Scheduler]
@@ -375,10 +340,12 @@ SchedulerIRQ:
        mov rax, dr0
        push rax
        
-       ; Get the CPU Number
-       mov rdi, dr1
+       mov rdi, dr1    ; Get the CPU Number
+       mov rsi, rsp    ; Save stack pointer
+       mov rdx, SchedulerIRQ.restoreState
        ; Call the Scheduler
        call Proc_Scheduler
+.restoreState:
        
        ; Restore Thread Pointer
        pop rax
@@ -407,6 +374,7 @@ SchedulerIRQ:
        pop gs
        POP_GPR
        add rsp, 2*8    ; Dummy error code and IRQ num
+;      xchg bx, bx
        iretq
 
 [extern ci_offsetof_tThread_KernelStack]
@@ -449,6 +417,10 @@ SyscallStub:
        pop r11
        pop rcx
        pop rsp         ; Change back to user stack
+       ; TODO: Determine if user is 64 or 32 bit
+
+;      xchg bx, bx     
+       db 0x48 ; REX, nasm doesn't have a sysretq opcode
        sysret
 
 [section .data]

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