X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fdesctab.asm;h=27ba9137829b8fe507856972fde87aa61db922ea;hb=62747dec23ae7ee6531ebf8e3f307726e810e84c;hp=50fc126c7dad84efa383205637be0ece59f179cf;hpb=d1d3bfa26bd78e298ad2431c4f86e2ea94515aab;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/desctab.asm b/Kernel/arch/x86_64/desctab.asm index 50fc126c..27ba9137 100644 --- a/Kernel/arch/x86_64/desctab.asm +++ b/Kernel/arch/x86_64/desctab.asm @@ -128,7 +128,7 @@ Desctab_Init: ret -; int IRQ_AddHandler(int IRQ, void (*Handler)(int IRQ)) +; int IRQ_AddHandler(int IRQ, void (*Handler)(int IRQ), void *Ptr) ; Return Values: ; 0 on Success ; -1 on an invalid IRQ Number @@ -137,6 +137,7 @@ Desctab_Init: IRQ_AddHandler: ; RDI - IRQ Number ; RSI - Callback + ; RDX - Ptr ; Check for RDI >= 16 cmp rdi, 16 @@ -153,8 +154,8 @@ IRQ_AddHandler: ; Find a free callback slot %rep NUM_IRQ_CALLBACKS - mov rdx, [rax] - test rdx, rdx + mov rcx, [rax] + test rcx, rcx jz .assign add rax, 8 %endrep @@ -170,6 +171,7 @@ IRQ_AddHandler: push rdi push rsi push rax + push rdx sub rsp, 8 mov rcx, rdi ; IRQ Number mov rdx, rsi ; Callback @@ -177,12 +179,15 @@ IRQ_AddHandler: mov rdi, csIRQ_Assigned call Log add rsp, 8 + pop rdx pop rax pop rsi pop rdi ; Assign and return mov [rax], rsi + add rax, gaIRQ_DataPtrs - gaIRQ_Handlers + mov [rax], rdx xor rax, rax .ret: @@ -191,6 +196,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 @@ -277,10 +284,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] @@ -294,6 +305,7 @@ IrqCommon: jz .skip.%[i] ; Set RDI to IRQ number mov rdi, [rsp+(16+2+1)*8] ; Get IRQ number + mov rsi, [rbx-gaIRQ_Handlers+gaIRQ_DataPtrs] call rax ; Call .skip.%[i]: add rbx, 8 ; Next! @@ -303,20 +315,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] @@ -371,6 +380,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] @@ -413,6 +423,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] @@ -425,3 +439,5 @@ gIDTPtr: gaIRQ_Handlers: times 16*NUM_IRQ_CALLBACKS dq 0 +gaIRQ_DataPtrs: + times 16*NUM_IRQ_CALLBACKS dq 0