Kernel/x86 - Cleaning up dead code
[tpg/acess2.git] / Kernel / arch / x86 / proc.asm
index 9dc7f08..00ea9e1 100644 (file)
 
 [bits 32]
 
+%define SAVEFLAG_FPU   0x1
+
 KERNEL_BASE    equ 0xC0000000
 
 KSTACK_USERSTATE_SIZE  equ     (4+8+1+5)*4     ; SRegs, GPRegs, CPU, IRET
 
 [section .text]
+
+[global NewTaskHeader]
+NewTaskHeader:
+       mov eax, [esp]
+       mov dr0, eax
+
+       mov eax, [esp+4]
+       add esp, 12     ; Thread, Function, Arg Count
+       call eax
+       
+       push eax        ; Ret val
+       push 0          ; 0 = This Thread
+       call Threads_Exit
+
+[extern MM_Clone]
+[global Proc_CloneInt]
+Proc_CloneInt:
+       pusha
+       ; Save RSP
+       mov eax, [esp+0x20+4]
+       mov [eax], esp
+       call MM_Clone
+       ; Save CR3
+       mov esi, [esp+0x20+8]
+       mov [esi], eax
+       ; Undo the pusha
+       add esp, 0x20
+       mov eax, .newTask
+       ret
+.newTask:
+       popa
+       xor eax, eax
+       ret
+
+[global SwitchTasks]
+; + 4 = New RSP
+; + 8 = Old RSP save loc
+; +12 = New RIP
+; +16 = Old RIP save loc
+; +20 = CR3
+SwitchTasks:
+       pusha
+       
+       ; Old IP
+       mov eax, [esp+0x20+16]
+       test eax, eax
+       jz .nosave
+       mov DWORD [eax], .restore
+       ; Old SP
+       mov eax, [esp+0x20+8]
+       mov [eax], esp
+
+.nosave:
+       mov ecx, [esp+0x20+12]  ; New IP
+       mov eax, [esp+0x20+20]  ; New CR3
+       mov esp, [esp+0x20+ 4]  ; New SP
+       
+       test eax, eax
+       jz .setState
+       mov cr3, eax
+       invlpg [esp]
+       invlpg [esp+0x1000]
+.setState:
+       jmp ecx
+
+.restore:
+       popa
+       xor eax, eax
+       ret
+
+[global Proc_InitialiseSSE]
+Proc_InitialiseSSE:
+       mov eax, cr4
+       or eax, (1 << 9)|(1 << 10)      ; Set OSFXSR and OSXMMEXCPT
+       mov cr4, eax
+       mov eax, cr0
+       and ax, ~(1 << 2)       ; Clear EM
+       or eax, (1 << 1)        ; Set MP
+       mov eax, cr0
+       ret
+[global Proc_DisableSSE]
+Proc_DisableSSE:
+       mov eax, cr0
+       or ax, 1 << 3   ; Set TS
+       mov cr0, eax
+       ret
+[global Proc_EnableSSE]
+Proc_EnableSSE:
+       mov eax, cr0
+       and ax, ~(1 << 3)       ; Clear TS
+       mov cr0, eax
+       ret
+
+[global Proc_SaveSSE]
+Proc_SaveSSE:
+       mov eax, [esp+4]
+       fxsave [eax]
+       ret
+[global Proc_RestoreSSE]
+Proc_RestoreSSE:
+       mov eax, [esp+4]
+       fxrstor [eax]
+       ret
+
 %if USE_MP
 [extern giMP_TimerCount]
 [extern gpMP_LocalAPIC]
@@ -58,8 +164,7 @@ SetAPICTimerCount:
        pop es
        pop ds
        popa
-       add esp, 4      ; CPU ID
-       ; No Error code / int num
+       add esp, 8      ; CPU ID / Error Code
        iret
 %endif
 ; --------------
@@ -74,6 +179,10 @@ SchedulerBase:
        push fs
        push gs
        
