X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Finclude%2Ftpl_mm_phys_bitmap.h;h=106efd75b2d9f0fc9ae7bfbd73bbd133a0be0a73;hb=bb3e698f1c68cc638eb070d848293ec6a30cb813;hp=cf3018f05f8f39c485d1eecb14b6b1fcf0b37f52;hpb=ff00630ed805237683c2f8fa47765a1cf5a07578;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..106efd75 100644 --- a/KernelLand/Kernel/include/tpl_mm_phys_bitmap.h +++ b/KernelLand/Kernel/include/tpl_mm_phys_bitmap.h @@ -83,7 +83,7 @@ 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_GetPhysAddr( (void*)bitmap_page ) ) { if( !MM_Allocate( 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,13 +317,13 @@ 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 ) { @@ -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,7 +421,7 @@ int MM_SetPageNode(tPAddr PAddr, void *Node) if( !MM_GetRefCount(PAddr) ) return 1; - if( !MM_GetPhysAddr(node_page) ) { + if( !MM_GetPhysAddr( (void*)node_page ) ) { if( !MM_Allocate(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; }