From 4345b91d6b6cf764a7097b113cfbad2de2c92ce3 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 2 May 2025 14:02:58 +0100 Subject: [PATCH] get real address in devirtualize --- vg_db.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/vg_db.c b/vg_db.c index 8c2ce45..258e120 100644 --- a/vg_db.c +++ b/vg_db.c @@ -125,7 +125,7 @@ static void vg_db_touch( vg_db *db, u16 cache_id ) 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); @@ -140,6 +140,7 @@ static void *vg_db_devirtualize( vg_db *db, u64 address, bool write ) { 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 @@ -193,12 +194,13 @@ static void *vg_db_devirtualize( vg_db *db, u64 address, bool write ) 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; } @@ -213,10 +215,16 @@ void vg_db_xch( vg_db *db, u64 base_address, void *buf, u32 length, bool write ) 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; } } -- 2.25.1