+ tVAddr ref_base = ((tVAddr)&gaiPageReferences[ page ]) & ~0xFFF;
+ // Allocate reference page
+ if( !MM_GetPhysAddr(ref_base) )
+ {
+ const int pages_per_refpage = PAGE_SIZE/sizeof(gaiPageReferences[0]);
+ int i;
+ int page_base = page / pages_per_refpage * pages_per_refpage;
+ if( !MM_Allocate( ref_base ) ) {
+ Log_Error("Arch", "Out of memory when allocating reference count page");
+ return ;
+ }
+ // Fill block
+ Log("Allocated references for %P-%P", page_base << 12, (page_base+pages_per_refpage)<<12);
+ for( i = 0; i < pages_per_refpage; i ++ ) {
+ int pg = page_base + i;
+ gaiPageReferences[pg] = !!PAGE_ALLOC_TEST(pg);
+ }
+ }
+ gaiPageReferences[page] ++;