#define PF_PRESENT 0x1
#define PF_WRITE 0x2
#define PF_USER 0x4
+#define PF_GLOBAL 0x80
#define PF_COW 0x200
#define PF_NOPAGE 0x400
tPAddr expected = 0;
tVAddr curPos;
Uint page;
- const tPAddr MASK = ~0xF98;
+ const tPAddr MASK = ~0xF78;
Start >>= 12; End >>= 12;
|| (gaPageTable[page] & MASK) != expected)
{
if(expected) {
- Log(" 0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)",
- rangeStart, curPos - 1,
+ Log(" 0x%08x => 0x%08x - 0x%08x (%s%s%s%s%s)",
+ rangeStart,
gaPageTable[rangeStart>>12] & ~0xFFF,
- (expected & ~0xFFF) - 1,
+ curPos - rangeStart,
(expected & PF_NOPAGE ? "P" : "-"),
(expected & PF_COW ? "C" : "-"),
+ (expected & PF_GLOBAL ? "G" : "-"),
(expected & PF_USER ? "U" : "-"),
- (expected & PF_WRITE ? "W" : "-")
+ (expected & PF_WRITE ? "W" : "-"),
+ gaPageTable[page] & MASK, expected
);
expected = 0;
}
}
if(expected) {
- Log("0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)",
- rangeStart, curPos - 1,
+ Log("0x%08x => 0x%08x - 0x%08x (%s%s%s%s)",
+ rangeStart,
gaPageTable[rangeStart>>12] & ~0xFFF,
- (expected & ~0xFFF) - 1,
+ curPos - rangeStart,
(expected & PF_NOPAGE ? "p" : "-"),
(expected & PF_COW ? "C" : "-"),
(expected & PF_USER ? "U" : "-"),
* Acess2 VM8086 Driver
* - By John Hodge (thePowersGang)
*/
+#define DEBUG 0
#include <acess.h>
#include <vm8086.h>
#include <modules.h>
};
#define VM8086_PAGES_PER_INST 4
+#define VM8086_BLOCKSIZE 128
+#define VM8086_BLOCKCOUNT ((0x9F000-0x10000)/VM8086_BLOCKSIZE)
+
// === IMPORTS ===
int Proc_Clone(Uint *Err, Uint Flags);
tPID gVM8086_WorkerPID;
tTID gVM8086_CallingThread;
tVM8086 volatile * volatile gpVM8086_State = (void*)-1; // Set to -1 to avoid race conditions
+Uint32 gaVM8086_MemBitmap[VM8086_BLOCKCOUNT/32];
// === FUNCTIONS ===
int VM8086_Install(char **Arguments)
//MM_SetFlags( i * 0x1000, MM_PFLAG_RO, MM_PFLAG_RO ); // Set Read Only
}
MM_Map( 0, 0 ); // IVT / BDA
- for(i=0x10;i<0x9F;i++) {
- MM_Map( i * 0x1000, i * 0x1000 ); MM_DerefPhys( i * 0x1000 );
+ // Map (but allow allocation) of 0x1000 - 0x9F000
+ // - So much hack, it isn't funny
+ for(i=1;i<0x9F;i++) {
+ MM_Map( i * 0x1000, i * 0x1000 );
+ MM_DerefPhys( i * 0x1000 ); // Above
+ MM_DerefPhys( i * 0x1000 ); // Phys setup
}
MM_Map( 0x9F000, 0x9F000 ); // Stack / EBDA
// System Stack / Stub
{
if( gpVM8086_State == (void*)-1 ) {
Log_Log("VM8086", "Worker thread ready and waiting");
- Mutex_Release( &glVM8086_Process ); // Release lock obtained in VM8086_Install
gpVM8086_State = NULL;
+ Mutex_Release( &glVM8086_Process ); // Release lock obtained in VM8086_Install
}
//Log_Log("VM8086", "gpVM8086_State = %p, gVM8086_CallingThread = %i",
// gpVM8086_State, gVM8086_CallingThread);
// Scan the bitmap for a free block
for( j = 0; j < 32; j++ ) {
if( State->Internal->AllocatedPages[i].Bitmap & (1 << j) ) {
- base = j;
+ base = j+1;
rem = nBlocks;
}
- else {
- rem --;
- if(rem == 0) // Goodie, there's a gap
- {
- for( j = 0; j < nBlocks; j++ )
- State->Internal->AllocatedPages[i].Bitmap |= 1 << (base + j);
- *Segment = State->Internal->AllocatedPages[i].PhysAddr / 16 + base * 8;
- *Offset = 0;
- //Log_Debug("VM8086", "Allocated at #%i,%04x", i, base*128);
- return (void*)( State->Internal->AllocatedPages[i].VirtBase + base * 128 );
- }
+
+ rem --;
+ if(rem == 0) // Goodie, there's a gap
+ {
+ for( j = 0; j < nBlocks; j++ )
+ State->Internal->AllocatedPages[i].Bitmap |= 1 << (base + j);
+ *Segment = State->Internal->AllocatedPages[i].PhysAddr / 16 + base * 8;
+ *Offset = 0;
+ LOG("Allocated at #%i,%04x", i, base*128);
+ LOG(" - %x:%x", *Segment, *Offset);
+ return (void*)( State->Internal->AllocatedPages[i].VirtBase + base * 128 );
}
}
}
for( j = 0; j < nBlocks; j++ )
State->Internal->AllocatedPages[i].Bitmap |= 1 << j;
- //Log_Debug("VM8086", "AllocatedPages[%i].Bitmap = 0b%b", i, State->Internal->AllocatedPages[i].Bitmap);
+ LOG("AllocatedPages[%i].Bitmap = 0b%b", i, State->Internal->AllocatedPages[i].Bitmap);
*Segment = State->Internal->AllocatedPages[i].PhysAddr / 16;
*Offset = 0;
+ LOG(" - %x:%x", *Segment, *Offset);
return (void*) State->Internal->AllocatedPages[i].VirtBase;
}