Kernel/arm7 - Fiddling, still having issues with VMM
[tpg/acess2.git] / Kernel / arch / x86_64 / start64.asm
1 ;
2 ; Acess2 x86_64 Port
3 ;
4 [bits 64]
5 ;KERNEL_BASE    equ     0xFFFF800000000000
6 KERNEL_BASE     equ     0xFFFFFFFF80000000
7
8 [extern kmain]
9
10 [extern gMultibootPtr]
11 [extern gMultibootMagic]
12
13 [section .text]
14 [global start64]
15 start64:
16         ; Load Registers
17         mov ax, 0x10
18         mov ds, ax
19         mov es, ax
20         mov fs, ax
21         mov gs, ax
22         
23         ; Go to high memory
24         mov rax, start64.himem
25         jmp rax
26 .himem:
27         
28         xor rax, rax
29         mov dr0, rax    ; Set CPU0
30         
31         ; Clear the screen
32         mov rax, 0x1F201F201F201F20     ; Set the screen to White on blue, space (4 characters)
33         mov edi, 0xB8000
34         mov ecx, 80*25*2/8
35         rep stosq
36         
37         ; Set kernel stack
38         mov rsp, gInitialKernelStack
39         
40         ; Call main
41         mov edi, [gMultibootMagic - KERNEL_BASE]
42         mov esi, [gMultibootPtr - KERNEL_BASE]
43         call kmain
44         
45         cli
46 .hlt:
47         hlt
48         jmp .hlt
49
50 [global GetRIP]
51 GetRIP:
52         mov rax, [rsp]
53         ret
54
55 [global GetCPUNum]
56 GetCPUNum:
57         xor rax, rax
58         str ax
59         sub ax, 0x38    ; TSS Base
60         shr ax, 4       ; One 16-byte TSS per CPU
61         ret
62
63 KSTACK_USERSTATE_SIZE   equ     (16+1+5)*8      ; GPRegs, CPU, IRET
64 [global Proc_ReturnToUser]
65 [extern Proc_GetCurThread]
66 Proc_ReturnToUser:
67         ; RBP is the handler to use
68         
69         call Proc_GetCurThread
70         
71         ; EAX is the current thread
72         mov rbx, rax
73         mov rax, [rbx+40]       ; Get Kernel Stack
74         sub rax, KSTACK_USERSTATE_SIZE
75         
76         ;
77         ; NOTE: This can cause corruption if the signal happens while the user
78         ;       has called a kernel operation.
79         ; Good thing this can only be called on a user fault.
80         ;
81         
82         ; Get and alter User SP
83         mov rcx, [rax+KSTACK_USERSTATE_SIZE-3*8]
84         mov rdx, [rbx+60]       ; Get Signal Number
85         mov [rcx-8], rdx
86         mov rax, User_Syscall_RetAndExit
87         mov [rcx-16], rax
88         sub rcx, 16
89         
90         ; Restore Segment Registers
91         mov ax, 0x23
92         mov ds, ax
93         mov es, ax
94         
95         push 0x23       ; SS
96         push rcx        ; RSP
97         push 0x202      ; RFLAGS (IF and Rsvd)
98         push 0x1B       ; CS
99         push rbp        ; RIP
100         
101         iret
102
103 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
104 ; Call a function passing the array as arguments
105 [global CallWithArgArray]
106 CallWithArgArray:
107         push rbp
108         mov rbp, rsp
109         push r10
110         push r11
111         
112         mov [rbp+2*8], rdi      ; Save Ptr to stack
113         
114         mov r11, rsi    ; NArgs
115         mov r10, rdx    ; Args
116
117         ; Arg 1: RDI
118         mov rdi, [r10]
119         add r10, 8
120         dec r11
121         jz .call
122         ; Arg 2: RSI
123         mov rsi, [r10]
124         add r10, 8
125         dec r11
126         jz .call
127         ; Arg 3: RDX
128         mov rdx, [r10]
129         add r10, 8
130         dec r11
131         jz .call
132         ; Arg 4: RCX
133         mov rcx, [r10]
134         add r10, 8
135         dec r11
136         jz .call
137         ; Arg 5: R8
138         mov r8, [r10]
139         add r10, 8
140         dec r11
141         jz .call
142         ; Arg 6: R9
143         mov r9, [r10]
144         add r10, 8
145         dec r11
146         jz .call
147         ; No support for more
148
149 .call:
150         mov rax, [rbp+2*8]      ; Ptr
151         call rax
152         
153         pop r11
154         pop r10
155         
156         lea rsp, [rbp]
157         pop rbp
158         ret
159
160 [section .usertext]
161 User_Syscall_RetAndExit:
162         mov rdi, rax
163         jmp User_Syscall_Exit
164 User_Syscall_Exit:
165         xor rax, rax
166         ; RDI: Return Value
167         int 0xAC
168
169 [section .bss]
170 [global gInitialKernelStack]
171         resd    1024*4  ; 4 Pages
172 gInitialKernelStack:
173

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