tools: qemu: Add patches to support adapter_type and monolithicFlat
[openwrt/staging/ldir.git] / tools / qemu / patches / 0001-vmdk-fix-endianness-bugs.patch
1 From 6afca0fc5430db0300fe53f2b9cd7d071a3925bb Mon Sep 17 00:00:00 2001
2 From: Alexander Graf <agraf@suse.de>
3 Date: Wed, 25 May 2011 00:46:55 +0200
4 Subject: [PATCH 01/12] vmdk: fix endianness bugs
5
6 The vmdk code is sloppy when handling the header descriptor during
7 creation of an image. Fix all header accesses in the create path to
8 either store native endianness or convert it when appropriate.
9
10 Reported-by: Yury Tsarev <ytsarev@novell.com>
11 Signed-off-by: Alexander Graf <agraf@suse.de>
12 Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13 ---
14 block/vmdk.c | 22 ++++++++++++++--------
15 1 file changed, 14 insertions(+), 8 deletions(-)
16
17 --- a/block/vmdk.c
18 +++ b/block/vmdk.c
19 @@ -716,11 +716,11 @@ static int vmdk_create(const char *filen
20 return -errno;
21 magic = cpu_to_be32(VMDK4_MAGIC);
22 memset(&header, 0, sizeof(header));
23 - header.version = cpu_to_le32(1);
24 - header.flags = cpu_to_le32(3); /* ?? */
25 - header.capacity = cpu_to_le64(total_size);
26 - header.granularity = cpu_to_le64(128);
27 - header.num_gtes_per_gte = cpu_to_le32(512);
28 + header.version = 1;
29 + header.flags = 3; /* ?? */
30 + header.capacity = total_size;
31 + header.granularity = 128;
32 + header.num_gtes_per_gte = 512;
33
34 grains = (total_size + header.granularity - 1) / header.granularity;
35 gt_size = ((header.num_gtes_per_gte * sizeof(uint32_t)) + 511) >> 9;
36 @@ -736,6 +736,12 @@ static int vmdk_create(const char *filen
37 header.granularity - 1) / header.granularity) *
38 header.granularity;
39
40 + /* swap endianness for all header fields */
41 + header.version = cpu_to_le32(header.version);
42 + header.flags = cpu_to_le32(header.flags);
43 + header.capacity = cpu_to_le64(header.capacity);
44 + header.granularity = cpu_to_le64(header.granularity);
45 + header.num_gtes_per_gte = cpu_to_le32(header.num_gtes_per_gte);
46 header.desc_offset = cpu_to_le64(header.desc_offset);
47 header.desc_size = cpu_to_le64(header.desc_size);
48 header.rgd_offset = cpu_to_le64(header.rgd_offset);
49 @@ -759,7 +765,7 @@ static int vmdk_create(const char *filen
50 goto exit;
51 }
52
53 - ret = ftruncate(fd, header.grain_offset << 9);
54 + ret = ftruncate(fd, le64_to_cpu(header.grain_offset) << 9);
55 if (ret < 0) {
56 ret = -errno;
57 goto exit;
58 @@ -767,7 +773,7 @@ static int vmdk_create(const char *filen
59
60 /* write grain directory */
61 lseek(fd, le64_to_cpu(header.rgd_offset) << 9, SEEK_SET);
62 - for (i = 0, tmp = header.rgd_offset + gd_size;
63 + for (i = 0, tmp = le64_to_cpu(header.rgd_offset) + gd_size;
64 i < gt_count; i++, tmp += gt_size) {
65 ret = qemu_write_full(fd, &tmp, sizeof(tmp));
66 if (ret != sizeof(tmp)) {
67 @@ -778,7 +784,7 @@ static int vmdk_create(const char *filen
68
69 /* write backup grain directory */
70 lseek(fd, le64_to_cpu(header.gd_offset) << 9, SEEK_SET);
71 - for (i = 0, tmp = header.gd_offset + gd_size;
72 + for (i = 0, tmp = le64_to_cpu(header.gd_offset) + gd_size;
73 i < gt_count; i++, tmp += gt_size) {
74 ret = qemu_write_full(fd, &tmp, sizeof(tmp));
75 if (ret != sizeof(tmp)) {