+ return gaPageInfo[ PAddr ].ReferenceCount;
+}
+
+/**
+ * \brief Sets the node and offset associated with a page
+ */
+int MM_SetPageInfo(tPAddr PAddr, void *Node, Uint64 Offset)
+{
+ PAddr >>= 12;
+
+ // Page doesn't exist
+ if( !(gaPageBitmap[PAddr / 32] & (1 << PAddr%32)) )
+ return 1;
+ // Allocate info block
+ if( MM_GetPhysAddr( (tVAddr)&gaPageInfo[PAddr] ) == 0 )
+ {
+ tVAddr addr = ((tVAddr)&gaPageInfo[PAddr]) & ~0xFFF;
+ Log_Debug("PMem", "MM_SetPageInfo: Info not allocated %llx", PAddr);
+ if( MM_Allocate( addr ) == 0 ) {
+ Log_KernelPanic("PMem", "MM_SetPageInfo: Out of physical memory");
+ }
+ memset( (void*)addr, 0, 0x1000);
+ }
+
+ gaPageInfo[ PAddr ].Node = Node;
+ gaPageInfo[ PAddr ].Offset = Offset;
+
+ return 0;
+}
+
+/**
+ * \brief Gets the Node/Offset of a page
+ */
+int MM_GetPageInfo(tPAddr PAddr, void **Node, Uint64 *Offset)
+{
+ PAddr >>= 12;
+
+ // Page doesn't exist
+ if( !(gaPageBitmap[PAddr / 32] & (1 << PAddr%32)) )
+ return 1;
+ // Info is zero if block is not allocated
+ if( MM_GetPhysAddr( (tVAddr)&gaPageInfo[PAddr] ) == 0 )
+ {
+ if(Node) *Node = NULL;
+ if(Offset) *Offset = 0;
+ }
+ else
+ {
+ if(Node) *Node = gaPageInfo[ PAddr ].Node;
+ if(Offset) *Offset = gaPageInfo[ PAddr ].Offset;
+ }
+
+ return 0;