git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Kernel/arm7 - Fiddling, still having issues with VMM
[tpg/acess2.git]
/
Kernel
/
arch
/
x86_64
/
desctab.asm
diff --git
a/Kernel/arch/x86_64/desctab.asm
b/Kernel/arch/x86_64/desctab.asm
index
c575dd6
..
8212773
100644
(file)
--- 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
; RDI - IRQ Number
; RSI - Callback
+ ; Check for RDI >= 16
cmp rdi, 16
jb .numOK
xor rax, rax
cmp rdi, 16
jb .numOK
xor rax, rax
@@
-161,10
+162,10
@@
IRQ_AddHandler:
jmp .ret
.numOK:
jmp .ret
.numOK:
- mov rax, rdi
- shr rax, 3+2
+ ; Get handler base into RAX
+ lea rax, [rdi*4]
mov rcx, gaIRQ_Handlers
mov rcx, gaIRQ_Handlers
- add rax, rcx
+ lea rax, [rcx+rax*8]
; Find a free callback slot
%rep NUM_IRQ_CALLBACKS
; Find a free callback slot
%rep NUM_IRQ_CALLBACKS
@@
-196,6
+197,7
@@
IRQ_AddHandler:
pop rsi
pop rdi
pop rsi
pop rdi
+ ; Assign and return
mov [rax], rsi
xor rax, rax
mov [rax], rsi
xor rax, rax
@@
-289,13
+291,17
@@
DEFIRQ i
[global IrqCommon]
IrqCommon:
PUSH_GPR
[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
mov rax, gaIRQ_Handlers
- add rbx, rax
+ lea rbx, [rax+rbx*8]
; Check all callbacks
; Check all callbacks
+ sub rsp, 8 ; Shadow of argument
%assign i 0
%rep NUM_IRQ_CALLBACKS
; Get callback address
%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
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
call rax ; Call
.skip.%[i]:
add rbx, 8 ; Next!
%assign i i+1
%endrep
+ add rsp, 8
; ACK
; ACK
+ mov al, 0x20
mov rdi, [rsp+16*8] ; Get IRQ number
cmp rdi, 8
mov rdi, [rsp+16*8] ; Get IRQ number
cmp rdi, 8
- mov al, 0x20
jb .skipAckSecondary
mov dx, 0x00A0
out dx, al
jb .skipAckSecondary
mov dx, 0x00A0
out dx, al
@@
-321,6
+328,8
@@
IrqCommon:
mov dx, 0x0020
out dx, al
mov dx, 0x0020
out dx, al
+ pop fs
+ pop gs
POP_GPR
add rsp, 8*2
;xchg bx, bx
POP_GPR
add rsp, 8*2
;xchg bx, bx
@@
-328,8
+337,15
@@
IrqCommon:
[extern Proc_Scheduler]
[global SchedulerIRQ]
[extern Proc_Scheduler]
[global SchedulerIRQ]
+;
+; NOTE: Proc_Scheduler makes assumptions about the stack state when called
+;
SchedulerIRQ:
SchedulerIRQ:
+ push 0 ; Error code
+ push 0 ; IRQNum
PUSH_GPR
PUSH_GPR
+ push gs
+ push fs
;PUSH_FPU
;PUSH_XMM
;PUSH_FPU
;PUSH_XMM
@@
-365,7
+381,10
@@
SchedulerIRQ:
;POP_XMM
;POP_FPU
;POP_XMM
;POP_FPU
+ pop fs
+ pop gs
POP_GPR
POP_GPR
+ add rsp, 2*8 ; Dummy error code and IRQ num
iretq
[section .data]
iretq
[section .data]
UCC
git Repository :: git.ucc.asn.au