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 55 int cow_bitmap_size;
56 56 int cow_fd;
57 57 int64_t cow_sectors_offset;
  58 + int boot_sector_enabled;
  59 + uint8_t boot_sector_data[512];
  60 +
58 61 char filename[1024];
59 62 };
60 63  
... ... @@ -262,6 +265,10 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
262 265 if (is_changed(bs->cow_bitmap, sector_num, nb_sectors, &n)) {
263 266 fd = bs->cow_fd;
264 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 272 } else {
266 273 fd = bs->fd;
267 274 offset = 0;
... ... @@ -278,6 +285,7 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
278 285 return -1;
279 286 }
280 287 }
  288 + next:
281 289 nb_sectors -= n;
282 290 sector_num += n;
283 291 buf += n * 512;
... ... @@ -291,7 +299,7 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
291 299 {
292 300 int ret, fd, i;
293 301 int64_t offset, retl;
294   -
  302 +
295 303 if (bs->read_only)
296 304 return -1;
297 305  
... ... @@ -324,3 +332,13 @@ void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
324 332 {
325 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 +}
... ...