* 0xFE - Unused
* 0xFF - System Calls / Kernel's User Code
*/
+#define DEBUG 1
#include <common.h>
#include <mm_phys.h>
#include <proc.h>
&& gaPageTable[Addr>>12] & PF_COW )
{
tPAddr paddr;
- if(MM_GetRefCount( gaPageTable[Addr>>12] & ~0xFFF ) == 0)
+ if(MM_GetRefCount( gaPageTable[Addr>>12] & ~0xFFF ) == 1)
{
gaPageTable[Addr>>12] &= ~PF_COW;
gaPageTable[Addr>>12] |= PF_PRESENT|PF_WRITE;
gaPageTable[Addr>>12] &= PF_USER;
gaPageTable[Addr>>12] |= paddr|PF_PRESENT|PF_WRITE;
}
+ //LOG("Duplicated page at %p to 0x%x", Addr&~0xFFF, gaPageTable[Addr>>12]);
INVLPG( Addr & ~0xFFF );
//LEAVE('-')
return;
// Allocate
paddr = MM_AllocPhys();
if( paddr == 0 ) {
- Warning("MM_Allocate - Out of Memory (Called by %p)", __builtin_return_address(0));
+ Warning("MM_Allocate - Out of Memory when allocating at %p (Called by %p)",
+ VAddr, __builtin_return_address(0));
return 0;
}
// Map
Uint MM_Clone()
{
Uint i, j;
- Uint kStackBase = gCurrentThread->KernelStack - KERNEL_STACK_SIZE;
+ Uint page = 0;
+ Uint kStackBase = Proc_GetCurThread()->KernelStack - KERNEL_STACK_SIZE;
void *tmp;
//ENTER("");
// Check if table is allocated
if( !(gaPageDir[i] & PF_PRESENT) ) {
gaTmpDir[i] = 0;
+ page += 1024;
continue;
}
// Allocate new table
gaTmpDir[i] = MM_AllocPhys() | (gaPageDir[i] & 7);
- INVLPG( &gaTmpTable[i*1024] );
+ INVLPG( &gaTmpTable[page] );
// Fill
- for( j = 0; j < 1024; j ++ )
+ for( j = 0; j < 1024; j ++, page++ )
{
- if( !(gaPageTable[i*1024+j] & PF_PRESENT) ) {
- gaTmpTable[i*1024+j] = 0;
+ if( !(gaPageTable[page] & PF_PRESENT) ) {
+ gaTmpTable[page] = 0;
continue;
}
// Refrence old page
- MM_RefPhys( gaPageTable[i*1024+j] & ~0xFFF );
+ MM_RefPhys( gaPageTable[page] & ~0xFFF );
// Add to new table
- if(gaPageTable[i*1024+j] & PF_WRITE) {
- gaTmpTable[i*1024+j] = (gaPageTable[i*1024+j] & ~PF_WRITE) | PF_COW;
- gaPageTable[i*1024+j] = (gaPageTable[i*1024+j] & ~PF_WRITE) | PF_COW;
+ if(gaPageTable[page] & PF_WRITE) {
+ gaTmpTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW;
+ gaPageTable[page] = (gaPageTable[page] & ~PF_WRITE) | PF_COW;
+ INVLPG( page << 12 );
}
else
- gaTmpTable[i*1024+j] = gaPageTable[i*1024+j];
+ gaTmpTable[page] = gaPageTable[page];
}
}
return TEMP_MAP_ADDR + (i << 12);
}
RELEASE( &gilTempMappings );
- Proc_Yield();
+ Threads_Yield();
}
}