]> xenbits.xensource.com Git - qemu-xen-4.4-testing.git/commitdiff
force boot sector feature
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 16 Feb 2004 21:56:36 +0000 (21:56 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 16 Feb 2004 21:56:36 +0000 (21:56 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@616 c046a42c-6fe2-441c-8c8c-71466251a162

block.c

diff --git a/block.c b/block.c
index 3e1ae0da21ef11ea28db1dd2cbdd634adb9c6bc1..6a1701a5ba2c9bee46cba9b632b5696fcc4e2bfb 100644 (file)
--- a/block.c
+++ b/block.c
@@ -55,6 +55,9 @@ struct BlockDriverState {
     int cow_bitmap_size;
     int cow_fd;
     int64_t cow_sectors_offset;
+    int boot_sector_enabled;
+    uint8_t boot_sector_data[512];
+
     char filename[1024];
 };
 
@@ -262,6 +265,10 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
         if (is_changed(bs->cow_bitmap, sector_num, nb_sectors, &n)) {
             fd = bs->cow_fd;
             offset = bs->cow_sectors_offset;
+        } else if (sector_num == 0 && bs->boot_sector_enabled) {
+            memcpy(buf, bs->boot_sector_data, 512);
+            n = 1;
+            goto next;
         } else {
             fd = bs->fd;
             offset = 0;
@@ -278,6 +285,7 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
                 return -1;
             }
         }
+    next:
         nb_sectors -= n;
         sector_num += n;
         buf += n * 512;
@@ -291,7 +299,7 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 {
     int ret, fd, i;
     int64_t offset, retl;
-
+    
     if (bs->read_only)
         return -1;
 
@@ -324,3 +332,13 @@ void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
 {
     *nb_sectors_ptr = bs->total_sectors;
 }
+
+/* force a given boot sector. */
+void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size)
+{
+    bs->boot_sector_enabled = 1;
+    if (size > 512)
+        size = 512;
+    memcpy(bs->boot_sector_data, data, size);
+    memset(bs->boot_sector_data + size, 0, 512 - size);
+}