X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fvm8086.c;h=93ea63ae5b6022fdb6feff0a31d489fc6439b61b;hb=86f855a3e417d93976af42dde36f457e89524902;hp=397ec14fbde9ff438c5acccb6f3c75f8cdfb1917;hpb=6d6b367c4f5e413a9e4135d9f5c40077c3724525;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/vm8086.c b/KernelLand/Kernel/arch/x86/vm8086.c index 397ec14f..93ea63ae 100644 --- a/KernelLand/Kernel/arch/x86/vm8086.c +++ b/KernelLand/Kernel/arch/x86/vm8086.c @@ -41,7 +41,7 @@ enum eVM8086_Opcodes struct sVM8086_InternalPages { Uint32 Bitmap; // 32 sections = 128 byte blocks - tVAddr VirtBase; + char *VirtBase; tPAddr PhysAddr; }; struct sVM8086_InternalData @@ -77,7 +77,7 @@ int VM8086_Install(char **Arguments) // Create BIOS Call process pid = Proc_Clone(CLONE_VM); - Log_Debug("VM8086", "pid = %i", pid); + //Log_Debug("VM8086", "pid = %i", pid); if(pid == -1) { Log_Error("VM8086", "Unable to clone kernel into VM8086 worker"); @@ -89,27 +89,30 @@ int VM8086_Install(char **Arguments) Uint16 * volatile rmstack; // Real Mode Stack int i; - Log_Debug("VM8086", "Initialising worker"); + //Log_Debug("VM8086", "Initialising worker"); // Set Image Name Threads_SetName("VM8086"); // Map ROM Area for(i=0xA0;i<0x100;i++) { - MM_Map( i * 0x1000, i * 0x1000 ); + MM_RefPhys(i * 0x1000); + MM_Map( (void*)(i * 0x1000), i * 0x1000 ); } - MM_Map( 0, 0 ); // IVT / BDA + MM_RefPhys(0); + MM_Map( (void*)0, 0 ); // IVT / BDA if( MM_GetRefCount(0x00000) > 2 ) { Log_Notice("VM8086", "Ok, who's touched the IVT? (%i)", MM_GetRefCount(0x00000)); } - MM_Map( 0x9F000, 0x9F000 ); // Stack / EBDA + MM_RefPhys(0x9F000); + MM_Map( (void*)0x9F000, 0x9F000 ); // Stack / EBDA if( MM_GetRefCount(0x9F000) > 2 ) { Log_Notice("VM8086", "And who's been playing with my EBDA? (%i)", MM_GetRefCount(0x9F000)); } // System Stack / Stub - if( MM_Allocate( 0x100000 ) == 0 ) { + if( MM_Allocate( (void*)0x100000 ) == 0 ) { Log_Error("VM8086", "Unable to allocate memory for stack/stub"); gVM8086_WorkerPID = 0; Threads_Exit(0, 1); @@ -184,7 +187,6 @@ void VM8086_GPF(tRegs *Regs) if(Regs->eip == VM8086_MAGIC_IP && Regs->cs == VM8086_MAGIC_CS && Threads_GetPID() == gVM8086_WorkerPID) { - int i; if( gpVM8086_State == (void*)-1 ) { Log_Log("VM8086", "Worker thread ready and waiting"); gpVM8086_State = NULL; @@ -192,7 +194,8 @@ void VM8086_GPF(tRegs *Regs) } // Log_Log("VM8086", "gpVM8086_State = %p, gVM8086_CallingThread = %i", // gpVM8086_State, gVM8086_CallingThread); - if( gpVM8086_State ) { + if( gpVM8086_State ) + { gpVM8086_State->AX = Regs->eax; gpVM8086_State->CX = Regs->ecx; gpVM8086_State->DX = Regs->edx; gpVM8086_State->BX = Regs->ebx; gpVM8086_State->BP = Regs->ebp; @@ -201,10 +204,11 @@ void VM8086_GPF(tRegs *Regs) LOG("gpVM8086_State = %p", gpVM8086_State); LOG("gpVM8086_State->Internal = %p", gpVM8086_State->Internal); - for( i = 0; i < VM8086_PAGES_PER_INST; i ++ ) { + for( Uint i = 0; i < VM8086_PAGES_PER_INST; i ++ ) + { if( !gpVM8086_State->Internal->AllocatedPages[i].VirtBase ) continue ; - MM_Deallocate( VM8086_USER_BASE + i*PAGE_SIZE ); + MM_Deallocate( (tPage*)VM8086_USER_BASE + i ); } gpVM8086_State = NULL; @@ -217,11 +221,12 @@ void VM8086_GPF(tRegs *Regs) __asm__ __volatile__ ("sti"); Semaphore_Wait(&gVM8086_TasksToDo, 1); - for( i = 0; i < VM8086_PAGES_PER_INST; i ++ ) + for( Uint i = 0; i < VM8086_PAGES_PER_INST; i ++ ) { if( !gpVM8086_State->Internal->AllocatedPages[i].VirtBase ) continue ; - MM_Map( VM8086_USER_BASE + i*PAGE_SIZE, gpVM8086_State->Internal->AllocatedPages[i].PhysAddr ); + MM_RefPhys( gpVM8086_State->Internal->AllocatedPages[i].PhysAddr ); + MM_Map( (tPage*)VM8086_USER_BASE + i, gpVM8086_State->Internal->AllocatedPages[i].PhysAddr ); } @@ -416,9 +421,8 @@ tVM8086 *VM8086_Init(void) void VM8086_Free(tVM8086 *State) { - int i; // TODO: Make sure the state isn't in use currently - for( i = VM8086_PAGES_PER_INST; i --; ) + for( Uint i = VM8086_PAGES_PER_INST; i --; ) MM_UnmapHWPages( State->Internal->AllocatedPages[i].VirtBase, 1); free(State); } @@ -443,8 +447,11 @@ void *VM8086_Allocate(tVM8086 *State, int Size, Uint16 *Segment, Uint16 *Offset) rem = nBlocks; base = 0; // Scan the bitmap for a free block - for( j = 0; j < 32; j++ ) { - if( pages[i].Bitmap & (1 << j) ) { + // - 32 blocks per page == 128 bytes per block == 8 segments + for( j = 0; j < 32; j++ ) + { + if( pages[i].Bitmap & (1 << j) ) + { base = j+1; rem = nBlocks; } @@ -458,7 +465,7 @@ void *VM8086_Allocate(tVM8086 *State, int Size, Uint16 *Segment, Uint16 *Offset) *Offset = 0; LOG("Allocated at #%i,%04x", i, base*8*16); LOG(" - %x:%x", *Segment, *Offset); - return (void*)( pages[i].VirtBase + base * 8 * 16 ); + return pages[i].VirtBase + base * 8 * 16; } } } @@ -489,7 +496,7 @@ void *VM8086_Allocate(tVM8086 *State, int Size, Uint16 *Segment, Uint16 *Offset) *Segment = (VM8086_USER_BASE + i * 0x1000) / 16; *Offset = 0; LOG(" - %04x:%04x", *Segment, *Offset); - return (void*) pages[i].VirtBase; + return pages[i].VirtBase; } void *VM8086_GetPointer(tVM8086 *State, Uint16 Segment, Uint16 Offset) @@ -502,7 +509,7 @@ void *VM8086_GetPointer(tVM8086 *State, Uint16 Segment, Uint16 Offset) if( State->Internal->AllocatedPages[pg].VirtBase == 0) return NULL; else - return (Uint8*)State->Internal->AllocatedPages[pg].VirtBase + (addr & 0xFFF); + return State->Internal->AllocatedPages[pg].VirtBase + (addr & 0xFFF); } else {