VM8086 stub for x86_64 build
[tpg/acess2.git] / Kernel / arch / x86_64 / desctab.asm
1 ;
2 ;
3 ;
4 [BITS 64]
5
6 %define NUM_IRQ_CALLBACKS       4
7
8 MM_LOCALAPIC    equ     0xFFFFFD0000000000
9
10 %macro PUSH_GPR 0
11         mov [rsp-0x60], rsp
12         mov [rsp-0x08], r15
13         mov [rsp-0x10], r14
14         mov [rsp-0x18], r13
15         mov [rsp-0x20], r12
16         mov [rsp-0x28], r11
17         mov [rsp-0x30], r10
18         mov [rsp-0x38], r9
19         mov [rsp-0x40], r8
20         mov [rsp-0x48], rdi
21         mov [rsp-0x50], rsi
22         mov [rsp-0x58], rbp
23         mov [rsp-0x68], rbx
24         mov [rsp-0x70], rdx
25         mov [rsp-0x78], rcx
26         mov [rsp-0x80], rax
27         sub rsp, 0x80
28 %endmacro
29 %macro POP_GPR  0
30         add rsp, 0x80
31         mov r15, [rsp-0x08]
32         mov r14, [rsp-0x10]
33         mov r13, [rsp-0x18]
34         mov r12, [rsp-0x20]
35         mov r11, [rsp-0x28]
36         mov r10, [rsp-0x30]
37         mov r9,  [rsp-0x38]
38         mov r8,  [rsp-0x40]
39         mov rdi, [rsp-0x48]
40         mov rsi, [rsp-0x50]
41         mov rbp, [rsp-0x58]
42         ;mov rsp, [rsp-0x60]
43         mov rbx, [rsp-0x68]
44         mov rdx, [rsp-0x70]
45         mov rcx, [rsp-0x78]
46         mov rax, [rsp-0x80]
47 %endmacro
48
49 [section .text]
50 Desctab_Init:
51         ; Install IRQ Handlers
52         ret
53
54 ; int IRQ_AddHandler(int IRQ, void (*Handler)(int IRQ))
55 ; Return Values:
56 ;  0 on Success
57 ; -1 on an invalid IRQ Number
58 ; -2 when no slots are avaliable
59 [global IRQ_AddHandler]
60 IRQ_AddHandler:
61         ; RDI - IRQ Number
62         ; RSI - Callback
63         
64         cmp rdi, 16
65         jb .numOK
66         xor rax, rax
67         dec rax
68         jmp .ret
69 .numOK:
70
71         mov rax, rdi
72         shr rax, 3+2
73         mov rcx, gaIRQ_Handlers
74         add rax, rcx
75         
76         ; Find a free callback slot
77         %rep NUM_IRQ_CALLBACKS
78         mov rdx, [rax]
79         test rdx, rdx
80         jz .assign
81         add rax, 8
82         %endrep
83         ; None found, return -2
84         xor rax, rax
85         dec rax
86         dec rax
87         jmp .ret
88         
89         ; Assign the IRQ Callback
90 .assign:
91         mov [rax], rsi
92         xor rax, rax
93
94 .ret:
95         ret
96
97 %macro DEFERR   1
98 Isr%1:
99         push    0
100         push    %1
101         jmp     ErrorCommon
102 %endmacro
103 %macro DEFERRNO 1
104 Isr%1:
105         push    %1
106         jmp     ErrorCommon
107 %endmacro
108
109 %macro DEFIRQ   1
110 Irq%1:
111         push    0
112         push    %1
113         jmp     IrqCommon
114 %endmacro
115
116 IrqCommon:
117         PUSH_GPR
118         
119         mov rbx, [rsp+16*8]     ; Calculate address
120         shr rbx, 3+2    ; *8*4
121         mov rax, gaIRQ_Handlers
122         add rbx, rax
123         
124         %assign i 0
125         %rep NUM_IRQ_CALLBACKS
126         mov rax, [rbx]
127         test rax, rax
128         mov rdi, [rsp+16*8]     ; Get IRQ number
129         jz .skip.%[i]
130         call rax        ; 2 Bytes (Op and Mod/RM)
131 .skip.%[i]:
132         add rbx, 8
133         %assign i i+1
134         %endrep
135         
136         mov rdi, [rsp+16*8]     ; Get IRQ number
137         cmp rdi, 8
138         mov al, 0x20
139         jb .skipAckSecondary
140         mov dx, 0x00A0
141         out dx, al
142 .skipAckSecondary:
143         mov dx, 0x0020
144         out dx, al
145         
146         POP_GPR
147         add rsp, 16
148         iret
149
150 [extern Proc_Scheduler]
151 SchedulerIRQ:
152         ; TODO: Find Current CPU
153         PUSH_GPR
154         ;PUSH_FPU
155         ;PUSH_XMM
156         
157         xor rsi, rsi
158         mov rdi, MM_LOCALAPIC+0x20
159         mov esi, [rdi]
160         call Proc_Scheduler
161         
162         ;POP_XMM
163         ;POP_FPU
164         POP_GPR
165         iret
166
167 [section .data]
168 gIDT:
169         times 256       dw      0x00080000, 0x00008E00, 0, 0    ; 64-bit Interrupt Gate, CS = 0x8, IST0
170
171 gaIRQ_Handlers:
172         times   16*NUM_IRQ_CALLBACKS    dq      0

UCC git Repository :: git.ucc.asn.au