x86_64 starts without erroring, reaches high mem and full 64-bit
[tpg/acess2.git] / Kernel / arch / x86_64 / start64.asm
index 30fc971..699c793 100644 (file)
@@ -6,9 +6,32 @@
 [section .text]
 [global start64]
 start64:
+       ; Load Registers
+       mov ax, 0x10
+       mov ds, ax
+       mov es, ax
+       mov fs, ax
+       mov gs, ax
+       
+       ; Go to high memory
+       mov rax, start64.himem
+       jmp rax
+.himem:
+       
+       ; Clear the screen
+       mov rax, 0x1F201F201F201F20     ; Set the screen to White on blue, space (4 characters)
+       mov edi, 0xB8000
+       mov ecx, 80*25*2/8
+       rep stosq
+       
        ; Set kernel stack
+       mov rsp, gInitialKernelStack
+       
        ; Call main
-       jmp $
+       cli
+.hlt:
+       hlt
+       jmp .hlt
 
 [global GetRIP]
 GetRIP:
@@ -63,6 +86,26 @@ Proc_ReturnToUser:
        
        iret
 
+; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
+; Call a function passing the array as arguments
+[global CallWithArgArray]
+CallWithArgArray:
+       push rbp
+       mov rbp, rsp
+       mov rcx, [rbp+3*8]      ; Get NArgs
+       mov rdx, [rbp+4*8]
+
+.top:
+       mov rax, [rdx+rcx*8-8]
+       push rax
+       loop .top
+       
+       mov rax, [rbp+2*8]
+       call rax
+       lea rsp, [rbp]
+       pop rbp
+       ret
+
 [section .usertext]
 User_Syscall_RetAndExit:
        mov rdi, rax

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