Multiple IPStack Related changes (and other bugfixes)
[tpg/acess2.git] / Kernel / arch / x86 / proc.asm
index 20a4fd7..fd372db 100644 (file)
@@ -74,6 +74,9 @@ SchedulerBase:
        push fs
        push gs
        
+       mov eax, dr0
+       push eax        ; Debug Register 0, Current Thread
+       
        mov ax, 0x10
        mov ds, ax
        mov es, ax
@@ -107,6 +110,9 @@ SchedulerBase:
        mov DWORD [eax+0x0B0], 0
        %endif
 .ret:
+       pop eax ; Debug Register 0, Current Thread
+       mov dr0, eax
+
        pop gs
        pop fs
        pop es
@@ -144,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
        
        ;
@@ -198,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
@@ -211,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
        
@@ -227,11 +237,12 @@ Proc_ReturnToUser:
        int 0xAC
 
 [global GetCPUNum]
-GetCPUNum:
-       xor eax, eax
-       str ax
-       sub ax, 0x30
-       shr ax, 3       ; ax /= 8
+GetCPUNum:     ; TODO: Store in debug registers
+;      xor eax, eax
+;      str ax
+;      sub ax, 0x30
+;      shr ax, 3       ; ax /= 8
+       mov eax, dr1
        ret
 
 ; Usermode code exported by the kernel
@@ -239,7 +250,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

UCC git Repository :: git.ucc.asn.au