get real address in devirtualize
authorhgn <hgodden00@gmail.com>
Fri, 2 May 2025 13:02:58 +0000 (14:02 +0100)
committerhgn <hgodden00@gmail.com>
Fri, 2 May 2025 13:02:58 +0000 (14:02 +0100)
vg_db.c

diff --git a/vg_db.c b/vg_db.c
index 8c2ce45c471281aea45c489dc008e6fabfb99784..258e1209d2c9d760ee16e7c9d02766912c931f09 100644 (file)
--- 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;
    }
 }