* [Qemu-devel] [PATCH for-2.11 0/2] Improvements for the pxe tester
@ 2017-08-09 4:59 Thomas Huth
2017-08-09 4:59 ` [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Thomas Huth
2017-08-09 4:59 ` [Qemu-devel] [PATCH 2/2] tests/pxe: Check virtio-net-ccw on s390x Thomas Huth
0 siblings, 2 replies; 7+ messages in thread
From: Thomas Huth @ 2017-08-09 4:59 UTC (permalink / raw)
To: qemu-devel, Cornelia Huck
Cc: Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
The first patch improves the buffer handling in the pxe tester a
little bit by allocating a separate buffer on the heap for each
architecture. This also gets rid of the huge pre-initialized
array in the tester, shrinking the size of the executable by
half of a megabyte!
The second patch adds s390x support to the pxe tester. Starting
with QEMU 2.10, the guest firmware on s390x can now net-boot via
TFTP, too, so we can automatically test this code in the pxe tester.
Thomas Huth (2):
tests/boot-sector: Do not overwrite the x86 buffer on other
architectures
tests/pxe: Check virtio-net-ccw on s390x
tests/Makefile.include | 1 +
tests/boot-sector.c | 57 ++++++++++++++++++++++++++++++++++++++------------
tests/pxe-test.c | 7 +++++++
3 files changed, 52 insertions(+), 13 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures
2017-08-09 4:59 [Qemu-devel] [PATCH for-2.11 0/2] Improvements for the pxe tester Thomas Huth
@ 2017-08-09 4:59 ` Thomas Huth
2017-08-09 9:05 ` Cornelia Huck
2017-08-09 4:59 ` [Qemu-devel] [PATCH 2/2] tests/pxe: Check virtio-net-ccw on s390x Thomas Huth
1 sibling, 1 reply; 7+ messages in thread
From: Thomas Huth @ 2017-08-09 4:59 UTC (permalink / raw)
To: qemu-devel, Cornelia Huck
Cc: Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
Re-using the boot_sector code buffer from x86 for other architectures
is not very nice, especially if we add more architectures later. It's
also ugly that the test uses a huge pre-initialized array - the size
of the executable is very huge due to this array. So let's use a
separate buffer for each architecture instead, allocated from the heap,
so that we really just use the memory that we need.
Suggested-by: Michael Tsirkin <mst@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/boot-sector.c | 37 ++++++++++++++++++++++++-------------
1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/tests/boot-sector.c b/tests/boot-sector.c
index e3880f4..4ea1373 100644
--- a/tests/boot-sector.c
+++ b/tests/boot-sector.c
@@ -21,13 +21,12 @@
#define SIGNATURE 0xdead
#define SIGNATURE_OFFSET 0x10
#define BOOT_SECTOR_ADDRESS 0x7c00
+#define SIGNATURE_ADDR (BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET)
-/* Boot sector code: write SIGNATURE into memory,
+/* x86 boot sector code: write SIGNATURE into memory,
* then halt.
- * Q35 machine requires a minimum 0x7e000 bytes disk.
- * (bug or feature?)
*/
-static uint8_t boot_sector[0x7e000] = {
+static uint8_t x86_boot_sector[512] = {
/* The first sector will be placed at RAM address 00007C00, and
* the BIOS transfers control to 00007C00
*/
@@ -50,8 +49,8 @@ static uint8_t boot_sector[0x7e000] = {
[0x07] = HIGH(SIGNATURE),
/* 7c08: mov %ax,0x7c10 */
[0x08] = 0xa3,
- [0x09] = LOW(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
- [0x0a] = HIGH(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
+ [0x09] = LOW(SIGNATURE_ADDR),
+ [0x0a] = HIGH(SIGNATURE_ADDR),
/* 7c0b cli */
[0x0b] = 0xfa,
@@ -72,7 +71,9 @@ static uint8_t boot_sector[0x7e000] = {
int boot_sector_init(char *fname)
{
int fd, ret;
- size_t len = sizeof boot_sector;
+ size_t len;
+ char *boot_code;
+ const char *arch = qtest_get_arch();
fd = mkstemp(fname);
if (fd < 0) {
@@ -80,16 +81,26 @@ int boot_sector_init(char *fname)
return 1;
}
- /* For Open Firmware based system, we can use a Forth script instead */
- if (strcmp(qtest_get_arch(), "ppc64") == 0) {
- len = sprintf((char *)boot_sector, "\\ Bootscript\n%x %x c! %x %x c!\n",
- LOW(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET,
- HIGH(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
+ if (g_str_equal(arch, "i386") || g_str_equal(arch, "x86_64")) {
+ /* Q35 requires a minimum 0x7e000 bytes disk (bug or feature?) */
+ len = 0x7e000;
+ boot_code = g_malloc(len);
+ memcpy(boot_code, x86_boot_sector, sizeof x86_boot_sector);
+ } else if (g_str_equal(arch, "ppc64")) {
+ /* For Open Firmware based system, use a Forth script */
+ boot_code = g_strdup_printf("\\ Bootscript\n%x %x c! %x %x c!\n",
+ LOW(SIGNATURE), SIGNATURE_ADDR,
+ HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
+ len = strlen(boot_code);
+ } else {
+ g_assert_not_reached();
}
- ret = write(fd, boot_sector, len);
+ ret = write(fd, boot_code, len);
close(fd);
+ g_free(boot_code);
+
if (ret != len) {
fprintf(stderr, "Could not write \"%s\"", fname);
return 1;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH 2/2] tests/pxe: Check virtio-net-ccw on s390x
2017-08-09 4:59 [Qemu-devel] [PATCH for-2.11 0/2] Improvements for the pxe tester Thomas Huth
2017-08-09 4:59 ` [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Thomas Huth
@ 2017-08-09 4:59 ` Thomas Huth
2017-08-09 9:10 ` Cornelia Huck
1 sibling, 1 reply; 7+ messages in thread
From: Thomas Huth @ 2017-08-09 4:59 UTC (permalink / raw)
To: qemu-devel, Cornelia Huck
Cc: Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
Now that we've got a firmware that can do TFTP booting on s390x (i.e.
the pc-bios/s390-netboot.img), we can enable the PXE tester for this
architecture, too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/Makefile.include | 1 +
tests/boot-sector.c | 20 ++++++++++++++++++++
tests/pxe-test.c | 7 +++++++
3 files changed, 28 insertions(+)
diff --git a/tests/Makefile.include b/tests/Makefile.include
index eb4895f..639371e4 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -337,6 +337,7 @@ check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
+check-qtest-s390x-y += tests/pxe-test$(EXESUF)
check-qtest-generic-y += tests/qom-test$(EXESUF)
check-qtest-generic-y += tests/test-hmp$(EXESUF)
diff --git a/tests/boot-sector.c b/tests/boot-sector.c
index 4ea1373..bc5837a 100644
--- a/tests/boot-sector.c
+++ b/tests/boot-sector.c
@@ -67,6 +67,21 @@ static uint8_t x86_boot_sector[512] = {
[0x1FF] = 0xAA,
};
+/* For s390x, use a mini "kernel" with the appropriate signature */
+static const uint8_t s390x_psw[] = {
+ 0x00, 0x08, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00
+};
+static const uint8_t s390x_code[] = {
+ 0xa7, 0xf4, 0x00, 0x0a, /* j 0x10010 */
+ 0x00, 0x00, 0x00, 0x00,
+ 'S', '3', '9', '0',
+ 'E', 'P', 0x00, 0x01,
+ 0xa7, 0x38, HIGH(SIGNATURE_ADDR), LOW(SIGNATURE_ADDR), /* lhi r3,0x7c10 */
+ 0xa7, 0x48, LOW(SIGNATURE), HIGH(SIGNATURE), /* lhi r4,0xadde */
+ 0x40, 0x40, 0x30, 0x00, /* sth r4,0(r3) */
+ 0xa7, 0xf4, 0xff, 0xfa /* j 0x10010 */
+};
+
/* Create boot disk file. */
int boot_sector_init(char *fname)
{
@@ -92,6 +107,11 @@ int boot_sector_init(char *fname)
LOW(SIGNATURE), SIGNATURE_ADDR,
HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
len = strlen(boot_code);
+ } else if (g_str_equal(arch, "s390x")) {
+ len = 0x10000 + sizeof s390x_code;
+ boot_code = g_malloc(len);
+ memcpy(boot_code, s390x_psw, sizeof s390x_psw);
+ memcpy(&boot_code[0x10000], s390x_code, sizeof s390x_code);
} else {
g_assert_not_reached();
}
diff --git a/tests/pxe-test.c b/tests/pxe-test.c
index cf6e225..0d70afc 100644
--- a/tests/pxe-test.c
+++ b/tests/pxe-test.c
@@ -51,6 +51,11 @@ static void test_pxe_spapr_vlan(void)
test_pxe_one("-device spapr-vlan,netdev=" NETNAME, true);
}
+static void test_pxe_virtio_ccw(void)
+{
+ test_pxe_one("-device virtio-net-ccw,bootindex=1,netdev=" NETNAME, false);
+}
+
int main(int argc, char *argv[])
{
int ret;
@@ -68,6 +73,8 @@ int main(int argc, char *argv[])
} else if (strcmp(arch, "ppc64") == 0) {
qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);
+ } else if (g_str_equal(arch, "s390x")) {
+ qtest_add_func("pxe/virtio-ccw", test_pxe_virtio_ccw);
}
ret = g_test_run();
boot_sector_cleanup(disk);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures
2017-08-09 4:59 ` [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Thomas Huth
@ 2017-08-09 9:05 ` Cornelia Huck
2017-08-09 9:18 ` Thomas Huth
0 siblings, 1 reply; 7+ messages in thread
From: Cornelia Huck @ 2017-08-09 9:05 UTC (permalink / raw)
To: Thomas Huth
Cc: qemu-devel, Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
On Wed, 9 Aug 2017 06:59:37 +0200
Thomas Huth <thuth@redhat.com> wrote:
> Re-using the boot_sector code buffer from x86 for other architectures
> is not very nice, especially if we add more architectures later. It's
> also ugly that the test uses a huge pre-initialized array - the size
> of the executable is very huge due to this array. So let's use a
> separate buffer for each architecture instead, allocated from the heap,
> so that we really just use the memory that we need.
>
> Suggested-by: Michael Tsirkin <mst@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> tests/boot-sector.c | 37 ++++++++++++++++++++++++-------------
> 1 file changed, 24 insertions(+), 13 deletions(-)
>
> diff --git a/tests/boot-sector.c b/tests/boot-sector.c
> index e3880f4..4ea1373 100644
> --- a/tests/boot-sector.c
> +++ b/tests/boot-sector.c
> @@ -21,13 +21,12 @@
> #define SIGNATURE 0xdead
> #define SIGNATURE_OFFSET 0x10
> #define BOOT_SECTOR_ADDRESS 0x7c00
> +#define SIGNATURE_ADDR (BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET)
Do you want to use this new #define in boot_sector_test() as well?
>
> -/* Boot sector code: write SIGNATURE into memory,
> +/* x86 boot sector code: write SIGNATURE into memory,
> * then halt.
> - * Q35 machine requires a minimum 0x7e000 bytes disk.
> - * (bug or feature?)
> */
> -static uint8_t boot_sector[0x7e000] = {
> +static uint8_t x86_boot_sector[512] = {
> /* The first sector will be placed at RAM address 00007C00, and
> * the BIOS transfers control to 00007C00
> */
> @@ -50,8 +49,8 @@ static uint8_t boot_sector[0x7e000] = {
> [0x07] = HIGH(SIGNATURE),
> /* 7c08: mov %ax,0x7c10 */
> [0x08] = 0xa3,
> - [0x09] = LOW(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
> - [0x0a] = HIGH(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
> + [0x09] = LOW(SIGNATURE_ADDR),
> + [0x0a] = HIGH(SIGNATURE_ADDR),
>
> /* 7c0b cli */
> [0x0b] = 0xfa,
> @@ -72,7 +71,9 @@ static uint8_t boot_sector[0x7e000] = {
> int boot_sector_init(char *fname)
> {
> int fd, ret;
> - size_t len = sizeof boot_sector;
> + size_t len;
> + char *boot_code;
> + const char *arch = qtest_get_arch();
>
> fd = mkstemp(fname);
> if (fd < 0) {
> @@ -80,16 +81,26 @@ int boot_sector_init(char *fname)
> return 1;
> }
>
> - /* For Open Firmware based system, we can use a Forth script instead */
> - if (strcmp(qtest_get_arch(), "ppc64") == 0) {
> - len = sprintf((char *)boot_sector, "\\ Bootscript\n%x %x c! %x %x c!\n",
> - LOW(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET,
> - HIGH(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
> + if (g_str_equal(arch, "i386") || g_str_equal(arch, "x86_64")) {
> + /* Q35 requires a minimum 0x7e000 bytes disk (bug or feature?) */
> + len = 0x7e000;
Use the maximum of (0x7e000, sizeof(x86_boot_sector))? (Not that it is
likely that the boot sector will ever grow, but I think it is cleaner.)
> + boot_code = g_malloc(len);
Would g_malloc_0() be better?
> + memcpy(boot_code, x86_boot_sector, sizeof x86_boot_sector);
sizeof(x86_boot_sector)?
> + } else if (g_str_equal(arch, "ppc64")) {
> + /* For Open Firmware based system, use a Forth script */
> + boot_code = g_strdup_printf("\\ Bootscript\n%x %x c! %x %x c!\n",
> + LOW(SIGNATURE), SIGNATURE_ADDR,
> + HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
> + len = strlen(boot_code);
> + } else {
> + g_assert_not_reached();
> }
>
> - ret = write(fd, boot_sector, len);
> + ret = write(fd, boot_code, len);
> close(fd);
>
> + g_free(boot_code);
> +
> if (ret != len) {
> fprintf(stderr, "Could not write \"%s\"", fname);
> return 1;
This makes the code much nicer :)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] tests/pxe: Check virtio-net-ccw on s390x
2017-08-09 4:59 ` [Qemu-devel] [PATCH 2/2] tests/pxe: Check virtio-net-ccw on s390x Thomas Huth
@ 2017-08-09 9:10 ` Cornelia Huck
0 siblings, 0 replies; 7+ messages in thread
From: Cornelia Huck @ 2017-08-09 9:10 UTC (permalink / raw)
To: Thomas Huth
Cc: qemu-devel, Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
On Wed, 9 Aug 2017 06:59:38 +0200
Thomas Huth <thuth@redhat.com> wrote:
> Now that we've got a firmware that can do TFTP booting on s390x (i.e.
> the pc-bios/s390-netboot.img), we can enable the PXE tester for this
> architecture, too.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> tests/Makefile.include | 1 +
> tests/boot-sector.c | 20 ++++++++++++++++++++
> tests/pxe-test.c | 7 +++++++
> 3 files changed, 28 insertions(+)
>
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index eb4895f..639371e4 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -337,6 +337,7 @@ check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
> check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
>
> check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
> +check-qtest-s390x-y += tests/pxe-test$(EXESUF)
>
> check-qtest-generic-y += tests/qom-test$(EXESUF)
> check-qtest-generic-y += tests/test-hmp$(EXESUF)
> diff --git a/tests/boot-sector.c b/tests/boot-sector.c
> index 4ea1373..bc5837a 100644
> --- a/tests/boot-sector.c
> +++ b/tests/boot-sector.c
> @@ -67,6 +67,21 @@ static uint8_t x86_boot_sector[512] = {
> [0x1FF] = 0xAA,
> };
>
> +/* For s390x, use a mini "kernel" with the appropriate signature */
> +static const uint8_t s390x_psw[] = {
> + 0x00, 0x08, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00
> +};
> +static const uint8_t s390x_code[] = {
> + 0xa7, 0xf4, 0x00, 0x0a, /* j 0x10010 */
> + 0x00, 0x00, 0x00, 0x00,
> + 'S', '3', '9', '0',
> + 'E', 'P', 0x00, 0x01,
> + 0xa7, 0x38, HIGH(SIGNATURE_ADDR), LOW(SIGNATURE_ADDR), /* lhi r3,0x7c10 */
> + 0xa7, 0x48, LOW(SIGNATURE), HIGH(SIGNATURE), /* lhi r4,0xadde */
> + 0x40, 0x40, 0x30, 0x00, /* sth r4,0(r3) */
> + 0xa7, 0xf4, 0xff, 0xfa /* j 0x10010 */
> +};
> +
> /* Create boot disk file. */
> int boot_sector_init(char *fname)
> {
> @@ -92,6 +107,11 @@ int boot_sector_init(char *fname)
> LOW(SIGNATURE), SIGNATURE_ADDR,
> HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
> len = strlen(boot_code);
> + } else if (g_str_equal(arch, "s390x")) {
> + len = 0x10000 + sizeof s390x_code;
> + boot_code = g_malloc(len);
g_malloc_0()?
> + memcpy(boot_code, s390x_psw, sizeof s390x_psw);
> + memcpy(&boot_code[0x10000], s390x_code, sizeof s390x_code);
I'd prefer the sizeof() notation.
> } else {
> g_assert_not_reached();
> }
> diff --git a/tests/pxe-test.c b/tests/pxe-test.c
> index cf6e225..0d70afc 100644
> --- a/tests/pxe-test.c
> +++ b/tests/pxe-test.c
> @@ -51,6 +51,11 @@ static void test_pxe_spapr_vlan(void)
> test_pxe_one("-device spapr-vlan,netdev=" NETNAME, true);
> }
>
> +static void test_pxe_virtio_ccw(void)
> +{
> + test_pxe_one("-device virtio-net-ccw,bootindex=1,netdev=" NETNAME, false);
> +}
> +
> int main(int argc, char *argv[])
> {
> int ret;
> @@ -68,6 +73,8 @@ int main(int argc, char *argv[])
> } else if (strcmp(arch, "ppc64") == 0) {
> qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
> qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);
> + } else if (g_str_equal(arch, "s390x")) {
> + qtest_add_func("pxe/virtio-ccw", test_pxe_virtio_ccw);
> }
> ret = g_test_run();
> boot_sector_cleanup(disk);
Else, looks good.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures
2017-08-09 9:05 ` Cornelia Huck
@ 2017-08-09 9:18 ` Thomas Huth
2017-08-09 9:27 ` Cornelia Huck
0 siblings, 1 reply; 7+ messages in thread
From: Thomas Huth @ 2017-08-09 9:18 UTC (permalink / raw)
To: Cornelia Huck
Cc: qemu-devel, Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
On 09.08.2017 11:05, Cornelia Huck wrote:
> On Wed, 9 Aug 2017 06:59:37 +0200
> Thomas Huth <thuth@redhat.com> wrote:
>
>> Re-using the boot_sector code buffer from x86 for other architectures
>> is not very nice, especially if we add more architectures later. It's
>> also ugly that the test uses a huge pre-initialized array - the size
>> of the executable is very huge due to this array. So let's use a
>> separate buffer for each architecture instead, allocated from the heap,
>> so that we really just use the memory that we need.
>>
>> Suggested-by: Michael Tsirkin <mst@redhat.com>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>> tests/boot-sector.c | 37 ++++++++++++++++++++++++-------------
>> 1 file changed, 24 insertions(+), 13 deletions(-)
>>
>> diff --git a/tests/boot-sector.c b/tests/boot-sector.c
>> index e3880f4..4ea1373 100644
>> --- a/tests/boot-sector.c
>> +++ b/tests/boot-sector.c
>> @@ -21,13 +21,12 @@
>> #define SIGNATURE 0xdead
>> #define SIGNATURE_OFFSET 0x10
>> #define BOOT_SECTOR_ADDRESS 0x7c00
>> +#define SIGNATURE_ADDR (BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET)
>
> Do you want to use this new #define in boot_sector_test() as well?
Yes, sounds like a good idea.
>>
>> -/* Boot sector code: write SIGNATURE into memory,
>> +/* x86 boot sector code: write SIGNATURE into memory,
>> * then halt.
>> - * Q35 machine requires a minimum 0x7e000 bytes disk.
>> - * (bug or feature?)
>> */
>> -static uint8_t boot_sector[0x7e000] = {
>> +static uint8_t x86_boot_sector[512] = {
>> /* The first sector will be placed at RAM address 00007C00, and
>> * the BIOS transfers control to 00007C00
>> */
>> @@ -50,8 +49,8 @@ static uint8_t boot_sector[0x7e000] = {
>> [0x07] = HIGH(SIGNATURE),
>> /* 7c08: mov %ax,0x7c10 */
>> [0x08] = 0xa3,
>> - [0x09] = LOW(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
>> - [0x0a] = HIGH(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
>> + [0x09] = LOW(SIGNATURE_ADDR),
>> + [0x0a] = HIGH(SIGNATURE_ADDR),
>>
>> /* 7c0b cli */
>> [0x0b] = 0xfa,
>> @@ -72,7 +71,9 @@ static uint8_t boot_sector[0x7e000] = {
>> int boot_sector_init(char *fname)
>> {
>> int fd, ret;
>> - size_t len = sizeof boot_sector;
>> + size_t len;
>> + char *boot_code;
>> + const char *arch = qtest_get_arch();
>>
>> fd = mkstemp(fname);
>> if (fd < 0) {
>> @@ -80,16 +81,26 @@ int boot_sector_init(char *fname)
>> return 1;
>> }
>>
>> - /* For Open Firmware based system, we can use a Forth script instead */
>> - if (strcmp(qtest_get_arch(), "ppc64") == 0) {
>> - len = sprintf((char *)boot_sector, "\\ Bootscript\n%x %x c! %x %x c!\n",
>> - LOW(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET,
>> - HIGH(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
>> + if (g_str_equal(arch, "i386") || g_str_equal(arch, "x86_64")) {
>> + /* Q35 requires a minimum 0x7e000 bytes disk (bug or feature?) */
>> + len = 0x7e000;
>
> Use the maximum of (0x7e000, sizeof(x86_boot_sector))? (Not that it is
> likely that the boot sector will ever grow, but I think it is cleaner.)
Sounds like a little bit of too much sanity checking for me, but ok, I
can add it.
>> + boot_code = g_malloc(len);
>
> Would g_malloc_0() be better?
Good idea, the test is likely more predictable if we don't have random
data in the file here (it should not really matter, but let's better be
safe than sorry).
>> + memcpy(boot_code, x86_boot_sector, sizeof x86_boot_sector);
>
> sizeof(x86_boot_sector)?
The original code uses sizeof without parenthesis, so I think we should
stay with that coding style.
>> + } else if (g_str_equal(arch, "ppc64")) {
>> + /* For Open Firmware based system, use a Forth script */
>> + boot_code = g_strdup_printf("\\ Bootscript\n%x %x c! %x %x c!\n",
>> + LOW(SIGNATURE), SIGNATURE_ADDR,
>> + HIGH(SIGNATURE), SIGNATURE_ADDR + 1);
>> + len = strlen(boot_code);
>> + } else {
>> + g_assert_not_reached();
>> }
>>
>> - ret = write(fd, boot_sector, len);
>> + ret = write(fd, boot_code, len);
>> close(fd);
>>
>> + g_free(boot_code);
>> +
>> if (ret != len) {
>> fprintf(stderr, "Could not write \"%s\"", fname);
>> return 1;
>
> This makes the code much nicer :)
Thanks for the review!
I'll wait for some more feedback, then send a v2...
Thomas
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures
2017-08-09 9:18 ` Thomas Huth
@ 2017-08-09 9:27 ` Cornelia Huck
0 siblings, 0 replies; 7+ messages in thread
From: Cornelia Huck @ 2017-08-09 9:27 UTC (permalink / raw)
To: Thomas Huth
Cc: qemu-devel, Jason Wang, Christian Borntraeger, Michael S. Tsirkin,
Victor Kaplansky
On Wed, 9 Aug 2017 11:18:33 +0200
Thomas Huth <thuth@redhat.com> wrote:
> On 09.08.2017 11:05, Cornelia Huck wrote:
> > On Wed, 9 Aug 2017 06:59:37 +0200
> > Thomas Huth <thuth@redhat.com> wrote:
> >> @@ -80,16 +81,26 @@ int boot_sector_init(char *fname)
> >> return 1;
> >> }
> >>
> >> - /* For Open Firmware based system, we can use a Forth script instead */
> >> - if (strcmp(qtest_get_arch(), "ppc64") == 0) {
> >> - len = sprintf((char *)boot_sector, "\\ Bootscript\n%x %x c! %x %x c!\n",
> >> - LOW(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET,
> >> - HIGH(SIGNATURE), BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
> >> + if (g_str_equal(arch, "i386") || g_str_equal(arch, "x86_64")) {
> >> + /* Q35 requires a minimum 0x7e000 bytes disk (bug or feature?) */
> >> + len = 0x7e000;
> >
> > Use the maximum of (0x7e000, sizeof(x86_boot_sector))? (Not that it is
> > likely that the boot sector will ever grow, but I think it is cleaner.)
>
> Sounds like a little bit of too much sanity checking for me, but ok, I
> can add it.
It's probably a bit paranoid, but I don't think it hurts.
>
> >> + boot_code = g_malloc(len);
> >
> > Would g_malloc_0() be better?
>
> Good idea, the test is likely more predictable if we don't have random
> data in the file here (it should not really matter, but let's better be
> safe than sorry).
>
> >> + memcpy(boot_code, x86_boot_sector, sizeof x86_boot_sector);
> >
> > sizeof(x86_boot_sector)?
>
> The original code uses sizeof without parenthesis, so I think we should
> stay with that coding style.
After your patch, the original sizeof callers are gone, no? (I really
prefer the sizeof() variant...)
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-08-09 9:27 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-08-09 4:59 [Qemu-devel] [PATCH for-2.11 0/2] Improvements for the pxe tester Thomas Huth
2017-08-09 4:59 ` [Qemu-devel] [PATCH 1/2] tests/boot-sector: Do not overwrite the x86 buffer on other architectures Thomas Huth
2017-08-09 9:05 ` Cornelia Huck
2017-08-09 9:18 ` Thomas Huth
2017-08-09 9:27 ` Cornelia Huck
2017-08-09 4:59 ` [Qemu-devel] [PATCH 2/2] tests/pxe: Check virtio-net-ccw on s390x Thomas Huth
2017-08-09 9:10 ` Cornelia Huck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).