X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Farch%2Fx86%2Fvm8086.c;h=5253a62d430772200e82f3f89a371182b27d3edb;hb=2a05bcd81312a2885f824dac79e82c01a6e60c6c;hp=1f4f1f43d4d37e71d04e13d3ddf2c3c7fa7a21a4;hpb=587078c9b833b5fa1cae8b445475000706de8441;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/vm8086.c b/Kernel/arch/x86/vm8086.c index 1f4f1f43..5253a62d 100644 --- a/Kernel/arch/x86/vm8086.c +++ b/Kernel/arch/x86/vm8086.c @@ -44,7 +44,7 @@ tVM8086 *VM8086_Init(void); // === GLOBALS === MODULE_DEFINE(0, 0x100, VM8086, VM8086_Install, NULL, NULL); -tSpinlock glVM8086_Process; +tMutex glVM8086_Process; tPID gVM8086_WorkerPID; tTID gVM8086_CallingThread; tVM8086 volatile * volatile gpVM8086_State = (void*)-1; // Set to -1 to avoid race conditions @@ -55,7 +55,7 @@ int VM8086_Install(char **Arguments) tPID pid; // Lock to avoid race conditions - LOCK( &glVM8086_Process ); + Mutex_Acquire( &glVM8086_Process ); // Create BIOS Call process pid = Proc_Clone(NULL, CLONE_VM); @@ -130,7 +130,8 @@ int VM8086_Install(char **Arguments) gVM8086_WorkerPID = pid; Log_Log("VM8086", "gVM8086_WorkerPID = %i", pid); - Threads_Yield(); // Yield to allow the child to initialise + while( gpVM8086_State != NULL ) + Threads_Yield(); // Yield to allow the child to initialise return MODULE_ERR_OK; } @@ -146,9 +147,11 @@ void VM8086_GPF(tRegs *Regs) { if( gpVM8086_State == (void*)-1 ) { Log_Log("VM8086", "Worker thread ready and waiting"); - RELEASE( &glVM8086_Process ); // Release lock obtained in VM8086_Install + Mutex_Release( &glVM8086_Process ); // Release lock obtained in VM8086_Install gpVM8086_State = NULL; } + //Log_Log("VM8086", "gpVM8086_State = %p, gVM8086_CallingThread = %i", + // gpVM8086_State, gVM8086_CallingThread); if( gpVM8086_State ) { gpVM8086_State->AX = Regs->eax; gpVM8086_State->CX = Regs->ecx; gpVM8086_State->DX = Regs->edx; gpVM8086_State->BX = Regs->ebx; @@ -156,7 +159,9 @@ void VM8086_GPF(tRegs *Regs) gpVM8086_State->SI = Regs->esi; gpVM8086_State->DI = Regs->edi; gpVM8086_State->DS = Regs->ds; gpVM8086_State->ES = Regs->es; gpVM8086_State = NULL; - Threads_WakeTID(gVM8086_CallingThread); + // Ensure the caller wakes + //while(Threads_WakeTID(gVM8086_CallingThread) == -EALREADY) + // Threads_Yield(); } //Log_Log("VM8086", "Waiting for something to do"); @@ -396,13 +401,13 @@ void VM8086_Int(tVM8086 *State, Uint8 Interrupt) State->IP = *(Uint16*)(KERNEL_BASE+4*Interrupt); State->CS = *(Uint16*)(KERNEL_BASE+4*Interrupt+2); - LOCK( &glVM8086_Process ); + Mutex_Acquire( &glVM8086_Process ); gpVM8086_State = State; gVM8086_CallingThread = Threads_GetTID(); Threads_WakeTID( gVM8086_WorkerPID ); while( gpVM8086_State != NULL ) - Threads_Sleep(); + Threads_Yield(); - RELEASE( &glVM8086_Process ); + Mutex_Release( &glVM8086_Process ); }