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
816d14e
..
8212773
100644
(file)
--- a/
Kernel/arch/x86_64/desctab.asm
+++ b/
Kernel/arch/x86_64/desctab.asm
@@
-4,6
+4,8
@@
[BITS 64]
[extern Log]
[BITS 64]
[extern Log]
+[extern gGDTPtr]
+[extern gGDT]
%define NUM_IRQ_CALLBACKS 4
%define NUM_IRQ_CALLBACKS 4
@@
-57,15
+59,15
@@
Desctab_Init:
; Set an IDT entry to a callback
%macro SETIDT 2
mov rax, %2
; Set an IDT entry to a callback
%macro SETIDT 2
mov rax, %2
- mov
WORD [rdi + %1*16], ax
+ mov WORD [rdi + %1*16], ax
shr rax, 16
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
; Enable
shr rax, 16
mov DWORD [rdi + %1*16 + 8], eax
; Enable
- mov
ax, WORD [rdi + %1*16 + 4]
- or ax, 0x8000
- mov
WORD [rdi + %1*16 + 4], ax
+ mov ax, WORD [rdi + %1*16 + 4]
+ or
ax, 0x8000
+ mov WORD [rdi + %1*16 + 4], ax
%endmacro
; Install error handlers
%endmacro
; Install error handlers
@@
-102,27
+104,27
@@
Desctab_Init:
mov dx, 0x20
mov al, 0x11
out dx, al ; Init Command
mov dx, 0x20
mov al, 0x11
out dx, al ; Init Command
- mov dx, 0x21
+
mov dx, 0x21
mov al, 0xF0
out dx, al ; Offset (Start of IDT Range)
mov al, 0xF0
out dx, al ; Offset (Start of IDT Range)
- mov al, 0x04
+
mov al, 0x04
out dx, al ; IRQ connected to Slave (00000100b) = IRQ2
out dx, al ; IRQ connected to Slave (00000100b) = IRQ2
- mov al, 0x01
+
mov al, 0x01
out dx, al ; Set Mode
out dx, al ; Set Mode
- mov al, 0x00
+
mov al, 0x00
out dx, al ; Set Mode
mov dx, 0xA0
mov al, 0x11
out dx, al ; Init Command
out dx, al ; Set Mode
mov dx, 0xA0
mov al, 0x11
out dx, al ; Init Command
- mov dx, 0xA1
+
mov dx, 0xA1
mov al, 0xF8
out dx, al ; Offset (Start of IDT Range)
mov al, 0xF8
out dx, al ; Offset (Start of IDT Range)
- mov al, 0x02
+
mov al, 0x02
out dx, al ; IRQ Line connected to master
out dx, al ; IRQ Line connected to master
- mov al, 0x01
+
mov al, 0x01
out dx, al ; Set Mode
out dx, al ; Set Mode
- mov dl, 0x00
+
mov dl, 0x00
out dx, al ; Set Mode
pop rdx
out dx, al ; Set Mode
pop rdx
@@
-131,6
+133,12
@@
Desctab_Init:
mov rax, gIDTPtr
lidt [rax]
mov rax, gIDTPtr
lidt [rax]
+ ; Re-install GDT (in higher address space)
+ mov rax, gGDTPtr
+ mov rcx, gGDT
+ mov QWORD [rax+2], rcx
+ lgdt [rax]
+
; Start interrupts
sti
; Start interrupts
sti
@@
-146,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
@@
-153,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
@@
-188,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
@@
-281,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
@@
-295,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
@@
-313,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
@@
-320,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
@@
-357,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