int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi);
int MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi);
tVAddr MM_NewUserStack(void);
-tPAddr MM_AllocateZero(tVAddr VAddr);
+//tPAddr MM_AllocateZero(volatile void *VAddr);
tPAddr MM_AllocateRootTable(void);
void MM_int_CloneTable(Uint32 *DestEnt, int Table);
tPAddr MM_Clone(int ClearUser);
return pi.PhysAddr | ((tVAddr)Ptr & ((1 << pi.Size)-1));
}
-Uint MM_GetFlags(tVAddr VAddr)
+Uint MM_GetFlags(const volatile void *VAddr)
{
tMM_PageInfo pi;
int ret;
- if( MM_int_GetPageInfo(VAddr, &pi) )
+ if( MM_int_GetPageInfo((tVAddr)VAddr, &pi) )
return 0;
ret = 0;
return ret;
}
-void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask)
+void MM_SetFlags(volatile void *VAddr, Uint Flags, Uint Mask)
{
tMM_PageInfo pi;
Uint curFlags;
- if( MM_int_GetPageInfo(VAddr, &pi) )
+ if( MM_int_GetPageInfo((tVAddr)VAddr, &pi) )
return ;
curFlags = MM_GetFlags(VAddr);
pi.bExecutable = !!(curFlags & MM_PFLAG_EXEC);
- MM_int_SetPageInfo(VAddr, &pi);
+ MM_int_SetPageInfo((tVAddr)VAddr, &pi);
}
int MM_IsValidBuffer(tVAddr Addr, size_t Size)
Size += Addr & (PAGE_SIZE-1);
Addr &= ~(PAGE_SIZE-1);
- if( MM_int_GetPageInfo(Addr, &pi) ) return 0;
+ if( MM_int_GetPageInfo((tVAddr)Addr, &pi) ) return 0;
Addr += PAGE_SIZE;
if(pi.AP != AP_KRW_ONLY && pi.AP != AP_KRO_ONLY)
return 1;
}
-int MM_Map(tVAddr VAddr, tPAddr PAddr)
+int MM_Map(volatile void *VAddr, tPAddr PAddr)
{
tMM_PageInfo pi = {0};
#if TRACE_MAPS
Log("MM_Map %P=>%p", PAddr, VAddr);
#endif
+ // TODO: Double check that an address isn't being clobbered
+
pi.PhysAddr = PAddr;
pi.Size = 12;
- if(VAddr < USER_STACK_TOP)
- pi.AP = AP_RW_BOTH;
- else
- pi.AP = AP_KRW_ONLY; // Kernel Read/Write
+ pi.AP = ( (tVAddr)VAddr < USER_STACK_TOP ? AP_RW_BOTH : AP_KRW_ONLY );
pi.bExecutable = 1;
- if( MM_int_SetPageInfo(VAddr, &pi) ) {
+ if( MM_int_SetPageInfo( (tVAddr)VAddr, &pi) ) {
// MM_DerefPhys(pi.PhysAddr);
return 0;
}
return pi.PhysAddr;
}
-tPAddr MM_Allocate(tVAddr VAddr)
+tPAddr MM_Allocate(volatile void *VAddr)
{
tMM_PageInfo pi = {0};
pi.PhysAddr = MM_AllocPhys();
if( pi.PhysAddr == 0 ) LEAVE_RET('i', 0);
pi.Size = 12;
- if(VAddr < USER_STACK_TOP)
- pi.AP = AP_RW_BOTH;
- else
- pi.AP = AP_KRW_ONLY;
+ pi.AP = ( (tVAddr)VAddr < USER_STACK_TOP ? AP_RW_BOTH : AP_KRW_ONLY );
pi.bExecutable = 0;
- if( MM_int_SetPageInfo(VAddr, &pi) ) {
+ if( MM_int_SetPageInfo( (tVAddr)VAddr, &pi ) )
+ {
MM_DerefPhys(pi.PhysAddr);
LEAVE('i', 0);
return 0;
return pi.PhysAddr;
}
-tPAddr MM_AllocateZero(tVAddr VAddr)
+void MM_AllocateZero(volatile void *VAddr)
{
if( !giMM_ZeroPage ) {
giMM_ZeroPage = MM_Allocate(VAddr);
MM_Map(VAddr, giMM_ZeroPage);
}
MM_SetFlags(VAddr, MM_PFLAG_COW, MM_PFLAG_COW);
- return giMM_ZeroPage;
}
-void MM_Deallocate(tVAddr VAddr)
+void MM_Deallocate(volatile void *VAddr)
{
tMM_PageInfo pi;
- if( MM_int_GetPageInfo(VAddr, &pi) ) return ;
+ if( MM_int_GetPageInfo((tVAddr)VAddr, &pi) ) return ;
if( pi.PhysAddr == 0 ) return;
MM_DerefPhys(pi.PhysAddr);
pi.PhysAddr = 0;
pi.AP = 0;
pi.bExecutable = 0;
- MM_int_SetPageInfo(VAddr, &pi);
+ MM_int_SetPageInfo((tVAddr)VAddr, &pi);
}
tPAddr MM_AllocateRootTable(void)
void *MM_MapTemp(tPAddr PAddr)
{
- tVAddr ret;
- tMM_PageInfo pi;
-
- for( ret = MM_TMPMAP_BASE; ret < MM_TMPMAP_END - PAGE_SIZE; ret += PAGE_SIZE )
+ for( tVAddr ret = MM_TMPMAP_BASE; ret < MM_TMPMAP_END - PAGE_SIZE; ret += PAGE_SIZE )
{
+ tMM_PageInfo pi;
+
if( MM_int_GetPageInfo(ret, &pi) == 0 )
continue;
// Log("MapTemp %P at %p by %p", PAddr, ret, __builtin_return_address(0));
MM_RefPhys(PAddr); // Counter the MM_Deallocate in FreeTemp
- MM_Map(ret, PAddr);
+ MM_Map( (void*)ret, PAddr );
return (void*)ret;
}
return ;
}
- MM_Deallocate(VAddr);
+ MM_Deallocate(Ptr);
}
void *MM_MapHWPages(tPAddr PAddr, Uint NPages)
// Map the pages
for( i = 0; i < NPages; i ++ )
- MM_Map(ret+i*PAGE_SIZE, PAddr+i*PAGE_SIZE);
+ MM_Map( (tPage*)ret + i, PAddr+i*PAGE_SIZE);
// and return
LEAVE('p', ret);
return (void*)ret;
return ret;
}
-void MM_UnmapHWPages(tVAddr Vaddr, Uint Number)
+void MM_UnmapHWPages(volatile void *VAddr, Uint Number)
{
Log_Error("MMVirt", "TODO: Implement MM_UnmapHWPages");
}
}
// 1 guard page
+ tPage *pageptr = (void*)(addr + PAGE_SIZE);
for( ofs = PAGE_SIZE; ofs < MM_KSTACK_SIZE; ofs += PAGE_SIZE )
{
- if( MM_Allocate(addr + ofs) == 0 )
+ if( MM_Allocate( pageptr ) == 0 )
{
while(ofs)
{
ofs -= PAGE_SIZE;
- MM_Deallocate(addr + ofs);
+ MM_Deallocate( pageptr-- );
}
Log_Warning("MMVirt", "MM_NewKStack: Unable to allocate");
return 0;
}
// 1 guard page
- for( ofs = PAGE_SIZE; ofs < USER_STACK_SIZE; ofs += PAGE_SIZE )
+ tPage *pageptr = (void*)addr;
+ for( ofs = PAGE_SIZE; ofs < USER_STACK_SIZE; ofs += PAGE_SIZE, pageptr ++ )
{
- tPAddr rv;
- if(ofs >= USER_STACK_SIZE - USER_STACK_COMM)
- rv = MM_Allocate(addr + ofs);
- else
- rv = MM_AllocateZero(addr + ofs);
- if(rv == 0)
- {
- while(ofs)
+ if(ofs >= USER_STACK_SIZE - USER_STACK_COMM) {
+ tPAddr rv = MM_Allocate(pageptr);
+ if(rv == 0)
{
- ofs -= PAGE_SIZE;
- MM_Deallocate(addr + ofs);
+ while(ofs)
+ {
+ ofs -= PAGE_SIZE;
+ MM_Deallocate(pageptr --);
+ }
+ Log_Warning("MMVirt", "MM_NewUserStack: Unable to allocate");
+ return 0;
}
- Log_Warning("MMVirt", "MM_NewUserStack: Unable to allocate");
- return 0;
}
- MM_SetFlags(addr+ofs, 0, MM_PFLAG_KERNEL);
+ else {
+ MM_AllocateZero(pageptr);
+ }
+ MM_SetFlags(pageptr, 0, MM_PFLAG_KERNEL);
}
Log("Return %p", addr + ofs);
// MM_DumpTables(0, 0x80000000);