Kernel/arm7 - Fiddling with PCI etc
[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, 0xFFFFA00000000000 + 0x10000
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 GetCPUNum]
51 GetCPUNum:
52         xor rax, rax
53         str ax
54         sub ax, 0x38    ; TSS Base
55         shr ax, 4       ; One 16-byte TSS per CPU
56         ret
57
58 KSTACK_USERSTATE_SIZE   equ     (16+1+5)*8      ; GPRegs, CPU, IRET
59 [global Proc_ReturnToUser]
60 [extern Proc_GetCurThread]
61 Proc_ReturnToUser:
62         ; RBP is the handler to use
63         
64         call Proc_GetCurThread
65         
66         ; EAX is the current thread
67         mov rbx, rax
68         mov rax, [rbx+40]       ; Get Kernel Stack
69         sub rax, KSTACK_USERSTATE_SIZE
70         
71         ;
72         ; NOTE: This can cause corruption if the signal happens while the user
73         ;       has called a kernel operation.
74         ; Good thing this can only be called on a user fault.
75         ;
76         
77         ; Get and alter User SP
78         mov rcx, [rax+KSTACK_USERSTATE_SIZE-3*8]
79         mov rdx, [rbx+60]       ; Get Signal Number
80         mov [rcx-8], rdx
81         mov rax, User_Syscall_RetAndExit
82         mov [rcx-16], rax
83         sub rcx, 16
84         
85         ; Restore Segment Registers
86         mov ax, 0x23
87         mov ds, ax
88         mov es, ax
89         
90         push 0x23       ; SS
91         push rcx        ; RSP
92         push 0x202      ; RFLAGS (IF and Rsvd)
93         push 0x1B       ; CS
94         push rbp        ; RIP
95         
96         iret
97
98 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
99 ; Call a function passing the array as arguments
100 [global CallWithArgArray]
101 CallWithArgArray:
102         push rbp
103         mov rbp, rsp
104         push r10
105         push r11
106         
107         mov [rbp+2*8], rdi      ; Save Ptr to stack
108         
109         mov r11, rsi    ; NArgs
110         mov r10, rdx    ; Args
111
112         ; Arg 1: RDI
113         mov rdi, [r10]
114         add r10, 8
115         dec r11
116         jz .call
117         ; Arg 2: RSI
118         mov rsi, [r10]
119         add r10, 8
120         dec r11
121         jz .call
122         ; Arg 3: RDX
123         mov rdx, [r10]
124         add r10, 8
125         dec r11
126         jz .call
127         ; Arg 4: RCX
128         mov rcx, [r10]
129         add r10, 8
130         dec r11
131         jz .call
132         ; Arg 5: R8
133         mov r8, [r10]
134         add r10, 8
135         dec r11
136         jz .call
137         ; Arg 6: R9
138         mov r9, [r10]
139         add r10, 8
140         dec r11
141         jz .call
142         ; No support for more
143
144 .call:
145         mov rax, [rbp+2*8]      ; Ptr
146         call rax
147         
148         pop r11
149         pop r10
150         
151         lea rsp, [rbp]
152         pop rbp
153         ret
154
155 [section .usertext]
156 User_Syscall_RetAndExit:
157         mov rdi, rax
158         jmp User_Syscall_Exit
159 User_Syscall_Exit:
160         xor rax, rax
161         ; RDI: Return Value
162         int 0xAC
163

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