X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farm7%2Fmm_virt.c;h=4d453f44578e9975d75739af7c4b3ec8e52977a5;hb=28eafc7611ec3d3f840845ec2b54025affd7bc1e;hp=78f05c622758cc095bf3929060b3db7dd2e6d31f;hpb=7ca8dd27be34ef1a089e42b9b5518e64c9d4dd11;p=tpg%2Facess2.git diff --git a/Kernel/arch/arm7/mm_virt.c b/Kernel/arch/arm7/mm_virt.c index 78f05c62..4d453f44 100644 --- a/Kernel/arch/arm7/mm_virt.c +++ b/Kernel/arch/arm7/mm_virt.c @@ -6,6 +6,7 @@ */ #include #include +#include #define AP_KRW_ONLY 0x1 #define AP_KRO_ONLY 0x5 @@ -25,6 +26,8 @@ typedef struct } tMM_PageInfo; // === PROTOTYPES === +void MM_int_GetTables(tVAddr VAddr, Uint32 **Table0, Uint32 **Table1); + int MM_int_AllocateCoarse(tVAddr VAddr, int Domain); int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi); int MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi); @@ -36,20 +39,60 @@ int MM_InitialiseVirtual(void) return 0; } -int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi) +void MM_int_GetTables(tVAddr VAddr, Uint32 **Table0, Uint32 **Table1) +{ + if(VAddr & 0x80000000) { + *Table0 = (void*)MM_TABLE0KERN; // Level 0 + *Table1 = (void*)MM_TABLE1KERN; // Level 1 + } + else { + *Table0 = (void*)MM_TABLE0USER; + *Table1 = (void*)MM_TABLE1USER; + } +} + +int MM_int_AllocateCoarse(tVAddr VAddr, int Domain) { Uint32 *table0, *table1; Uint32 *desc; + tPAddr paddr; + + MM_int_GetTables(VAddr, &table0, &table1); + + VAddr &= ~(0x400000-1); // 4MiB per "block", 1 Page - if(VAddr & 0x80000000 ) { - table0 = (void*)MM_TABLE0KERN; // Level 0 - table1 = (void*)MM_TABLE1KERN; // Level 1 + desc = &table0[VAddr>>20]; + + if( (desc[0] & 3) != 0 || (desc[1] & 3) != 0 + || (desc[2] & 3) != 0 || (desc[3] & 3) != 0 ) + { + // Error? + return 1; } - else { - table0 = (void*)MM_TABLE0USER; - table1 = (void*)MM_TABLE1USER; + + paddr = MM_AllocPhys(); + if( !paddr ) + { + // Error + return 2; } - VAddr &= 0x7FFFFFFF; + + *desc = paddr | (Domain << 5) | 1; + desc[1] = desc[0] + 0x400; + desc[2] = desc[0] + 0x800; + desc[3] = desc[0] + 0xC00; + + table1[(VAddr>>20)*256] = paddr | 3; + + return 0; +} + +int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi) +{ + Uint32 *table0, *table1; + Uint32 *desc; + + MM_int_GetTables(VAddr, &table0, &table1); desc = &table0[ VAddr >> 20 ]; @@ -58,11 +101,7 @@ int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi) case 12: // Small Page case 16: // Large Page if( (*desc & 3) == 0 ) { - if( pi->PhysAddr == 0 ) return 0; - // Allocate - *desc = MM_AllocPhys(); - *desc |= pi->Domain << 5; - *desc |= 1; + MM_int_AllocateCoarse( VAddr, pi->Domain ); } desc = &table1[ VAddr >> 12 ]; if( pi->Size == 12 ) @@ -121,16 +160,8 @@ int MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi) { Uint32 *table0, *table1; Uint32 desc; - - if(VAddr & 0x80000000 ) { - table0 = (void*)MM_TABLE0KERN; // Level 0 - table1 = (void*)MM_TABLE1KERN; // Level 1 - } - else { - table0 = (void*)MM_TABLE0USER; - table1 = (void*)MM_TABLE1USER; - } - VAddr &= 0x7FFFFFFF; + + MM_int_GetTables(VAddr, &table0, &table1); desc = table0[ VAddr >> 20 ]; @@ -296,3 +327,21 @@ void MM_Deallocate(tVAddr VAddr) pi.bExecutable = 0; MM_int_SetPageInfo(VAddr, &pi); } + +tPAddr MM_ClearUser(void) +{ + // TODO: Implement ClearUser + return 0; +} + +tVAddr MM_MapTemp(tPAddr PAddr) +{ + // TODO: Implement MapTemp + return 0; +} + +void MM_FreeTemp(tVAddr VAddr) +{ + // TODO: Implement FreeTemp +} +