* 0xFE - Unused
* 0xFF - System Calls / Kernel's User Code
*/
-#define DEBUG 1
+#define DEBUG 0
+#define SANITY 1
#include <acess.h>
#include <mm_phys.h>
#include <proc.h>
void MM_PreinitVirtual()
{
#if USE_PAE
- gaInitPDPT[ 0 ] = 0;
gaInitPageDir[ ((PAGE_TABLE_ADDR >> TAB)-3*512+3)*2 ] = ((tTabEnt)&gaInitPageDir - KERNEL_BASE) | 3;
#else
- gaInitPageDir[ 0 ] = 0;
gaInitPageDir[ PAGE_TABLE_ADDR >> 22 ] = ((tTabEnt)&gaInitPageDir - KERNEL_BASE) | 3;
#endif
INVLPG( PAGE_TABLE_ADDR );
#endif
}
+/**
+ * \brief Cleans up the SMP required mappings
+ */
+void MM_FinishVirtualInit()
+{
+ #if USE_PAE
+ gaInitPDPT[ 0 ] = 0;
+ #else
+ gaInitPageDir[ 0 ] = 0;
+ #endif
+}
+
/**
* \fn void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs)
* \brief Called on a page fault
}
else
{
+ //Log("MM_PageFault: COW - MM_DuplicatePage(0x%x)", Addr);
paddr = MM_DuplicatePage( Addr );
MM_DerefPhys( gaPageTable[Addr>>12] & ~0xFFF );
gaPageTable[Addr>>12] &= PF_USER;
(ErrorCode&1?"bad/locked":"non-present"),
(ErrorCode&16?" (Instruction Fetch)":"")
);
- Warning("User Pagefault: Instruction at %p accessed %p", Regs->eip, Addr);
+ Warning("User Pagefault: Instruction at %04x:%08x accessed %p", Regs->cs, Regs->eip, Addr);
__asm__ __volatile__ ("sti"); // Restart IRQs
Threads_SegFault(Addr);
return ;
//LOG("paddr = 0x%llx (new table)", paddr);
if( paddr == 0 ) {
Warning("MM_Allocate - Out of Memory (Called by %p)", __builtin_return_address(0));
- LEAVE('i',0);
+ //LEAVE('i',0);
return 0;
}
// Map
memsetd( gaTmpDir, 0, 1024 );
// Copy Tables
- for(i=0;i<768;i++)
+ for( i = 0; i < 768; i ++)
{
// Check if table is allocated
if( !(gaPageDir[i] & PF_PRESENT) ) {
Uint temp;
int wasRO = 0;
+ //ENTER("xVAddr", VAddr);
+
// Check if mapped
if( !(gaPageDir [VAddr >> 22] & PF_PRESENT) ) return 0;
if( !(gaPageTable[VAddr >> 12] & PF_PRESENT) ) return 0;
if(!wasRO) gaPageTable[VAddr >> 12] |= PF_WRITE;
INVLPG(VAddr);
+ //LEAVE('X', ret);
return ret;
}
}
/**
- * \fn tVAddr MM_MapHWPage(tPAddr PAddr, Uint Number)
+ * \fn tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
* \brief Allocates a contigous number of pages
*/
-tVAddr MM_MapHWPage(tPAddr PAddr, Uint Number)
+tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
{
int i, j;
{
phys = MM_AllocPhys();
*PhysAddr = phys;
- ret = MM_MapHWPage(phys, 1);
+ ret = MM_MapHWPages(phys, 1);
if(ret == 0) {
MM_DerefPhys(phys);
LEAVE('i', 0);
}
// Slow Allocate
- phys = MM_AllocPhysRange(Pages);
+ phys = MM_AllocPhysRange(Pages, MaxBits);
// - Was it allocated?
if(phys == 0) {
LEAVE('i', 0);
return 0;
}
- // - Check if the memory is OK
- if(phys + (Pages-1)*0x1000 > maxCheck)
- {
- // Deallocate and return 0
- for(;Pages--;phys+=0x1000)
- MM_DerefPhys(phys);
- LEAVE('i', 0);
- return 0;
- }
// Allocated successfully, now map
- ret = MM_MapHWPage(phys, Pages);
+ ret = MM_MapHWPages(phys, Pages);
if( ret == 0 ) {
// If it didn't map, free then return 0
for(;Pages--;phys+=0x1000)
}
/**
- * \fn void MM_UnmapHWPage(tVAddr VAddr, Uint Number)
+ * \fn void MM_UnmapHWPages(tVAddr VAddr, Uint Number)
* \brief Unmap a hardware page
*/
-void MM_UnmapHWPage(tVAddr VAddr, Uint Number)
+void MM_UnmapHWPages(tVAddr VAddr, Uint Number)
{
int i, j;
// Sanity Check
EXPORT(MM_GetPhysAddr);
EXPORT(MM_Map);
//EXPORT(MM_Unmap);
-EXPORT(MM_MapHWPage);
+EXPORT(MM_MapHWPages);
EXPORT(MM_AllocDMA);
-EXPORT(MM_UnmapHWPage);
+EXPORT(MM_UnmapHWPages);