&& gaPageTable[Addr>>12] & PF_COW )
{
tPAddr paddr;
+ __asm__ __volatile__ ("sti");
if(MM_GetRefCount( gaPageTable[Addr>>12] & ~0xFFF ) == 1)
{
gaPageTable[Addr>>12] &= ~PF_COW;
// If it was a user, tell the thread handler
if(ErrorCode & 4) {
+ __asm__ __volatile__ ("sti");
Log_Warning("MMVirt", "User %s %s memory%s",
(ErrorCode&2?"write to":"read from"),
(ErrorCode&1?"bad/locked":"non-present"),
//ENTER("xVAddr xPAddr", VAddr, PAddr);
// Sanity check
if( PAddr & 0xFFF || VAddr & 0xFFF ) {
- Log_Warning("MM_Virt", "MM_Map - Physical or Virtual Addresses are not aligned");
+ Log_Warning("MM_Virt", "MM_Map - Physical or Virtual Addresses are not aligned (0x%P and %p)",
+ PAddr, VAddr);
//LEAVE('i', 0);
return 0;
}
MM_RefPhys( gaTmpTable[i*1024+j] & ~0xFFF );
- tmp = (void *) MM_MapTemp( gaTmpTable[i*1024+j] & ~0xFFF );
+ tmp = MM_MapTemp( gaTmpTable[i*1024+j] & ~0xFFF );
memcpy( tmp, (void *)( (i*1024+j)*0x1000 ), 0x1000 );
- MM_FreeTemp( (Uint)tmp );
+ MM_FreeTemp( tmp );
}
}
// NOTE: Max of 1 page
// `page` is the last allocated page from the previious for loop
- tmpPage = MM_MapTemp( page );
+ tmpPage = (tVAddr)MM_MapTemp( page );
memcpy( (void*)( tmpPage + (0x1000 - ContentsSize) ), StackContents, ContentsSize);
- MM_FreeTemp(tmpPage);
+ MM_FreeTemp( (void*)tmpPage );
//Log("MM_NewWorkerStack: RETURN 0x%x", base);
return base + WORKER_STACK_SIZE;
tPAddr MM_DuplicatePage(tVAddr VAddr)
{
tPAddr ret;
- Uint temp;
+ void *temp;
int wasRO = 0;
//ENTER("xVAddr", VAddr);
// Copy Data
temp = MM_MapTemp(ret);
- memcpy( (void*)temp, (void*)VAddr, 0x1000 );
+ memcpy( temp, (void*)VAddr, 0x1000 );
MM_FreeTemp(temp);
// Restore Writeable status
* \brief Create a temporary memory mapping
* \todo Show Luigi Barone (C Lecturer) and see what he thinks
*/
-tVAddr MM_MapTemp(tPAddr PAddr)
+void * MM_MapTemp(tPAddr PAddr)
{
int i;
INVLPG( TEMP_MAP_ADDR + (i << 12) );
//LEAVE('p', TEMP_MAP_ADDR + (i << 12));
Mutex_Release( &glTempMappings );
- return TEMP_MAP_ADDR + (i << 12);
+ return (void*)( TEMP_MAP_ADDR + (i << 12) );
}
Mutex_Release( &glTempMappings );
Threads_Yield(); // TODO: Use a sleep queue here instead
* \fn void MM_FreeTemp(tVAddr PAddr)
* \brief Free's a temp mapping
*/
-void MM_FreeTemp(tVAddr VAddr)
+void MM_FreeTemp(void *VAddr)
{
- int i = VAddr >> 12;
+ int i = (tVAddr)VAddr >> 12;
//ENTER("xVAddr", VAddr);
if(i >= (TEMP_MAP_ADDR >> 12))
ENTER("iPages iMaxBits pPhysAddr", Pages, MaxBits, PhysAddr);
+ if(MaxBits == -1)
+ MaxBits = PHYS_BITS;
+
// Sanity Check
if(MaxBits < 12 || !PhysAddr) {
LEAVE('i', 0);