X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fstart64.asm;h=b63b63ac13b50fbeb87e0cae79a2ed648b2b44f9;hb=6d5880d56afb2c6a900e480c891fb40e05457ea3;hp=d0cc503fc1cbf8a2760aa85b4aad65987667bab3;hpb=a1b7b0fcbf99e2c53dd6d7ee5961772bf29bdb2b;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/start64.asm b/Kernel/arch/x86_64/start64.asm index d0cc503f..b63b63ac 100644 --- a/Kernel/arch/x86_64/start64.asm +++ b/Kernel/arch/x86_64/start64.asm @@ -1,6 +1,7 @@ ; ; Acess2 x86_64 Port ; +%include "arch/x86_64/include/common.inc.asm" [bits 64] ;KERNEL_BASE equ 0xFFFF800000000000 KERNEL_BASE equ 0xFFFFFFFF80000000 @@ -35,7 +36,7 @@ start64: rep stosq ; Set kernel stack - mov rsp, gInitialKernelStack + mov rsp, 0xFFFFA00000000000 + INITIAL_KSTACK_SIZE*0x1000 ; Call main mov edi, [gMultibootMagic - KERNEL_BASE] @@ -47,11 +48,6 @@ start64: hlt jmp .hlt -[global GetRIP] -GetRIP: - mov rax, [rsp] - ret - [global GetCPUNum] GetCPUNum: xor rax, rax @@ -60,45 +56,35 @@ GetCPUNum: shr ax, 4 ; One 16-byte TSS per CPU ret -KSTACK_USERSTATE_SIZE equ (16+1+5)*8 ; 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 rax, 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 - - push 0x23 ; SS - push rcx ; RSP - push 0x202 ; RFLAGS (IF and Rsvd) - push 0x1B ; CS - push rbp ; RIP + ; Drop down to user mode + cli + mov rsp, rcx ; Set SP + mov rcx, rdi ; SYSRET IP - iret + 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 @@ -106,31 +92,55 @@ Proc_ReturnToUser: 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 + push r10 + push r11 + + mov [rbp+2*8], rdi ; Save Ptr to stack - mov rax, [rbp+2*8] + mov r11, rsi ; NArgs + mov r10, rdx ; Args + + ; 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 + +.call: + mov rax, [rbp+2*8] ; Ptr call rax + + pop r11 + pop r10 + lea rsp, [rbp] pop rbp ret -[section .usertext] -User_Syscall_RetAndExit: - mov rdi, rax - jmp User_Syscall_Exit -User_Syscall_Exit: - xor rax, rax - ; RDI: Return Value - int 0xAC - -[section .bss] -[global gInitialKernelStack] - resd 1024*4 ; 4 Pages -gInitialKernelStack: - +; vim: ft=nasm