static inline void SHORTLOCK(struct sShortSpinlock *Lock) {
int v = 1;
int IF;
- // int val = GetCPUNum() + 1;
+ // int cpu = GetCPUNum() + 1;
// Save interrupt state and clear interrupts
__ASM__ ("pushf;\n\tcli;\n\tpop %%eax" : "=a"(IF));
// Wait for another CPU to release
while(v)
- __ASM__("xchgl %%ecx, (%%edi)":"=c"(v):"a"(1),"D"(&Lock->Lock));
+ __ASM__("xchgl %%eax, (%%edi)":"=a"(v):"a"(1),"D"(&Lock->Lock));
Lock->IF = IF;
}
.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
jnz .justKillIt
; Get and alter User SP
- mov ecx, edx
- mov edx, [ebx+68] ; Get Signal Number from TCB (TODO: Get this from parameters)
- 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
; 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
extern tThread gThreadZero;
extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags);
extern void Isr8(void); // Double Fault
-extern void Proc_ReturnToUser(void);
+extern void Proc_ReturnToUser(tVAddr Handler, Uint Argument);
// === PROTOTYPES ===
void ArchThreads_Init(void);
{
// Rewinds the stack and calls the user function
// Never returns
- __asm__ __volatile__ ("mov %0, %%ebp;\n\tcall Proc_ReturnToUser" :: "r"(Thread->FaultHandler));
+ Proc_ReturnToUser( Thread->FaultHandler, Thread->CurFaultNum );
for(;;);
}