X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Finclude%2Ftpl_mm_phys_bitmap.h;h=89c942b096b6ca53ce4ca865aa9a45cab5056c10;hb=7c5a60c8be053f65ecceb47be773ea21a050b186;hp=76a3810413030d56fdd16365d0ecdc65ce99183c;hpb=7ca8dd27be34ef1a089e42b9b5518e64c9d4dd11;p=tpg%2Facess2.git diff --git a/Kernel/include/tpl_mm_phys_bitmap.h b/Kernel/include/tpl_mm_phys_bitmap.h index 76a38104..89c942b0 100644 --- a/Kernel/include/tpl_mm_phys_bitmap.h +++ b/Kernel/include/tpl_mm_phys_bitmap.h @@ -307,6 +307,20 @@ void MM_RefPhys(tPAddr PAddr) } } +int MM_GetRefCount(tPAddr PAddr) +{ + PAddr >>= 12; + if( MM_GetPhysAddr( (tVAddr)&gaiPageReferences[PAddr] ) ) { + return gaiPageReferences[PAddr]; + } + + if( gaPageBitmaps[ PAddr / 32 ] & (1LL << (PAddr&31)) ) { + return 1; + } + + return 0; +} + /** * \brief Dereference a physical page */ @@ -353,3 +367,34 @@ void MM_DerefPhys(tPAddr PAddr) #endif } +int MM_SetPageNode(tPAddr PAddr, void *Node) +{ + tPAddr page = PAddr >> 12; + tVAddr node_page = ((tVAddr)&gapPageNodes[page]) & ~(PAGE_SIZE-1); + + if( !MM_GetRefCount(PAddr) ) return 1; + + if( !MM_GetPhysAddr(node_page) ) { + if( !MM_Allocate(node_page) ) + return -1; + memset( (void*)node_page, 0, PAGE_SIZE ); + } + + gapPageNodes[page] = Node; + return 0; +} + +int MM_GetPageNode(tPAddr PAddr, void **Node) +{ + if( !MM_GetRefCount(PAddr) ) return 1; + PAddr >>= 12; + + if( !MM_GetPhysAddr( (tVAddr)&gapPageNodes[PAddr] ) ) { + *Node = NULL; + return 0; + } + + *Node = gapPageNodes[PAddr]; + return 0; +} +