; Acess2 x86_64 Port
;
[bits 64]
+KERNEL_BASE equ 0xFFFF800000000000
+
+[extern kmain]
+
+[extern gMultibootPtr]
+[extern gMultibootMagic]
[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 $
+ mov edi, [gMultibootMagic - KERNEL_BASE]
+ mov esi, [gMultibootPtr - KERNEL_BASE]
+ call kmain
+
+ cli
+.hlt:
+ hlt
+ jmp .hlt
[global GetRIP]
GetRIP:
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
[section .bss]
[global gInitialKernelStack]
- resd 1024*1 ; 1 Page
+ resd 1024*4 ; 4 Pages
gInitialKernelStack: