X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Finclude%2Ftpl_mm_phys_bitmap.h;h=424a3ea427398937c803397558662127fc7a99f5;hb=af67042b8d7f05fe76583aef1afb2022b519a1aa;hp=cf3018f05f8f39c485d1eecb14b6b1fcf0b37f52;hpb=11dbd684e9a3d907d43d71a3145205f1a86992fb;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/include/tpl_mm_phys_bitmap.h b/KernelLand/Kernel/include/tpl_mm_phys_bitmap.h index cf3018f0..424a3ea4 100644 --- a/KernelLand/Kernel/include/tpl_mm_phys_bitmap.h +++ b/KernelLand/Kernel/include/tpl_mm_phys_bitmap.h @@ -9,6 +9,7 @@ * * Uses 4.125+PtrSize bytes per page */ +#include #define MM_PAGE_REFCOUNTS MM_PMM_BASE #define MM_PAGE_NODES (MM_PMM_BASE+(MM_MAXPHYSPAGE*sizeof(Uint32))) @@ -27,7 +28,6 @@ int MM_int_GetRangeID( tPAddr Addr ); int MM_int_GetMapEntry( void *Data, int Index, tPAddr *Start, tPAddr *Length ); void MM_Tpl_InitPhys(int MaxRAMPage, void *MemoryMap); -void MM_DumpStatistics(void); // === GLOBALS === tMutex glPhysicalPages; @@ -83,8 +83,8 @@ void MM_Tpl_InitPhys(int MaxRAMPage, void *MemoryMap) bitmap_page &= ~(PAGE_SIZE-1); // Only need to allocate bitmaps - if( !MM_GetPhysAddr( bitmap_page ) ) { - if( !MM_Allocate( bitmap_page ) ) { + if( !MM_GetPhysAddr( (void*)bitmap_page ) ) { + if( !MM_Allocate( (void*)bitmap_page ) ) { Log_KernelPanic("PMM", "Out of memory during init, this is bad"); return ; } @@ -220,7 +220,7 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits) LOG("if( MM_GetPhysAddr( %p ) )", &gaiPageReferences[addr]); // Mark as referenced if the reference count page is valid - if( MM_GetPhysAddr( (tVAddr)&gaiPageReferences[addr] ) ) { + if( MM_GetPhysAddr( &gaiPageReferences[addr] ) ) { gaiPageReferences[addr] = 1; } } @@ -276,7 +276,7 @@ tPAddr MM_AllocPhys(void) tPAddr ret = 0; for( ret = 0; ret < giMaxPhysPage; ret ++ ) { - if( !MM_GetPhysAddr( (tVAddr)&gaPageBitmaps[ret/32] ) ) { + if( !MM_GetPhysAddr( &gaPageBitmaps[ret/32] ) ) { ret += PAGE_SIZE*8; continue ; } @@ -317,16 +317,16 @@ void MM_RefPhys(tPAddr PAddr) if( gaPageBitmaps[page / 32] == 0 ) gaSuperBitmap[page / (32*32)] &= ~(1LL << ((page / 32) & 31)); #endif - if( MM_GetPhysAddr( refpage ) ) + if( MM_GetPhysAddr( (void*)refpage ) ) gaiPageReferences[page] = 1; } else { // Reference again - if( !MM_GetPhysAddr( refpage ) ) + if( !MM_GetPhysAddr( (void*)refpage ) ) { int pages_per_page, basepage, i; - if( MM_Allocate(refpage) == 0 ) { + if( MM_Allocate( (void*) refpage) == 0 ) { // Out of memory, can this be resolved? // TODO: Reclaim memory Log_Error("PMM", "Out of memory (MM_RefPhys)"); @@ -350,11 +350,17 @@ void MM_RefPhys(tPAddr PAddr) int MM_GetRefCount(tPAddr PAddr) { PAddr >>= 12; - if( MM_GetPhysAddr( (tVAddr)&gaiPageReferences[PAddr] ) ) { + if( MM_GetPhysAddr( &gaiPageReferences[PAddr] ) ) { return gaiPageReferences[PAddr]; } - if( gaPageBitmaps[ PAddr / 32 ] & (1LL << (PAddr&31)) ) { + Uint32 *bm = &gaPageBitmaps[ PAddr / 32 ]; + if( !MM_GetPhysAddr(bm) ) { + Log_Error("MMPhys", "MM_GetRefCount: bitmap for ppage 0x%x not mapped %p", + PAddr, bm); + return 0; + } + if( (*bm) & (1LL << (PAddr&31)) ) { return 1; } @@ -372,7 +378,7 @@ void MM_DerefPhys(tPAddr PAddr) ENTER("PPAddr", PAddr); - if( MM_GetPhysAddr( (tVAddr)&gaiPageReferences[page] ) ) + if( MM_GetPhysAddr( &gaiPageReferences[page] ) ) { if( gaiPageReferences[page] > 0 ) gaiPageReferences[ page ] --; @@ -384,7 +390,7 @@ void MM_DerefPhys(tPAddr PAddr) else gaPageBitmaps[ page / 32 ] |= 1 << (page&31); // Clear node if needed - if( MM_GetPhysAddr( (tVAddr)&gapPageNodes[page] ) ) { + if( MM_GetPhysAddr( &gapPageNodes[page] ) ) { gapPageNodes[page] = NULL; // TODO: Catch when all pages in this range are not using nodes } @@ -415,8 +421,8 @@ int MM_SetPageNode(tPAddr PAddr, void *Node) if( !MM_GetRefCount(PAddr) ) return 1; - if( !MM_GetPhysAddr(node_page) ) { - if( !MM_Allocate(node_page) ) + if( !MM_GetPhysAddr( (void*)node_page ) ) { + if( !MM_Allocate( (void*)node_page) ) return -1; memset( (void*)node_page, 0, PAGE_SIZE ); } @@ -430,7 +436,7 @@ int MM_GetPageNode(tPAddr PAddr, void **Node) if( !MM_GetRefCount(PAddr) ) return 1; PAddr >>= 12; - if( !MM_GetPhysAddr( (tVAddr)&gapPageNodes[PAddr] ) ) { + if( !MM_GetPhysAddr( &gapPageNodes[PAddr] ) ) { *Node = NULL; return 0; }