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/x86_64 - Debugging iret->CPL3 crash
[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
411cea3
..
739b219
100644
(file)
--- a/
Kernel/arch/x86_64/desctab.asm
+++ b/
Kernel/arch/x86_64/desctab.asm
@@
-1,6
+1,7
@@
;
;
;
;
;
;
+%include "arch/x86_64/include/common.inc.asm"
[BITS 64]
[extern Log]
[BITS 64]
[extern Log]
@@
-11,45
+12,6
@@
MM_LOCALAPIC equ 0xFFFFFD0000000000
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:
[section .text]
[global Desctab_Init]
Desctab_Init:
@@
-229,6
+191,8
@@
IRQ_AddHandler:
[section .rodata]
csIRQ_Assigned:
db "IRQ %p := %p (IRQ %i)",0
[section .rodata]
csIRQ_Assigned:
db "IRQ %p := %p (IRQ %i)",0
+csIRQ_Fired:
+ db "IRQ %i fired",0
[section .text]
%macro ISR_NOERRNO 1
[section .text]
%macro ISR_NOERRNO 1
@@
-315,10
+279,14
@@
IrqCommon:
PUSH_GPR
push gs
push fs
PUSH_GPR
push gs
push fs
+
+; mov rdi, csIRQ_Fired
+; mov rsi, [rsp+(16+2)*8]
+; call Log
- mov
r
bx, [rsp+(16+2)*8] ; Get interrupt number (16 GPRS + 2 SRs)
+ mov
e
bx, [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)
; 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]
mov rax, gaIRQ_Handlers
lea rbx, [rax+rbx*8]
@@
-341,20
+309,17
@@
IrqCommon:
; ACK
mov al, 0x20
; 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
cmp rdi, 8
jb .skipAckSecondary
- mov dx, 0x00A0
- out dx, al
+ out 0xA0, al
.skipAckSecondary:
.skipAckSecondary:
- mov dx, 0x0020
- out dx, al
+ out 0x20, al
pop fs
pop gs
POP_GPR
add rsp, 8*2
pop fs
pop gs
POP_GPR
add rsp, 8*2
- ;xchg bx, bx
iretq
[extern Proc_Scheduler]
iretq
[extern Proc_Scheduler]
@@
-375,10
+340,12
@@
SchedulerIRQ:
mov rax, dr0
push rax
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
; Call the Scheduler
call Proc_Scheduler
+.restoreState:
; Restore Thread Pointer
pop rax
; Restore Thread Pointer
pop rax
@@
-407,6
+374,7
@@
SchedulerIRQ:
pop gs
POP_GPR
add rsp, 2*8 ; Dummy error code and IRQ num
pop gs
POP_GPR
add rsp, 2*8 ; Dummy error code and IRQ num
+; xchg bx, bx
iretq
[extern ci_offsetof_tThread_KernelStack]
iretq
[extern ci_offsetof_tThread_KernelStack]
@@
-449,6
+417,10
@@
SyscallStub:
pop r11
pop rcx
pop rsp ; Change back to user stack
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]
sysret
[section .data]
UCC
git Repository :: git.ucc.asn.au