c8e7f9a875addf2a5ab34c03ba021d61d9f00a0c
[tpg/acess2.git] / Kernel / arch / x86_64 / start64.asm
1 ;
2 ; Acess2 x86_64 Port
3 ;
4 %include "arch/x86_64/include/common.inc.asm"
5 [bits 64]
6 ;KERNEL_BASE    equ     0xFFFF800000000000
7 KERNEL_BASE     equ     0xFFFFFFFF80000000
8
9 [extern kmain]
10
11 [extern gMultibootPtr]
12 [extern gMultibootMagic]
13
14 [section .text]
15 [global start64]
16 start64:
17         ; Load Registers
18         mov ax, 0x10
19         mov ds, ax
20         mov es, ax
21         mov fs, ax
22         mov gs, ax
23         
24         ; Go to high memory
25         mov rax, start64.himem
26         jmp rax
27 .himem:
28         
29         xor rax, rax
30         mov dr0, rax    ; Set CPU0
31         
32         ; Clear the screen
33         mov rax, 0x1F201F201F201F20     ; Set the screen to White on blue, space (4 characters)
34         mov edi, 0xB8000
35         mov ecx, 80*25*2/8
36         rep stosq
37         
38         ; Set kernel stack
39         mov rsp, 0xFFFFA00000000000 + INITIAL_KSTACK_SIZE*0x1000
40         
41         ; Call main
42         mov edi, [gMultibootMagic - KERNEL_BASE]
43         mov esi, [gMultibootPtr - KERNEL_BASE]
44         call kmain
45         
46         cli
47 .hlt:
48         hlt
49         jmp .hlt
50
51 [global GetCPUNum]
52 GetCPUNum:
53         mov rax, dr1
54         ret
55
56 KSTACK_USERSTATE_SIZE   equ     (5+2+16+2)*8    ; IRET, ErrorNum, ErrorCode, GPRs, FS&GS
57 [global Proc_ReturnToUser]
58 Proc_ReturnToUser:
59         ; RDI - Handler
60         ; RSI - Kernel Stack
61         ; RDX - Signal num
62         
63         ;
64         ; NOTE: This can cause corruption if the signal happens while the user
65         ;       has called a kernel operation.
66         ; Good thing this can only be called on a user fault.
67         ;
68
69         xchg bx, bx     
70         ; Get and alter User SP
71         mov rcx, [rsi-0x20]     ; Get user SP
72         xor eax, eax
73         mov [rcx-16], rax
74         sub rcx, 16
75         
76         ; Drop down to user mode
77         cli
78         mov rsp, rcx    ; Set SP
79         mov rcx, rdi    ; SYSRET IP
80         
81         mov rdi, rdx    ; Argument for handler
82         mov r11, 0x202  ; RFlags
83         db 0x48
84         sysret
85
86 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
87 ; Call a function passing the array as arguments
88 [global CallWithArgArray]
89 CallWithArgArray:
90         push rbp
91         mov rbp, rsp
92         push r10
93         push r11
94         
95         mov [rbp+2*8], rdi      ; Save Ptr to stack
96         
97         mov r11, rsi    ; NArgs
98         mov r10, rdx    ; Args
99
100         ; Arg 1: RDI
101         mov rdi, [r10]
102         add r10, 8
103         dec r11
104         jz .call
105         ; Arg 2: RSI
106         mov rsi, [r10]
107         add r10, 8
108         dec r11
109         jz .call
110         ; Arg 3: RDX
111         mov rdx, [r10]
112         add r10, 8
113         dec r11
114         jz .call
115         ; Arg 4: RCX
116         mov rcx, [r10]
117         add r10, 8
118         dec r11
119         jz .call
120         ; Arg 5: R8
121         mov r8, [r10]
122         add r10, 8
123         dec r11
124         jz .call
125         ; Arg 6: R9
126         mov r9, [r10]
127         add r10, 8
128         dec r11
129         jz .call
130         ; No support for more
131
132 .call:
133         mov rax, [rbp+2*8]      ; Ptr
134         call rax
135         
136         pop r11
137         pop r10
138         
139         lea rsp, [rbp]
140         pop rbp
141         ret
142
143 ; vim: ft=nasm

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