X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fvm8086.c;h=589d9a734f1b816a5f8d96cc60b26c40901c723a;hb=dc8801cc0b5ed911a775cfc2ea853048f7a00db1;hp=3c1bfed078cc01bb6f72a8819913aa7b030943ed;hpb=eb98f1f2915446ef05120482a2fc353c76330b50;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/vm8086.c b/Kernel/arch/x86/vm8086.c index 3c1bfed0..589d9a73 100644 --- a/Kernel/arch/x86/vm8086.c +++ b/Kernel/arch/x86/vm8086.c @@ -7,6 +7,7 @@ #include #include #include +#include // === CONSTANTS === #define VM8086_MAGIC_CS 0xFFFF @@ -47,6 +48,8 @@ void VM8086_GPF(tRegs *Regs); // === GLOBALS === MODULE_DEFINE(0, 0x100, VM8086, VM8086_Install, NULL, NULL); tMutex glVM8086_Process; +tSemaphore gVM8086_TaskComplete; +tSemaphore gVM8086_TasksToDo; tPID gVM8086_WorkerPID; tTID gVM8086_CallingThread; tVM8086 volatile * volatile gpVM8086_State = (void*)-1; // Set to -1 to avoid race conditions @@ -81,7 +84,6 @@ int VM8086_Install(char **Arguments) // Map ROM Area for(i=0xA0;i<0x100;i++) { MM_Map( i * 0x1000, i * 0x1000 ); - // MM_SetFlags( i * 0x1000, MM_PFLAG_RO, MM_PFLAG_RO ); // Set Read Only } Log_Debug("VM8086", "ROM area mapped"); MM_Map( 0, 0 ); // IVT / BDA @@ -90,7 +92,7 @@ int VM8086_Install(char **Arguments) for(i=1;i<0x9F;i++) { MM_Map( i * 0x1000, i * 0x1000 ); MM_DerefPhys( i * 0x1000 ); // Above - if(MM_GetRefCount(i*0x1000)) + while(MM_GetRefCount(i*0x1000)) MM_DerefPhys( i * 0x1000 ); // Phys setup } MM_Map( 0x9F000, 0x9F000 ); // Stack / EBDA @@ -182,16 +184,12 @@ void VM8086_GPF(tRegs *Regs) gpVM8086_State->DS = Regs->ds; gpVM8086_State->ES = Regs->es; gpVM8086_State = NULL; // Wake the caller - Threads_WakeTID(gVM8086_CallingThread); + Semaphore_Signal(&gVM8086_TaskComplete, 1); } //Log_Log("VM8086", "Waiting for something to do"); __asm__ __volatile__ ("sti"); - // Wait for a new task - while(!gpVM8086_State) { - Threads_Sleep(); - //Log_Log("VM8086", "gpVM8086_State = %p", gpVM8086_State); - } + Semaphore_Wait(&gVM8086_TasksToDo, 1); //Log_Log("VM8086", "We have a task (%p)", gpVM8086_State); Regs->esp -= 2; *(Uint16*volatile)( (Regs->ss<<4) + (Regs->esp&0xFFFF) ) = VM8086_MAGIC_CS; @@ -422,14 +420,16 @@ void VM8086_Int(tVM8086 *State, Uint8 Interrupt) { State->IP = *(Uint16*)(KERNEL_BASE+4*Interrupt); State->CS = *(Uint16*)(KERNEL_BASE+4*Interrupt+2); + +// Log_Debug("VM8086", "Software interrupt %i to %04x:%04x", Interrupt, State->CS, State->IP); Mutex_Acquire( &glVM8086_Process ); gpVM8086_State = State; gVM8086_CallingThread = Threads_GetTID(); - Threads_WakeTID( gVM8086_WorkerPID ); - Threads_Sleep(); - while( gpVM8086_State != NULL ) Threads_Sleep(); + Semaphore_Signal(&gVM8086_TasksToDo, 1); + + Semaphore_Wait(&gVM8086_TaskComplete, 1); Mutex_Release( &glVM8086_Process ); }