X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fproc.asm;h=732d35fce2b3234a757f67287a27b5f336982d15;hb=4d04d710e6d90ac28524925859a7ef621c675bcb;hp=9dc7f08a5b4de7e723a9a197963df89d0e905c99;hpb=2d83a99f3202f0e4688b58405f67604a24420861;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/proc.asm b/Kernel/arch/x86/proc.asm index 9dc7f08a..732d35fc 100644 --- a/Kernel/arch/x86/proc.asm +++ b/Kernel/arch/x86/proc.asm @@ -150,19 +150,22 @@ SpawnTask: .parent: ret -; +; void Proc_ReturnToUser(void *Method, Uint Parameter) ; Calls a user fault handler ; [global Proc_ReturnToUser] [extern Proc_GetCurThread] Proc_ReturnToUser: - ; EBP is the handler to use + push ebp + mov ebp, esp + ; [EBP+4]: handler to use + ; [EBP+8]: parameter call Proc_GetCurThread ; EAX is the current thread mov ebx, eax - mov eax, [ebx+40] ; Get Kernel Stack + mov eax, [ebx+12*4] ; Get Kernel Stack sub eax, KSTACK_USERSTATE_SIZE ; @@ -204,10 +207,10 @@ Proc_ReturnToUser: jnz .justKillIt ; Get and alter User SP - mov ecx, edx - mov edx, [ebx+60] ; Get Signal Number from TCB - mov [ecx+4], edx ; Parameter (Signal/Error Number) - mov [ecx], DWORD User_Syscall_RetAndExit ; Return Address + mov edi, edx + mov edx, [ebp+8] ; Get parameter + mov [edi+4], edx ; save to user stack + mov [edi], DWORD User_Syscall_RetAndExit ; Return Address ; Restore Segment Registers mov ax, 0x23 @@ -217,10 +220,11 @@ Proc_ReturnToUser: mov gs, ax push 0x23 ; SS - push ecx ; ESP + push edi ; ESP push 0x202 ; EFLAGS (IP and Rsvd) push 0x1B ; CS - push ebp ; EIP + mov eax, [ebp+4] ; Method to call + push eax ; EIP iret @@ -233,7 +237,7 @@ Proc_ReturnToUser: int 0xAC [global GetCPUNum] -GetCPUNum: +GetCPUNum: ; TODO: Store in debug registers xor eax, eax str ax sub ax, 0x30 @@ -245,7 +249,7 @@ GetCPUNum: ; Export a place for the user to jump to to call a syscall ; - Allows the kernel to change the method easily User_Syscall: - xchg bx, bx + xchg bx, bx ; MAGIC BREAKPOINT int 0xAC ; A place to return to and exit