;
; Acess2 x86_64 Port
;
+%include "arch/x86_64/include/common.inc.asm"
[bits 64]
+;KERNEL_BASE equ 0xFFFF800000000000
+KERNEL_BASE equ 0xFFFFFFFF80000000
+
+[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:
+
+ xor rax, rax
+ mov dr0, rax ; Set CPU0
+
+ ; 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, 0xFFFFA00000000000 + INITIAL_KSTACK_SIZE*0x1000
+
; Call main
- jmp $
+ mov edi, [gMultibootMagic - KERNEL_BASE]
+ mov esi, [gMultibootPtr - KERNEL_BASE]
+ call kmain
+
+ cli
+.hlt:
+ hlt
+ jmp .hlt
-[global GetRIP]
-GetRIP:
- mov rax, [rsp]
+[global GetCPUNum]
+GetCPUNum:
+ xor rax, rax
+ str ax
+ sub ax, 0x38 ; TSS Base
+ shr ax, 4 ; One 16-byte TSS per CPU
ret
-KSTACK_USERSTATE_SIZE equ (4+8+1+5)*4 ; SRegs, GPRegs, CPU, IRET
+KSTACK_USERSTATE_SIZE equ (5+2+16+2)*8 ; IRET, ErrorNum, ErrorCode, GPRs, FS&GS
[global Proc_ReturnToUser]
-[extern Proc_GetCurThread]
Proc_ReturnToUser:
- ; RBP is the handler to use
-
- call Proc_GetCurThread
-
- ; EAX is the current thread
- mov rbx, rax
- mov rax, [rbx+40] ; Get Kernel Stack
- sub rax, KSTACK_USERSTATE_SIZE
+ ; RDI - Handler
+ ; RSI - Kernel Stack
+ ; RDX - Signal num
;
; NOTE: This can cause corruption if the signal happens while the user
; has called a kernel operation.
; Good thing this can only be called on a user fault.
;
-
+
+ xchg bx, bx
; Get and alter User SP
- mov rcx, [rax+KSTACK_USERSTATE_SIZE-3*8]
- mov rdx, [rbx+60] ; Get Signal Number
- mov [rcx-8], rdx
- mov QWORD [rcx-16], User_Syscall_RetAndExit
+ mov rcx, [rsi-0x20] ; Get user SP
+ xor eax, eax
+ mov [rcx-16], rax
sub rcx, 16
- ; Restore Segment Registers
- mov ax, 0x23
- mov ds, ax
- mov es, ax
+ ; Drop down to user mode
+ cli
+ mov rsp, rcx ; Set SP
+ mov rcx, rdi ; SYSRET IP
- push 0x23 ; SS
- push rcx ; RSP
- push 0x202 ; RFLAGS (IF and Rsvd)
- push 0x1B ; CS
- push rbp ; RIP
+ mov rdi, rdx ; Argument for handler
+ mov r11, 0x202 ; RFlags
+ db 0x48
+ sysret
+
+; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
+; Call a function passing the array as arguments
+[global CallWithArgArray]
+CallWithArgArray:
+ push rbp
+ mov rbp, rsp
+ push r10
+ push r11
+
+ mov [rbp+2*8], rdi ; Save Ptr to stack
- iret
+ mov r11, rsi ; NArgs
+ mov r10, rdx ; Args
-[section .usertext]
-User_Syscall_RetAndExit:
- mov rdi, rax
- jmp User_Syscall_Exit
-User_Syscall_Exit:
- xor rax, rax
- ; RDI: Return Value
- int 0xAC
+ ; Arg 1: RDI
+ mov rdi, [r10]
+ add r10, 8
+ dec r11
+ jz .call
+ ; Arg 2: RSI
+ mov rsi, [r10]
+ add r10, 8
+ dec r11
+ jz .call
+ ; Arg 3: RDX
+ mov rdx, [r10]
+ add r10, 8
+ dec r11
+ jz .call
+ ; Arg 4: RCX
+ mov rcx, [r10]
+ add r10, 8
+ dec r11
+ jz .call
+ ; Arg 5: R8
+ mov r8, [r10]
+ add r10, 8
+ dec r11
+ jz .call
+ ; Arg 6: R9
+ mov r9, [r10]
+ add r10, 8
+ dec r11
+ jz .call
+ ; No support for more
-[section .bss]
-[global gInitialKernelStack]
- resd 1024*1 ; 1 Page
-gInitialKernelStack:
+.call:
+ mov rax, [rbp+2*8] ; Ptr
+ call rax
+
+ pop r11
+ pop r10
+
+ lea rsp, [rbp]
+ pop rbp
+ ret
+; vim: ft=nasm