force boot sector feature


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@616 c046a42c-6fe2-441c-8c8c-71466251a162
diff --git a/block.c b/block.c
index 3e1ae0d..6a1701a 100644
--- a/block.c
+++ b/block.c
@@ -55,6 +55,9 @@
     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 @@
         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 @@
                 return -1;
             }
         }
+    next:
         nb_sectors -= n;
         sector_num += n;
         buf += n * 512;
@@ -291,7 +299,7 @@
 {
     int ret, fd, i;
     int64_t offset, retl;
-
+    
     if (bs->read_only)
         return -1;
 
@@ -324,3 +332,13 @@
 {
     *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);
+}