Commit cf98951b82adefb46318b3ed45c8456aac2b9575

Authored by bellard
1 parent f72b519c

force boot sector feature


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@616 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 19 additions and 1 deletions
@@ -55,6 +55,9 @@ struct BlockDriverState { @@ -55,6 +55,9 @@ struct BlockDriverState {
55 int cow_bitmap_size; 55 int cow_bitmap_size;
56 int cow_fd; 56 int cow_fd;
57 int64_t cow_sectors_offset; 57 int64_t cow_sectors_offset;
  58 + int boot_sector_enabled;
  59 + uint8_t boot_sector_data[512];
  60 +
58 char filename[1024]; 61 char filename[1024];
59 }; 62 };
60 63
@@ -262,6 +265,10 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num, @@ -262,6 +265,10 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
262 if (is_changed(bs->cow_bitmap, sector_num, nb_sectors, &n)) { 265 if (is_changed(bs->cow_bitmap, sector_num, nb_sectors, &n)) {
263 fd = bs->cow_fd; 266 fd = bs->cow_fd;
264 offset = bs->cow_sectors_offset; 267 offset = bs->cow_sectors_offset;
  268 + } else if (sector_num == 0 && bs->boot_sector_enabled) {
  269 + memcpy(buf, bs->boot_sector_data, 512);
  270 + n = 1;
  271 + goto next;
265 } else { 272 } else {
266 fd = bs->fd; 273 fd = bs->fd;
267 offset = 0; 274 offset = 0;
@@ -278,6 +285,7 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num, @@ -278,6 +285,7 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
278 return -1; 285 return -1;
279 } 286 }
280 } 287 }
  288 + next:
281 nb_sectors -= n; 289 nb_sectors -= n;
282 sector_num += n; 290 sector_num += n;
283 buf += n * 512; 291 buf += n * 512;
@@ -291,7 +299,7 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num, @@ -291,7 +299,7 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
291 { 299 {
292 int ret, fd, i; 300 int ret, fd, i;
293 int64_t offset, retl; 301 int64_t offset, retl;
294 - 302 +
295 if (bs->read_only) 303 if (bs->read_only)
296 return -1; 304 return -1;
297 305
@@ -324,3 +332,13 @@ void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr) @@ -324,3 +332,13 @@ void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
324 { 332 {
325 *nb_sectors_ptr = bs->total_sectors; 333 *nb_sectors_ptr = bs->total_sectors;
326 } 334 }
  335 +
  336 +/* force a given boot sector. */
  337 +void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size)
  338 +{
  339 + bs->boot_sector_enabled = 1;
  340 + if (size > 512)
  341 + size = 512;
  342 + memcpy(bs->boot_sector_data, data, size);
  343 + memset(bs->boot_sector_data + size, 0, 512 - size);
  344 +}