xref: /qemu/block/vpc.c (revision afc47486)
1 /*
2  * Block driver for Connectix / Microsoft Virtual PC images
3  *
4  * Copyright (c) 2005 Alex Beregszaszi
5  * Copyright (c) 2009 Kevin Wolf <kwolf@suse.de>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25 #include "qemu/osdep.h"
26 #include "qapi/error.h"
27 #include "qemu-common.h"
28 #include "block/block_int.h"
29 #include "sysemu/block-backend.h"
30 #include "qemu/module.h"
31 #include "migration/migration.h"
32 #if defined(CONFIG_UUID)
33 #include <uuid/uuid.h>
34 #endif
35 
36 /**************************************************************/
37 
38 #define HEADER_SIZE 512
39 
40 //#define CACHE
41 
42 enum vhd_type {
43     VHD_FIXED           = 2,
44     VHD_DYNAMIC         = 3,
45     VHD_DIFFERENCING    = 4,
46 };
47 
48 // Seconds since Jan 1, 2000 0:00:00 (UTC)
49 #define VHD_TIMESTAMP_BASE 946684800
50 
51 #define VHD_CHS_MAX_C   65535LL
52 #define VHD_CHS_MAX_H   16
53 #define VHD_CHS_MAX_S   255
54 
55 #define VHD_MAX_SECTORS       (65535LL * 255 * 255)
56 #define VHD_MAX_GEOMETRY      (VHD_CHS_MAX_C * VHD_CHS_MAX_H * VHD_CHS_MAX_S)
57 
58 #define VPC_OPT_FORCE_SIZE "force_size"
59 
60 // always big-endian
61 typedef struct vhd_footer {
62     char        creator[8]; // "conectix"
63     uint32_t    features;
64     uint32_t    version;
65 
66     // Offset of next header structure, 0xFFFFFFFF if none
67     uint64_t    data_offset;
68 
69     // Seconds since Jan 1, 2000 0:00:00 (UTC)
70     uint32_t    timestamp;
71 
72     char        creator_app[4]; // "vpc "
73     uint16_t    major;
74     uint16_t    minor;
75     char        creator_os[4]; // "Wi2k"
76 
77     uint64_t    orig_size;
78     uint64_t    current_size;
79 
80     uint16_t    cyls;
81     uint8_t     heads;
82     uint8_t     secs_per_cyl;
83 
84     uint32_t    type;
85 
86     // Checksum of the Hard Disk Footer ("one's complement of the sum of all
87     // the bytes in the footer without the checksum field")
88     uint32_t    checksum;
89 
90     // UUID used to identify a parent hard disk (backing file)
91     uint8_t     uuid[16];
92 
93     uint8_t     in_saved_state;
94 } QEMU_PACKED VHDFooter;
95 
96 typedef struct vhd_dyndisk_header {
97     char        magic[8]; // "cxsparse"
98 
99     // Offset of next header structure, 0xFFFFFFFF if none
100     uint64_t    data_offset;
101 
102     // Offset of the Block Allocation Table (BAT)
103     uint64_t    table_offset;
104 
105     uint32_t    version;
106     uint32_t    max_table_entries; // 32bit/entry
107 
108     // 2 MB by default, must be a power of two
109     uint32_t    block_size;
110 
111     uint32_t    checksum;
112     uint8_t     parent_uuid[16];
113     uint32_t    parent_timestamp;
114     uint32_t    reserved;
115 
116     // Backing file name (in UTF-16)
117     uint8_t     parent_name[512];
118 
119     struct {
120         uint32_t    platform;
121         uint32_t    data_space;
122         uint32_t    data_length;
123         uint32_t    reserved;
124         uint64_t    data_offset;
125     } parent_locator[8];
126 } QEMU_PACKED VHDDynDiskHeader;
127 
128 typedef struct BDRVVPCState {
129     CoMutex lock;
130     uint8_t footer_buf[HEADER_SIZE];
131     uint64_t free_data_block_offset;
132     int max_table_entries;
133     uint32_t *pagetable;
134     uint64_t bat_offset;
135     uint64_t last_bitmap_offset;
136 
137     uint32_t block_size;
138     uint32_t bitmap_size;
139     bool force_use_chs;
140     bool force_use_sz;
141 
142 #ifdef CACHE
143     uint8_t *pageentry_u8;
144     uint32_t *pageentry_u32;
145     uint16_t *pageentry_u16;
146 
147     uint64_t last_bitmap;
148 #endif
149 
150     Error *migration_blocker;
151 } BDRVVPCState;
152 
153 #define VPC_OPT_SIZE_CALC "force_size_calc"
154 static QemuOptsList vpc_runtime_opts = {
155     .name = "vpc-runtime-opts",
156     .head = QTAILQ_HEAD_INITIALIZER(vpc_runtime_opts.head),
157     .desc = {
158         {
159             .name = VPC_OPT_SIZE_CALC,
160             .type = QEMU_OPT_STRING,
161             .help = "Force disk size calculation to use either CHS geometry, "
162                     "or use the disk current_size specified in the VHD footer. "
163                     "{chs, current_size}"
164         },
165         { /* end of list */ }
166     }
167 };
168 
169 static uint32_t vpc_checksum(uint8_t* buf, size_t size)
170 {
171     uint32_t res = 0;
172     int i;
173 
174     for (i = 0; i < size; i++)
175         res += buf[i];
176 
177     return ~res;
178 }
179 
180 
181 static int vpc_probe(const uint8_t *buf, int buf_size, const char *filename)
182 {
183     if (buf_size >= 8 && !strncmp((char *)buf, "conectix", 8))
184 	return 100;
185     return 0;
186 }
187 
188 static void vpc_parse_options(BlockDriverState *bs, QemuOpts *opts,
189                               Error **errp)
190 {
191     BDRVVPCState *s = bs->opaque;
192     const char *size_calc;
193 
194     size_calc = qemu_opt_get(opts, VPC_OPT_SIZE_CALC);
195 
196     if (!size_calc) {
197        /* no override, use autodetect only */
198     } else if (!strcmp(size_calc, "current_size")) {
199         s->force_use_sz = true;
200     } else if (!strcmp(size_calc, "chs")) {
201         s->force_use_chs = true;
202     } else {
203         error_setg(errp, "Invalid size calculation mode: '%s'", size_calc);
204     }
205 }
206 
207 static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
208                     Error **errp)
209 {
210     BDRVVPCState *s = bs->opaque;
211     int i;
212     VHDFooter *footer;
213     VHDDynDiskHeader *dyndisk_header;
214     QemuOpts *opts = NULL;
215     Error *local_err = NULL;
216     bool use_chs;
217     uint8_t buf[HEADER_SIZE];
218     uint32_t checksum;
219     uint64_t computed_size;
220     uint64_t pagetable_size;
221     int disk_type = VHD_DYNAMIC;
222     int ret;
223 
224     opts = qemu_opts_create(&vpc_runtime_opts, NULL, 0, &error_abort);
225     qemu_opts_absorb_qdict(opts, options, &local_err);
226     if (local_err) {
227         error_propagate(errp, local_err);
228         ret = -EINVAL;
229         goto fail;
230     }
231 
232     vpc_parse_options(bs, opts, &local_err);
233     if (local_err) {
234         error_propagate(errp, local_err);
235         ret = -EINVAL;
236         goto fail;
237     }
238 
239     ret = bdrv_pread(bs->file->bs, 0, s->footer_buf, HEADER_SIZE);
240     if (ret < 0) {
241         goto fail;
242     }
243 
244     footer = (VHDFooter *) s->footer_buf;
245     if (strncmp(footer->creator, "conectix", 8)) {
246         int64_t offset = bdrv_getlength(bs->file->bs);
247         if (offset < 0) {
248             ret = offset;
249             goto fail;
250         } else if (offset < HEADER_SIZE) {
251             ret = -EINVAL;
252             goto fail;
253         }
254 
255         /* If a fixed disk, the footer is found only at the end of the file */
256         ret = bdrv_pread(bs->file->bs, offset-HEADER_SIZE, s->footer_buf,
257                          HEADER_SIZE);
258         if (ret < 0) {
259             goto fail;
260         }
261         if (strncmp(footer->creator, "conectix", 8)) {
262             error_setg(errp, "invalid VPC image");
263             ret = -EINVAL;
264             goto fail;
265         }
266         disk_type = VHD_FIXED;
267     }
268 
269     checksum = be32_to_cpu(footer->checksum);
270     footer->checksum = 0;
271     if (vpc_checksum(s->footer_buf, HEADER_SIZE) != checksum)
272         fprintf(stderr, "block-vpc: The header checksum of '%s' is "
273             "incorrect.\n", bs->filename);
274 
275     /* Write 'checksum' back to footer, or else will leave it with zero. */
276     footer->checksum = cpu_to_be32(checksum);
277 
278     // The visible size of a image in Virtual PC depends on the geometry
279     // rather than on the size stored in the footer (the size in the footer
280     // is too large usually)
281     bs->total_sectors = (int64_t)
282         be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl;
283 
284     /* Microsoft Virtual PC and Microsoft Hyper-V produce and read
285      * VHD image sizes differently.  VPC will rely on CHS geometry,
286      * while Hyper-V and disk2vhd use the size specified in the footer.
287      *
288      * We use a couple of approaches to try and determine the correct method:
289      * look at the Creator App field, and look for images that have CHS
290      * geometry that is the maximum value.
291      *
292      * If the CHS geometry is the maximum CHS geometry, then we assume that
293      * the size is the footer->current_size to avoid truncation.  Otherwise,
294      * we follow the table based on footer->creator_app:
295      *
296      *  Known creator apps:
297      *      'vpc '  :  CHS              Virtual PC (uses disk geometry)
298      *      'qemu'  :  CHS              QEMU (uses disk geometry)
299      *      'qem2'  :  current_size     QEMU (uses current_size)
300      *      'win '  :  current_size     Hyper-V
301      *      'd2v '  :  current_size     Disk2vhd
302      *
303      *  The user can override the table values via drive options, however
304      *  even with an override we will still use current_size for images
305      *  that have CHS geometry of the maximum size.
306      */
307     use_chs = (!!strncmp(footer->creator_app, "win ", 4) &&
308                !!strncmp(footer->creator_app, "qem2", 4) &&
309                !!strncmp(footer->creator_app, "d2v ", 4)) || s->force_use_chs;
310 
311     if (!use_chs || bs->total_sectors == VHD_MAX_GEOMETRY || s->force_use_sz) {
312         bs->total_sectors = be64_to_cpu(footer->current_size) /
313                                         BDRV_SECTOR_SIZE;
314     }
315 
316     /* Allow a maximum disk size of approximately 2 TB */
317     if (bs->total_sectors >= VHD_MAX_SECTORS) {
318         ret = -EFBIG;
319         goto fail;
320     }
321 
322     if (disk_type == VHD_DYNAMIC) {
323         ret = bdrv_pread(bs->file->bs, be64_to_cpu(footer->data_offset), buf,
324                          HEADER_SIZE);
325         if (ret < 0) {
326             goto fail;
327         }
328 
329         dyndisk_header = (VHDDynDiskHeader *) buf;
330 
331         if (strncmp(dyndisk_header->magic, "cxsparse", 8)) {
332             ret = -EINVAL;
333             goto fail;
334         }
335 
336         s->block_size = be32_to_cpu(dyndisk_header->block_size);
337         if (!is_power_of_2(s->block_size) || s->block_size < BDRV_SECTOR_SIZE) {
338             error_setg(errp, "Invalid block size %" PRIu32, s->block_size);
339             ret = -EINVAL;
340             goto fail;
341         }
342         s->bitmap_size = ((s->block_size / (8 * 512)) + 511) & ~511;
343 
344         s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries);
345 
346         if ((bs->total_sectors * 512) / s->block_size > 0xffffffffU) {
347             ret = -EINVAL;
348             goto fail;
349         }
350         if (s->max_table_entries > (VHD_MAX_SECTORS * 512) / s->block_size) {
351             ret = -EINVAL;
352             goto fail;
353         }
354 
355         computed_size = (uint64_t) s->max_table_entries * s->block_size;
356         if (computed_size < bs->total_sectors * 512) {
357             ret = -EINVAL;
358             goto fail;
359         }
360 
361         if (s->max_table_entries > SIZE_MAX / 4 ||
362             s->max_table_entries > (int) INT_MAX / 4) {
363             error_setg(errp, "Max Table Entries too large (%" PRId32 ")",
364                         s->max_table_entries);
365             ret = -EINVAL;
366             goto fail;
367         }
368 
369         pagetable_size = (uint64_t) s->max_table_entries * 4;
370 
371         s->pagetable = qemu_try_blockalign(bs->file->bs, pagetable_size);
372         if (s->pagetable == NULL) {
373             ret = -ENOMEM;
374             goto fail;
375         }
376 
377         s->bat_offset = be64_to_cpu(dyndisk_header->table_offset);
378 
379         ret = bdrv_pread(bs->file->bs, s->bat_offset, s->pagetable,
380                          pagetable_size);
381         if (ret < 0) {
382             goto fail;
383         }
384 
385         s->free_data_block_offset =
386             ROUND_UP(s->bat_offset + pagetable_size, 512);
387 
388         for (i = 0; i < s->max_table_entries; i++) {
389             be32_to_cpus(&s->pagetable[i]);
390             if (s->pagetable[i] != 0xFFFFFFFF) {
391                 int64_t next = (512 * (int64_t) s->pagetable[i]) +
392                     s->bitmap_size + s->block_size;
393 
394                 if (next > s->free_data_block_offset) {
395                     s->free_data_block_offset = next;
396                 }
397             }
398         }
399 
400         if (s->free_data_block_offset > bdrv_getlength(bs->file->bs)) {
401             error_setg(errp, "block-vpc: free_data_block_offset points after "
402                              "the end of file. The image has been truncated.");
403             ret = -EINVAL;
404             goto fail;
405         }
406 
407         s->last_bitmap_offset = (int64_t) -1;
408 
409 #ifdef CACHE
410         s->pageentry_u8 = g_malloc(512);
411         s->pageentry_u32 = s->pageentry_u8;
412         s->pageentry_u16 = s->pageentry_u8;
413         s->last_pagetable = -1;
414 #endif
415     }
416 
417     qemu_co_mutex_init(&s->lock);
418 
419     /* Disable migration when VHD images are used */
420     error_setg(&s->migration_blocker, "The vpc format used by node '%s' "
421                "does not support live migration",
422                bdrv_get_device_or_node_name(bs));
423     migrate_add_blocker(s->migration_blocker);
424 
425     return 0;
426 
427 fail:
428     qemu_vfree(s->pagetable);
429 #ifdef CACHE
430     g_free(s->pageentry_u8);
431 #endif
432     return ret;
433 }
434 
435 static int vpc_reopen_prepare(BDRVReopenState *state,
436                               BlockReopenQueue *queue, Error **errp)
437 {
438     return 0;
439 }
440 
441 /*
442  * Returns the absolute byte offset of the given sector in the image file.
443  * If the sector is not allocated, -1 is returned instead.
444  *
445  * The parameter write must be 1 if the offset will be used for a write
446  * operation (the block bitmaps is updated then), 0 otherwise.
447  */
448 static inline int64_t get_sector_offset(BlockDriverState *bs,
449     int64_t sector_num, int write)
450 {
451     BDRVVPCState *s = bs->opaque;
452     uint64_t offset = sector_num * 512;
453     uint64_t bitmap_offset, block_offset;
454     uint32_t pagetable_index, pageentry_index;
455 
456     pagetable_index = offset / s->block_size;
457     pageentry_index = (offset % s->block_size) / 512;
458 
459     if (pagetable_index >= s->max_table_entries || s->pagetable[pagetable_index] == 0xffffffff)
460         return -1; // not allocated
461 
462     bitmap_offset = 512 * (uint64_t) s->pagetable[pagetable_index];
463     block_offset = bitmap_offset + s->bitmap_size + (512 * pageentry_index);
464 
465     // We must ensure that we don't write to any sectors which are marked as
466     // unused in the bitmap. We get away with setting all bits in the block
467     // bitmap each time we write to a new block. This might cause Virtual PC to
468     // miss sparse read optimization, but it's not a problem in terms of
469     // correctness.
470     if (write && (s->last_bitmap_offset != bitmap_offset)) {
471         uint8_t bitmap[s->bitmap_size];
472 
473         s->last_bitmap_offset = bitmap_offset;
474         memset(bitmap, 0xff, s->bitmap_size);
475         bdrv_pwrite_sync(bs->file->bs, bitmap_offset, bitmap, s->bitmap_size);
476     }
477 
478     return block_offset;
479 }
480 
481 /*
482  * Writes the footer to the end of the image file. This is needed when the
483  * file grows as it overwrites the old footer
484  *
485  * Returns 0 on success and < 0 on error
486  */
487 static int rewrite_footer(BlockDriverState* bs)
488 {
489     int ret;
490     BDRVVPCState *s = bs->opaque;
491     int64_t offset = s->free_data_block_offset;
492 
493     ret = bdrv_pwrite_sync(bs->file->bs, offset, s->footer_buf, HEADER_SIZE);
494     if (ret < 0)
495         return ret;
496 
497     return 0;
498 }
499 
500 /*
501  * Allocates a new block. This involves writing a new footer and updating
502  * the Block Allocation Table to use the space at the old end of the image
503  * file (overwriting the old footer)
504  *
505  * Returns the sectors' offset in the image file on success and < 0 on error
506  */
507 static int64_t alloc_block(BlockDriverState* bs, int64_t sector_num)
508 {
509     BDRVVPCState *s = bs->opaque;
510     int64_t bat_offset;
511     uint32_t index, bat_value;
512     int ret;
513     uint8_t bitmap[s->bitmap_size];
514 
515     // Check if sector_num is valid
516     if ((sector_num < 0) || (sector_num > bs->total_sectors))
517         return -1;
518 
519     // Write entry into in-memory BAT
520     index = (sector_num * 512) / s->block_size;
521     if (s->pagetable[index] != 0xFFFFFFFF)
522         return -1;
523 
524     s->pagetable[index] = s->free_data_block_offset / 512;
525 
526     // Initialize the block's bitmap
527     memset(bitmap, 0xff, s->bitmap_size);
528     ret = bdrv_pwrite_sync(bs->file->bs, s->free_data_block_offset, bitmap,
529         s->bitmap_size);
530     if (ret < 0) {
531         return ret;
532     }
533 
534     // Write new footer (the old one will be overwritten)
535     s->free_data_block_offset += s->block_size + s->bitmap_size;
536     ret = rewrite_footer(bs);
537     if (ret < 0)
538         goto fail;
539 
540     // Write BAT entry to disk
541     bat_offset = s->bat_offset + (4 * index);
542     bat_value = cpu_to_be32(s->pagetable[index]);
543     ret = bdrv_pwrite_sync(bs->file->bs, bat_offset, &bat_value, 4);
544     if (ret < 0)
545         goto fail;
546 
547     return get_sector_offset(bs, sector_num, 0);
548 
549 fail:
550     s->free_data_block_offset -= (s->block_size + s->bitmap_size);
551     return -1;
552 }
553 
554 static int vpc_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
555 {
556     BDRVVPCState *s = (BDRVVPCState *)bs->opaque;
557     VHDFooter *footer = (VHDFooter *) s->footer_buf;
558 
559     if (be32_to_cpu(footer->type) != VHD_FIXED) {
560         bdi->cluster_size = s->block_size;
561     }
562 
563     bdi->unallocated_blocks_are_zero = true;
564     return 0;
565 }
566 
567 static int vpc_read(BlockDriverState *bs, int64_t sector_num,
568                     uint8_t *buf, int nb_sectors)
569 {
570     BDRVVPCState *s = bs->opaque;
571     int ret;
572     int64_t offset;
573     int64_t sectors, sectors_per_block;
574     VHDFooter *footer = (VHDFooter *) s->footer_buf;
575 
576     if (be32_to_cpu(footer->type) == VHD_FIXED) {
577         return bdrv_read(bs->file->bs, sector_num, buf, nb_sectors);
578     }
579     while (nb_sectors > 0) {
580         offset = get_sector_offset(bs, sector_num, 0);
581 
582         sectors_per_block = s->block_size >> BDRV_SECTOR_BITS;
583         sectors = sectors_per_block - (sector_num % sectors_per_block);
584         if (sectors > nb_sectors) {
585             sectors = nb_sectors;
586         }
587 
588         if (offset == -1) {
589             memset(buf, 0, sectors * BDRV_SECTOR_SIZE);
590         } else {
591             ret = bdrv_pread(bs->file->bs, offset, buf,
592                 sectors * BDRV_SECTOR_SIZE);
593             if (ret != sectors * BDRV_SECTOR_SIZE) {
594                 return -1;
595             }
596         }
597 
598         nb_sectors -= sectors;
599         sector_num += sectors;
600         buf += sectors * BDRV_SECTOR_SIZE;
601     }
602     return 0;
603 }
604 
605 static coroutine_fn int vpc_co_read(BlockDriverState *bs, int64_t sector_num,
606                                     uint8_t *buf, int nb_sectors)
607 {
608     int ret;
609     BDRVVPCState *s = bs->opaque;
610     qemu_co_mutex_lock(&s->lock);
611     ret = vpc_read(bs, sector_num, buf, nb_sectors);
612     qemu_co_mutex_unlock(&s->lock);
613     return ret;
614 }
615 
616 static int vpc_write(BlockDriverState *bs, int64_t sector_num,
617     const uint8_t *buf, int nb_sectors)
618 {
619     BDRVVPCState *s = bs->opaque;
620     int64_t offset;
621     int64_t sectors, sectors_per_block;
622     int ret;
623     VHDFooter *footer =  (VHDFooter *) s->footer_buf;
624 
625     if (be32_to_cpu(footer->type) == VHD_FIXED) {
626         return bdrv_write(bs->file->bs, sector_num, buf, nb_sectors);
627     }
628     while (nb_sectors > 0) {
629         offset = get_sector_offset(bs, sector_num, 1);
630 
631         sectors_per_block = s->block_size >> BDRV_SECTOR_BITS;
632         sectors = sectors_per_block - (sector_num % sectors_per_block);
633         if (sectors > nb_sectors) {
634             sectors = nb_sectors;
635         }
636 
637         if (offset == -1) {
638             offset = alloc_block(bs, sector_num);
639             if (offset < 0)
640                 return -1;
641         }
642 
643         ret = bdrv_pwrite(bs->file->bs, offset, buf,
644                           sectors * BDRV_SECTOR_SIZE);
645         if (ret != sectors * BDRV_SECTOR_SIZE) {
646             return -1;
647         }
648 
649         nb_sectors -= sectors;
650         sector_num += sectors;
651         buf += sectors * BDRV_SECTOR_SIZE;
652     }
653 
654     return 0;
655 }
656 
657 static coroutine_fn int vpc_co_write(BlockDriverState *bs, int64_t sector_num,
658                                      const uint8_t *buf, int nb_sectors)
659 {
660     int ret;
661     BDRVVPCState *s = bs->opaque;
662     qemu_co_mutex_lock(&s->lock);
663     ret = vpc_write(bs, sector_num, buf, nb_sectors);
664     qemu_co_mutex_unlock(&s->lock);
665     return ret;
666 }
667 
668 static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs,
669         int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file)
670 {
671     BDRVVPCState *s = bs->opaque;
672     VHDFooter *footer = (VHDFooter*) s->footer_buf;
673     int64_t start, offset;
674     bool allocated;
675     int n;
676 
677     if (be32_to_cpu(footer->type) == VHD_FIXED) {
678         *pnum = nb_sectors;
679         *file = bs->file->bs;
680         return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
681                (sector_num << BDRV_SECTOR_BITS);
682     }
683 
684     offset = get_sector_offset(bs, sector_num, 0);
685     start = offset;
686     allocated = (offset != -1);
687     *pnum = 0;
688 
689     do {
690         /* All sectors in a block are contiguous (without using the bitmap) */
691         n = ROUND_UP(sector_num + 1, s->block_size / BDRV_SECTOR_SIZE)
692           - sector_num;
693         n = MIN(n, nb_sectors);
694 
695         *pnum += n;
696         sector_num += n;
697         nb_sectors -= n;
698         /* *pnum can't be greater than one block for allocated
699          * sectors since there is always a bitmap in between. */
700         if (allocated) {
701             *file = bs->file->bs;
702             return BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | start;
703         }
704         if (nb_sectors == 0) {
705             break;
706         }
707         offset = get_sector_offset(bs, sector_num, 0);
708     } while (offset == -1);
709 
710     return 0;
711 }
712 
713 /*
714  * Calculates the number of cylinders, heads and sectors per cylinder
715  * based on a given number of sectors. This is the algorithm described
716  * in the VHD specification.
717  *
718  * Note that the geometry doesn't always exactly match total_sectors but
719  * may round it down.
720  *
721  * Returns 0 on success, -EFBIG if the size is larger than ~2 TB. Override
722  * the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB)
723  * and instead allow up to 255 heads.
724  */
725 static int calculate_geometry(int64_t total_sectors, uint16_t* cyls,
726     uint8_t* heads, uint8_t* secs_per_cyl)
727 {
728     uint32_t cyls_times_heads;
729 
730     total_sectors = MIN(total_sectors, VHD_MAX_GEOMETRY);
731 
732     if (total_sectors >= 65535LL * 16 * 63) {
733         *secs_per_cyl = 255;
734         *heads = 16;
735         cyls_times_heads = total_sectors / *secs_per_cyl;
736     } else {
737         *secs_per_cyl = 17;
738         cyls_times_heads = total_sectors / *secs_per_cyl;
739         *heads = (cyls_times_heads + 1023) / 1024;
740 
741         if (*heads < 4) {
742             *heads = 4;
743         }
744 
745         if (cyls_times_heads >= (*heads * 1024) || *heads > 16) {
746             *secs_per_cyl = 31;
747             *heads = 16;
748             cyls_times_heads = total_sectors / *secs_per_cyl;
749         }
750 
751         if (cyls_times_heads >= (*heads * 1024)) {
752             *secs_per_cyl = 63;
753             *heads = 16;
754             cyls_times_heads = total_sectors / *secs_per_cyl;
755         }
756     }
757 
758     *cyls = cyls_times_heads / *heads;
759 
760     return 0;
761 }
762 
763 static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
764                                int64_t total_sectors)
765 {
766     VHDDynDiskHeader *dyndisk_header =
767         (VHDDynDiskHeader *) buf;
768     size_t block_size, num_bat_entries;
769     int i;
770     int ret;
771     int64_t offset = 0;
772 
773     // Write the footer (twice: at the beginning and at the end)
774     block_size = 0x200000;
775     num_bat_entries = (total_sectors + block_size / 512) / (block_size / 512);
776 
777     ret = blk_pwrite(blk, offset, buf, HEADER_SIZE);
778     if (ret < 0) {
779         goto fail;
780     }
781 
782     offset = 1536 + ((num_bat_entries * 4 + 511) & ~511);
783     ret = blk_pwrite(blk, offset, buf, HEADER_SIZE);
784     if (ret < 0) {
785         goto fail;
786     }
787 
788     // Write the initial BAT
789     offset = 3 * 512;
790 
791     memset(buf, 0xFF, 512);
792     for (i = 0; i < (num_bat_entries * 4 + 511) / 512; i++) {
793         ret = blk_pwrite(blk, offset, buf, 512);
794         if (ret < 0) {
795             goto fail;
796         }
797         offset += 512;
798     }
799 
800     // Prepare the Dynamic Disk Header
801     memset(buf, 0, 1024);
802 
803     memcpy(dyndisk_header->magic, "cxsparse", 8);
804 
805     /*
806      * Note: The spec is actually wrong here for data_offset, it says
807      * 0xFFFFFFFF, but MS tools expect all 64 bits to be set.
808      */
809     dyndisk_header->data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
810     dyndisk_header->table_offset = cpu_to_be64(3 * 512);
811     dyndisk_header->version = cpu_to_be32(0x00010000);
812     dyndisk_header->block_size = cpu_to_be32(block_size);
813     dyndisk_header->max_table_entries = cpu_to_be32(num_bat_entries);
814 
815     dyndisk_header->checksum = cpu_to_be32(vpc_checksum(buf, 1024));
816 
817     // Write the header
818     offset = 512;
819 
820     ret = blk_pwrite(blk, offset, buf, 1024);
821     if (ret < 0) {
822         goto fail;
823     }
824 
825  fail:
826     return ret;
827 }
828 
829 static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
830                              int64_t total_size)
831 {
832     int ret;
833 
834     /* Add footer to total size */
835     total_size += HEADER_SIZE;
836 
837     ret = blk_truncate(blk, total_size);
838     if (ret < 0) {
839         return ret;
840     }
841 
842     ret = blk_pwrite(blk, total_size - HEADER_SIZE, buf, HEADER_SIZE);
843     if (ret < 0) {
844         return ret;
845     }
846 
847     return ret;
848 }
849 
850 static int vpc_create(const char *filename, QemuOpts *opts, Error **errp)
851 {
852     uint8_t buf[1024];
853     VHDFooter *footer = (VHDFooter *) buf;
854     char *disk_type_param;
855     int i;
856     uint16_t cyls = 0;
857     uint8_t heads = 0;
858     uint8_t secs_per_cyl = 0;
859     int64_t total_sectors;
860     int64_t total_size;
861     int disk_type;
862     int ret = -EIO;
863     bool force_size;
864     Error *local_err = NULL;
865     BlockBackend *blk = NULL;
866 
867     /* Read out options */
868     total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
869                           BDRV_SECTOR_SIZE);
870     disk_type_param = qemu_opt_get_del(opts, BLOCK_OPT_SUBFMT);
871     if (disk_type_param) {
872         if (!strcmp(disk_type_param, "dynamic")) {
873             disk_type = VHD_DYNAMIC;
874         } else if (!strcmp(disk_type_param, "fixed")) {
875             disk_type = VHD_FIXED;
876         } else {
877             ret = -EINVAL;
878             goto out;
879         }
880     } else {
881         disk_type = VHD_DYNAMIC;
882     }
883 
884     force_size = qemu_opt_get_bool_del(opts, VPC_OPT_FORCE_SIZE, false);
885 
886     ret = bdrv_create_file(filename, opts, &local_err);
887     if (ret < 0) {
888         error_propagate(errp, local_err);
889         goto out;
890     }
891 
892     blk = blk_new_open(filename, NULL, NULL,
893                        BDRV_O_RDWR | BDRV_O_PROTOCOL, &local_err);
894     if (blk == NULL) {
895         error_propagate(errp, local_err);
896         ret = -EIO;
897         goto out;
898     }
899 
900     blk_set_allow_write_beyond_eof(blk, true);
901 
902     /*
903      * Calculate matching total_size and geometry. Increase the number of
904      * sectors requested until we get enough (or fail). This ensures that
905      * qemu-img convert doesn't truncate images, but rather rounds up.
906      *
907      * If the image size can't be represented by a spec conformant CHS geometry,
908      * we set the geometry to 65535 x 16 x 255 (CxHxS) sectors and use
909      * the image size from the VHD footer to calculate total_sectors.
910      */
911     if (force_size) {
912         /* This will force the use of total_size for sector count, below */
913         cyls         = VHD_CHS_MAX_C;
914         heads        = VHD_CHS_MAX_H;
915         secs_per_cyl = VHD_CHS_MAX_S;
916     } else {
917         total_sectors = MIN(VHD_MAX_GEOMETRY, total_size / BDRV_SECTOR_SIZE);
918         for (i = 0; total_sectors > (int64_t)cyls * heads * secs_per_cyl; i++) {
919             calculate_geometry(total_sectors + i, &cyls, &heads, &secs_per_cyl);
920         }
921     }
922 
923     if ((int64_t)cyls * heads * secs_per_cyl == VHD_MAX_GEOMETRY) {
924         total_sectors = total_size / BDRV_SECTOR_SIZE;
925         /* Allow a maximum disk size of approximately 2 TB */
926         if (total_sectors > VHD_MAX_SECTORS) {
927             ret = -EFBIG;
928             goto out;
929         }
930     } else {
931         total_sectors = (int64_t)cyls * heads * secs_per_cyl;
932         total_size = total_sectors * BDRV_SECTOR_SIZE;
933     }
934 
935     /* Prepare the Hard Disk Footer */
936     memset(buf, 0, 1024);
937 
938     memcpy(footer->creator, "conectix", 8);
939     if (force_size) {
940         memcpy(footer->creator_app, "qem2", 4);
941     } else {
942         memcpy(footer->creator_app, "qemu", 4);
943     }
944     memcpy(footer->creator_os, "Wi2k", 4);
945 
946     footer->features = cpu_to_be32(0x02);
947     footer->version = cpu_to_be32(0x00010000);
948     if (disk_type == VHD_DYNAMIC) {
949         footer->data_offset = cpu_to_be64(HEADER_SIZE);
950     } else {
951         footer->data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
952     }
953     footer->timestamp = cpu_to_be32(time(NULL) - VHD_TIMESTAMP_BASE);
954 
955     /* Version of Virtual PC 2007 */
956     footer->major = cpu_to_be16(0x0005);
957     footer->minor = cpu_to_be16(0x0003);
958     footer->orig_size = cpu_to_be64(total_size);
959     footer->current_size = cpu_to_be64(total_size);
960     footer->cyls = cpu_to_be16(cyls);
961     footer->heads = heads;
962     footer->secs_per_cyl = secs_per_cyl;
963 
964     footer->type = cpu_to_be32(disk_type);
965 
966 #if defined(CONFIG_UUID)
967     uuid_generate(footer->uuid);
968 #endif
969 
970     footer->checksum = cpu_to_be32(vpc_checksum(buf, HEADER_SIZE));
971 
972     if (disk_type == VHD_DYNAMIC) {
973         ret = create_dynamic_disk(blk, buf, total_sectors);
974     } else {
975         ret = create_fixed_disk(blk, buf, total_size);
976     }
977 
978 out:
979     blk_unref(blk);
980     g_free(disk_type_param);
981     return ret;
982 }
983 
984 static int vpc_has_zero_init(BlockDriverState *bs)
985 {
986     BDRVVPCState *s = bs->opaque;
987     VHDFooter *footer =  (VHDFooter *) s->footer_buf;
988 
989     if (be32_to_cpu(footer->type) == VHD_FIXED) {
990         return bdrv_has_zero_init(bs->file->bs);
991     } else {
992         return 1;
993     }
994 }
995 
996 static void vpc_close(BlockDriverState *bs)
997 {
998     BDRVVPCState *s = bs->opaque;
999     qemu_vfree(s->pagetable);
1000 #ifdef CACHE
1001     g_free(s->pageentry_u8);
1002 #endif
1003 
1004     migrate_del_blocker(s->migration_blocker);
1005     error_free(s->migration_blocker);
1006 }
1007 
1008 static QemuOptsList vpc_create_opts = {
1009     .name = "vpc-create-opts",
1010     .head = QTAILQ_HEAD_INITIALIZER(vpc_create_opts.head),
1011     .desc = {
1012         {
1013             .name = BLOCK_OPT_SIZE,
1014             .type = QEMU_OPT_SIZE,
1015             .help = "Virtual disk size"
1016         },
1017         {
1018             .name = BLOCK_OPT_SUBFMT,
1019             .type = QEMU_OPT_STRING,
1020             .help =
1021                 "Type of virtual hard disk format. Supported formats are "
1022                 "{dynamic (default) | fixed} "
1023         },
1024         {
1025             .name = VPC_OPT_FORCE_SIZE,
1026             .type = QEMU_OPT_BOOL,
1027             .help = "Force disk size calculation to use the actual size "
1028                     "specified, rather than using the nearest CHS-based "
1029                     "calculation"
1030         },
1031         { /* end of list */ }
1032     }
1033 };
1034 
1035 static BlockDriver bdrv_vpc = {
1036     .format_name    = "vpc",
1037     .instance_size  = sizeof(BDRVVPCState),
1038 
1039     .bdrv_probe             = vpc_probe,
1040     .bdrv_open              = vpc_open,
1041     .bdrv_close             = vpc_close,
1042     .bdrv_reopen_prepare    = vpc_reopen_prepare,
1043     .bdrv_create            = vpc_create,
1044 
1045     .bdrv_read                  = vpc_co_read,
1046     .bdrv_write                 = vpc_co_write,
1047     .bdrv_co_get_block_status   = vpc_co_get_block_status,
1048 
1049     .bdrv_get_info          = vpc_get_info,
1050 
1051     .create_opts            = &vpc_create_opts,
1052     .bdrv_has_zero_init     = vpc_has_zero_init,
1053 };
1054 
1055 static void bdrv_vpc_init(void)
1056 {
1057     bdrv_register(&bdrv_vpc);
1058 }
1059 
1060 block_init(bdrv_vpc_init);
1061