+       pushf
+       and BYTE [esp+1], 0xFE  ; Clear Trap Flag
+       popf
+       
        mov eax, dr0
        push eax        ; Debug Register 0, Current Thread
        
@@ -92,8 +201,10 @@ SchedulerBase:
        %endif
        
        call Proc_Scheduler
+[global scheduler_return]
+scheduler_return:      ; Used by some hackery in Proc_DumpThreadCPUState
        
-       add esp, 4      ; Remove Argument
+       add esp, 4      ; Remove CPU Number (thread is poped later)
 
        %if USE_MP
        test ebx, ebx
@@ -119,7 +230,7 @@ SchedulerBase:
        pop ds
        
        popa
-       add esp, 4      ; CPU ID
+       add esp, 4*2    ; CPU ID + Dummy error code
        ; No Error code / int num
        iret
 
@@ -129,7 +240,7 @@ SchedulerBase:
 SpawnTask:
        ; Call Proc_Clone with Flags=0
        xor eax, eax
-       push eax
+;      push eax
        push eax
        call Proc_Clone
        add esp, 8      ; Remove arguments from stack
@@ -140,9 +251,10 @@ SpawnTask:
        ; In child, so now set up stack frame
        mov ebx, [esp+4]        ; Child Function
        mov edx, [esp+8]        ; Argument
-       ; Child
+       ; Child Function
        push edx        ; Argument
        call ebx        ; Function
+       ; Kill thread once done
        push eax        ; Exit Code
        push   0        ; Kill this thread
        call Threads_Exit       ; Kill Thread
@@ -150,19 +262,24 @@ 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+8]: handler to use
+       ; [EBP+12]: parameter
+       ; [EBP+16]: kernel stack top
        
-       call Proc_GetCurThread
+       ;call Proc_GetCurThread
        
        ; EAX is the current thread
-       mov ebx, eax
-       mov eax, [ebx+40]       ; Get Kernel Stack
+       ;mov ebx, eax
+       ;mov eax, [ebx+12*4]    ; Get Kernel Stack
+       mov eax, [ebp+16]       ; Get Kernel Stack
        sub eax, KSTACK_USERSTATE_SIZE
        
        ;
@@ -174,14 +291,10 @@ Proc_ReturnToUser:
        ; Validate user ESP
        ; - Page Table
        mov edx, [eax+KSTACK_USERSTATE_SIZE-12] ; User ESP is at top of kstack - 3*4
-       %if USE_PAE
-       %error PAE Support
-       %else
        mov ecx, edx
        shr ecx, 22
        test BYTE [0xFC3F0000+ecx*4], 1
        jnz .justKillIt
-       %endif
        ; - Page
        mov ecx, edx
        shr ecx, 12
@@ -190,13 +303,10 @@ Proc_ReturnToUser:
        ; Adjust
        sub edx, 8
        ; - Page Table
-       %if USE_PAE
-       %else
        mov ecx, edx
        shr ecx, 22
        test BYTE [0xFC3F0000+ecx*4], 1
        jnz .justKillIt
-       %endif
        ; - Page
        mov ecx, edx
        shr ecx, 12
@@ -204,10 +314,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+12]       ; 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 +327,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+8]        ; Method to call
+       push eax        ; EIP
        
        iret
        
@@ -229,15 +340,25 @@ Proc_ReturnToUser:
 .justKillIt:
        xor eax, eax
        xor ebx, ebx
-       dec ebx
+       dec ebx ; EBX = -1
        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
+
+[extern GetEIP]
+[global GetEIP_Sched]
+[global GetEIP_Sched_ret]
+GetEIP_Sched_ret equ GetEIP_Sched.ret
+GetEIP_Sched:
+       call GetEIP
+GetEIP_Sched.ret:
        ret
 
 ; Usermode code exported by the kernel
@@ -245,7 +366,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
@@ -256,3 +377,5 @@ User_Syscall_Exit:
        xor eax, eax
        mov ebx, [esp+4]
        int 0xAC
+
+; vim: ft=nasm ts=8

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