push fs
push gs
+ mov eax, dr0
+ push eax ; Debug Register 0, Current Thread
+
mov ax, 0x10
mov ds, ax
mov es, ax
mov DWORD [eax+0x0B0], 0
%endif
.ret:
+ pop eax ; Debug Register 0, Current Thread
+ mov dr0, eax
+
pop gs
pop fs
pop es
.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
;
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
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
int 0xAC
[global GetCPUNum]
-GetCPUNum:
+GetCPUNum: ; TODO: Store in debug registers
xor eax, eax
str ax
sub ax, 0x30
; Usermode code exported by the kernel
[section .usertext]
+; 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 ; MAGIC BREAKPOINT
+ int 0xAC
+
+; A place to return to and exit
User_Syscall_RetAndExit:
push eax
call User_Syscall_Exit