X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fdesctab.asm;h=8212773b5b81468a9dbe35614ab9ac5bc9371b1f;hb=5255c9f07cb2e0e43cf283e256c964eaa7970c8e;hp=c575dd61703d64c0e01dc961c6cd1159348f5b71;hpb=16786b0b2d78359e052bd088f86aee90e1140737;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/desctab.asm b/Kernel/arch/x86_64/desctab.asm index c575dd61..8212773b 100644 --- a/Kernel/arch/x86_64/desctab.asm +++ b/Kernel/arch/x86_64/desctab.asm @@ -154,6 +154,7 @@ IRQ_AddHandler: ; RDI - IRQ Number ; RSI - Callback + ; Check for RDI >= 16 cmp rdi, 16 jb .numOK xor rax, rax @@ -161,10 +162,10 @@ IRQ_AddHandler: jmp .ret .numOK: - mov rax, rdi - shr rax, 3+2 + ; Get handler base into RAX + lea rax, [rdi*4] mov rcx, gaIRQ_Handlers - add rax, rcx + lea rax, [rcx+rax*8] ; Find a free callback slot %rep NUM_IRQ_CALLBACKS @@ -196,6 +197,7 @@ IRQ_AddHandler: pop rsi pop rdi + ; Assign and return mov [rax], rsi xor rax, rax @@ -289,13 +291,17 @@ DEFIRQ i [global IrqCommon] IrqCommon: PUSH_GPR + push gs + push fs - mov rbx, [rsp+16*8] ; Calculate address - shr rbx, 3+2 ; *8*4 + mov rbx, [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 mov rax, gaIRQ_Handlers - add rbx, rax + lea rbx, [rax+rbx*8] ; Check all callbacks + sub rsp, 8 ; Shadow of argument %assign i 0 %rep NUM_IRQ_CALLBACKS ; Get callback address @@ -303,17 +309,18 @@ IrqCommon: test rax, rax ; Check if it exists jz .skip.%[i] ; Set RDI to IRQ number - mov rdi, [rsp+16*8] ; Get IRQ number + mov rdi, [rsp+(16+2+1)*8] ; Get IRQ number call rax ; Call .skip.%[i]: add rbx, 8 ; Next! %assign i i+1 %endrep + add rsp, 8 ; ACK + mov al, 0x20 mov rdi, [rsp+16*8] ; Get IRQ number cmp rdi, 8 - mov al, 0x20 jb .skipAckSecondary mov dx, 0x00A0 out dx, al @@ -321,6 +328,8 @@ IrqCommon: mov dx, 0x0020 out dx, al + pop fs + pop gs POP_GPR add rsp, 8*2 ;xchg bx, bx @@ -328,8 +337,15 @@ IrqCommon: [extern Proc_Scheduler] [global SchedulerIRQ] +; +; NOTE: Proc_Scheduler makes assumptions about the stack state when called +; SchedulerIRQ: + push 0 ; Error code + push 0 ; IRQNum PUSH_GPR + push gs + push fs ;PUSH_FPU ;PUSH_XMM @@ -365,7 +381,10 @@ SchedulerIRQ: ;POP_XMM ;POP_FPU + pop fs + pop gs POP_GPR + add rsp, 2*8 ; Dummy error code and IRQ num iretq [section .data]