db->lru_old = cache_id;
}
-static void *vg_db_devirtualize( vg_db *db, u64 address, bool write )
+static void *vg_db_devirtualize( vg_db *db, u64 address, bool write, u64 *out_physical_address )
{
u64 page_base = address & ~(VG_PAGE_SIZE-1lu),
inner_offset = address & (VG_PAGE_SIZE-1lu);
{
page->unwritten |= write;
vg_db_touch( db, current );
+ *out_physical_address = page->physical_offset + inner_offset;
return db->page_data + ((u64)(current-1)*VG_PAGE_SIZE + inner_offset);
}
else
page->physical_offset = translated_page_base;
page->unwritten = write;
- /* read into memory */
+ /* read entire page into memory */
void *page_data = db->page_data + (u64)(cache_id-1)*VG_PAGE_SIZE;
if( fseek( db->fp, translated_page_base, SEEK_SET ) )
vg_db_abort( db, "SEEK_SET (%lx) failed\n", translated_page_base );
if( !fread( page_data, VG_PAGE_SIZE, 1, db->fp ) )
vg_db_abort( db, "fread page failed\n" );
+ *out_physical_address = translated_page_base + inner_offset;
return page_data + inner_offset;
}
if( address + byte_count > end )
byte_count = end - address;
- void *cache_buffer = vg_db_devirtualize( db, address, write ),
+ u64 physical_address = 0;
+ void *cache_buffer = vg_db_devirtualize( db, address, write, &physical_address ),
*user_buffer = buf + (address-base_address);
- if( write ) memcpy( cache_buffer, user_buffer, byte_count );
- else memcpy( user_buffer, cache_buffer, byte_count );
+ if( write )
+ {
+ memcpy( cache_buffer, user_buffer, byte_count );
+ }
+ else
+ memcpy( user_buffer, cache_buffer, byte_count );
+
address += byte_count;
}
}