git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Kernel/arm7 - Fiddling with PCI etc
[tpg/acess2.git]
/
Kernel
/
arch
/
x86
/
proc.asm
diff --git
a/Kernel/arch/x86/proc.asm
b/Kernel/arch/x86/proc.asm
index
cefd796
..
5a9ad0a
100644
(file)
--- a/
Kernel/arch/x86/proc.asm
+++ b/
Kernel/arch/x86/proc.asm
@@
-8,6
+8,26
@@
KERNEL_BASE equ 0xC0000000
KSTACK_USERSTATE_SIZE equ (4+8+1+5)*4 ; SRegs, GPRegs, CPU, IRET
[section .text]
KSTACK_USERSTATE_SIZE equ (4+8+1+5)*4 ; SRegs, GPRegs, CPU, IRET
[section .text]
+
+[global NewTaskHeader]
+NewTaskHeader:
+ mov eax, [esp]
+ mov dr0, eax
+ xchg bx, bx
+
+ sti
+ ; TODO: SMP
+ mov al, 0x20
+ out 0x20, al
+
+ mov eax, [esp+4]
+ add esp, 12 ; Thread, Function, Args
+ call eax
+
+ push eax ; Ret val
+ push 0 ; 0 = This Thread
+ call Threads_Exit
+
%if USE_MP
[extern giMP_TimerCount]
[extern gpMP_LocalAPIC]
%if USE_MP
[extern giMP_TimerCount]
[extern gpMP_LocalAPIC]
@@
-74,6
+94,13
@@
SchedulerBase:
push fs
push gs
push fs
push gs
+ pushf
+ and BYTE [esp+1], 0xFE ; Clear Trap Flag
+ popf
+
+ mov eax, dr0
+ push eax ; Debug Register 0, Current Thread
+
mov ax, 0x10
mov ds, ax
mov es, ax
mov ax, 0x10
mov ds, ax
mov es, ax
@@
-89,8
+116,10
@@
SchedulerBase:
%endif
call Proc_Scheduler
%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
%if USE_MP
test ebx, ebx
@@
-107,13
+136,16
@@
SchedulerBase:
mov DWORD [eax+0x0B0], 0
%endif
.ret:
mov DWORD [eax+0x0B0], 0
%endif
.ret:
+ pop eax ; Debug Register 0, Current Thread
+ mov dr0, eax
+
pop gs
pop fs
pop es
pop ds
popa
pop gs
pop fs
pop es
pop ds
popa
- add esp, 4
; CPU ID
+ add esp, 4
*2 ; CPU ID + Dummy error code
; No Error code / int num
iret
; No Error code / int num
iret
@@
-123,7
+155,7
@@
SchedulerBase:
SpawnTask:
; Call Proc_Clone with Flags=0
xor eax, eax
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
push eax
call Proc_Clone
add esp, 8 ; Remove arguments from stack
@@
-134,9
+166,10
@@
SpawnTask:
; In child, so now set up stack frame
mov ebx, [esp+4] ; Child Function
mov edx, [esp+8] ; Argument
; 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
push edx ; Argument
call ebx ; Function
+ ; Kill thread once done
push eax ; Exit Code
push 0 ; Kill this thread
call Threads_Exit ; Kill Thread
push eax ; Exit Code
push 0 ; Kill this thread
call Threads_Exit ; Kill Thread
@@
-144,19
+177,24
@@
SpawnTask:
.parent:
ret
.parent:
ret
-;
+;
void Proc_ReturnToUser(void *Method, Uint Parameter)
; Calls a user fault handler
;
[global Proc_ReturnToUser]
[extern Proc_GetCurThread]
Proc_ReturnToUser:
; 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
; 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
;
sub eax, KSTACK_USERSTATE_SIZE
;
@@
-168,14
+206,10
@@
Proc_ReturnToUser:
; Validate user ESP
; - Page Table
mov edx, [eax+KSTACK_USERSTATE_SIZE-12] ; User ESP is at top of kstack - 3*4
; 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
mov ecx, edx
shr ecx, 22
test BYTE [0xFC3F0000+ecx*4], 1
jnz .justKillIt
- %endif
; - Page
mov ecx, edx
shr ecx, 12
; - Page
mov ecx, edx
shr ecx, 12
@@
-184,13
+218,10
@@
Proc_ReturnToUser:
; Adjust
sub edx, 8
; - Page Table
; Adjust
sub edx, 8
; - Page Table
- %if USE_PAE
- %else
mov ecx, edx
shr ecx, 22
test BYTE [0xFC3F0000+ecx*4], 1
jnz .justKillIt
mov ecx, edx
shr ecx, 22
test BYTE [0xFC3F0000+ecx*4], 1
jnz .justKillIt
- %endif
; - Page
mov ecx, edx
shr ecx, 12
; - Page
mov ecx, edx
shr ecx, 12
@@
-198,10
+229,10
@@
Proc_ReturnToUser:
jnz .justKillIt
; Get and alter User SP
jnz .justKillIt
; Get and alter User SP
- mov e
cx
, edx
- mov edx, [eb
x+60] ; Get Signal Number from TCB
- mov [e
cx+4], edx ; Parameter (Signal/Error Number)
- mov [e
cx
], DWORD User_Syscall_RetAndExit ; Return Address
+ mov e
di
, edx
+ mov edx, [eb
p+12] ; Get parameter
+ mov [e
di+4], edx ; save to user stack
+ mov [e
di
], DWORD User_Syscall_RetAndExit ; Return Address
; Restore Segment Registers
mov ax, 0x23
; Restore Segment Registers
mov ax, 0x23
@@
-211,10
+242,11
@@
Proc_ReturnToUser:
mov gs, ax
push 0x23 ; SS
mov gs, ax
push 0x23 ; SS
- push e
cx
; ESP
+ push e
di
; ESP
push 0x202 ; EFLAGS (IP and Rsvd)
push 0x1B ; CS
push 0x202 ; EFLAGS (IP and Rsvd)
push 0x1B ; CS
- push ebp ; EIP
+ mov eax, [ebp+8] ; Method to call
+ push eax ; EIP
iret
iret
@@
-223,19
+255,36
@@
Proc_ReturnToUser:
.justKillIt:
xor eax, eax
xor ebx, ebx
.justKillIt:
xor eax, eax
xor ebx, ebx
- dec ebx
+ dec ebx
; EBX = -1
int 0xAC
[global GetCPUNum]
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
[section .usertext]
ret
; 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
User_Syscall_RetAndExit:
push eax
call User_Syscall_Exit
UCC
git Repository :: git.ucc.asn.au