mirror of https://github.com/proxmox/mirror_qemu
force boot sector feature
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@616 c046a42c-6fe2-441c-8c8c-71466251a162master
parent
f72b519c86
commit
cf98951b82
20
block.c
20
block.c
|
@ -55,6 +55,9 @@ struct BlockDriverState {
|
||||||
int cow_bitmap_size;
|
int cow_bitmap_size;
|
||||||
int cow_fd;
|
int cow_fd;
|
||||||
int64_t cow_sectors_offset;
|
int64_t cow_sectors_offset;
|
||||||
|
int boot_sector_enabled;
|
||||||
|
uint8_t boot_sector_data[512];
|
||||||
|
|
||||||
char filename[1024];
|
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)) {
|
if (is_changed(bs->cow_bitmap, sector_num, nb_sectors, &n)) {
|
||||||
fd = bs->cow_fd;
|
fd = bs->cow_fd;
|
||||||
offset = bs->cow_sectors_offset;
|
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 {
|
} else {
|
||||||
fd = bs->fd;
|
fd = bs->fd;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
@ -278,6 +285,7 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
next:
|
||||||
nb_sectors -= n;
|
nb_sectors -= n;
|
||||||
sector_num += n;
|
sector_num += n;
|
||||||
buf += n * 512;
|
buf += n * 512;
|
||||||
|
@ -291,7 +299,7 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
|
||||||
{
|
{
|
||||||
int ret, fd, i;
|
int ret, fd, i;
|
||||||
int64_t offset, retl;
|
int64_t offset, retl;
|
||||||
|
|
||||||
if (bs->read_only)
|
if (bs->read_only)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -324,3 +332,13 @@ void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
|
||||||
{
|
{
|
||||||
*nb_sectors_ptr = bs->total_sectors;
|
*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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue