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/armv7 - Fixed lack of in*/out* functions
[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
50fc126
..
27ba913
100644
(file)
--- a/
Kernel/arch/x86_64/desctab.asm
+++ b/
Kernel/arch/x86_64/desctab.asm
@@
-128,7
+128,7
@@
Desctab_Init:
ret
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
; Return Values:
; 0 on Success
; -1 on an invalid IRQ Number
@@
-137,6
+137,7
@@
Desctab_Init:
IRQ_AddHandler:
; RDI - IRQ Number
; RSI - Callback
IRQ_AddHandler:
; RDI - IRQ Number
; RSI - Callback
+ ; RDX - Ptr
; Check for RDI >= 16
cmp rdi, 16
; Check for RDI >= 16
cmp rdi, 16
@@
-153,8
+154,8
@@
IRQ_AddHandler:
; Find a free callback slot
%rep NUM_IRQ_CALLBACKS
; Find a free callback slot
%rep NUM_IRQ_CALLBACKS
- mov r
d
x, [rax]
- test r
dx, rd
x
+ mov r
c
x, [rax]
+ test r
cx, rc
x
jz .assign
add rax, 8
%endrep
jz .assign
add rax, 8
%endrep
@@
-170,6
+171,7
@@
IRQ_AddHandler:
push rdi
push rsi
push rax
push rdi
push rsi
push rax
+ push rdx
sub rsp, 8
mov rcx, rdi ; IRQ Number
mov rdx, rsi ; Callback
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
mov rdi, csIRQ_Assigned
call Log
add rsp, 8
+ pop rdx
pop rax
pop rsi
pop rdi
; Assign and return
mov [rax], rsi
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:
xor rax, rax
.ret:
@@
-191,6
+196,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
@@
-277,10
+284,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]
@@
-294,6
+305,7
@@
IrqCommon:
jz .skip.%[i]
; Set RDI to IRQ number
mov rdi, [rsp+(16+2+1)*8] ; Get IRQ number
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!
call rax ; Call
.skip.%[i]:
add rbx, 8 ; Next!
@@
-303,20
+315,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]
@@
-371,6
+380,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]
@@
-413,6
+423,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]
@@
-425,3
+439,5
@@
gIDTPtr:
gaIRQ_Handlers:
times 16*NUM_IRQ_CALLBACKS dq 0
gaIRQ_Handlers:
times 16*NUM_IRQ_CALLBACKS dq 0
+gaIRQ_DataPtrs:
+ times 16*NUM_IRQ_CALLBACKS dq 0
UCC
git Repository :: git.ucc.asn.au