* [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64
@ 2018-02-28 18:02 Wei Huang
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak Wei Huang
` (4 more replies)
0 siblings, 5 replies; 22+ messages in thread
From: Wei Huang @ 2018-02-28 18:02 UTC (permalink / raw)
To: qemu-devel; +Cc: dgilbert, peter.maydell, quintela, drjones
This patchset adds a migration test for aarch64. It leverages
Dave Gilbert's recent patch "tests/migration: Add source to PC boot block"
to create a new test case for aarch64.
V6->V7:
* Define test memory start/end addresses for all architectures
* Check aarch64 kernel binary size, limit under 512KB
V5->V6:
* Add Reviewed-by to patch 1-3
* Add more design notes in patch 4 (aarch64 assembly compilation, bin space)
V4->V5:
* Extract cross compilation detection code into rules.mak for sharing
* Minor comment and code revision in migration-test.c & aarch64-a-b-kernel.S
V3->V4:
* Rename .s to .S, allowing assembly to include C-style header file
* Move test defines into a new migration-test.h file
* Use different cpu & gic settings for kvm and tcg modes on aarch64
* Clean up aarch64-a-b-kernel.S based on Andrew Jones' comments
V2->V3:
* Convert build script to Makefile
* Add cross-compilation support
* Fix CPU type for "tcg" machine type
* Revise asm code and the compilation process from asm to header file
V1->V2:
* Similar to Dave Gilbert's recent changes to migration-test, we
provide the test source and a build script in V2.
* aarch64 kernel blob is defined as "unsigned char" because the source
is now provided in V2.
* Add "-machine none" to test_deprecated() because aarch64 doesn't have
a default machine type.
RFC->V1:
* aarch64 kernel blob is defined as an uint32_t array
* The test code is re-written to address a data caching issue under KVM.
Tests passed under both x86 and aarch64.
* Re-use init_bootfile_x86() for both x86 and aarch64
* Other minor fixes
Thanks,
-Wei
Wei Huang (4):
rules: Move cross compilation auto detection functions to rules.mak
tests/migration: Convert the boot block compilation script into
Makefile
tests/migration: Add migration-test header file
tests: Add migration test for aarch64
roms/Makefile | 24 ++-----
rules.mak | 15 +++++
tests/Makefile.include | 1 +
tests/migration-test.c | 78 +++++++++++++++++-----
tests/migration/Makefile | 44 ++++++++++++
tests/migration/aarch64-a-b-kernel.S | 75 +++++++++++++++++++++
tests/migration/aarch64-a-b-kernel.h | 19 ++++++
tests/migration/migration-test.h | 31 +++++++++
tests/migration/rebuild-x86-bootblock.sh | 33 ---------
.../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 12 ++--
tests/migration/x86-a-b-bootblock.h | 4 +-
11 files changed, 260 insertions(+), 76 deletions(-)
create mode 100644 tests/migration/Makefile
create mode 100644 tests/migration/aarch64-a-b-kernel.S
create mode 100644 tests/migration/aarch64-a-b-kernel.h
create mode 100644 tests/migration/migration-test.h
delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (88%)
--
2.14.3
^ permalink raw reply [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-02-28 18:02 [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64 Wei Huang
@ 2018-02-28 18:02 ` Wei Huang
2018-03-02 14:51 ` Laurent Vivier
2018-03-02 16:27 ` Laurent Vivier
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile Wei Huang
` (3 subsequent siblings)
4 siblings, 2 replies; 22+ messages in thread
From: Wei Huang @ 2018-02-28 18:02 UTC (permalink / raw)
To: qemu-devel; +Cc: dgilbert, peter.maydell, quintela, drjones
This patch moves the auto detection functions for cross compilation from
roms/Makefile to rules.mak. So the functions can be shared among Makefiles
in QEMU.
Signed-off-by: Wei Huang <wei@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
---
roms/Makefile | 24 +++++++-----------------
rules.mak | 15 +++++++++++++++
2 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/roms/Makefile b/roms/Makefile
index b5e5a69e91..e972c65333 100644
--- a/roms/Makefile
+++ b/roms/Makefile
@@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
-#
-# cross compiler auto detection
-#
-path := $(subst :, ,$(PATH))
-system := $(shell uname -s | tr "A-Z" "a-z")
-
-# first find cross binutils in path
-find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
-# then check we have cross gcc too
-find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
-# finally strip off path + toolname so we get the prefix
-find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
-
-powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
-powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
-x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
-
# tag our seabios builds
SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
@@ -66,6 +49,13 @@ default:
@echo " skiboot -- update skiboot.lid"
@echo " u-boot.e500 -- update u-boot.e500"
+SRC_PATH=..
+include $(SRC_PATH)/rules.mak
+
+powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
+powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
+x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
+
bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
cp seabios/builds/seabios-256k/bios.bin ../pc-bios/bios-256k.bin
diff --git a/rules.mak b/rules.mak
index 6e943335f3..ef8adee3f8 100644
--- a/rules.mak
+++ b/rules.mak
@@ -62,6 +62,21 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
$(foreach o,$(filter %.mo,$1),$($o-objs)) \
$(filter-out %.o %.mo,$1))
+# Cross compilation auto detection. Use find-cross-prefix to detect the
+# target archtecture's prefix, and then append it to the build tool or pass
+# it to CROSS_COMPILE directly. Here is one example:
+# x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
+# $(x86_64_cross_prefix)gcc -c test.c -o test.o
+# make -C testdir CROSS_COMPILE=$(x86_64_cross_prefix)
+cross-search-path := $(subst :, ,$(PATH))
+cross-host-system := $(shell uname -s | tr "A-Z" "a-z")
+
+find-cross-ld = $(firstword $(wildcard $(patsubst \
+ %,%/$(1)-*$(cross-host-system)*-ld,$(cross-search-path))))
+find-cross-gcc = $(firstword $(wildcard \
+ $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
+find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
+
%.o: %.c
$(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \
$(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \
--
2.14.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile
2018-02-28 18:02 [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64 Wei Huang
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak Wei Huang
@ 2018-02-28 18:02 ` Wei Huang
2018-03-02 15:25 ` Laurent Vivier
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file Wei Huang
` (2 subsequent siblings)
4 siblings, 1 reply; 22+ messages in thread
From: Wei Huang @ 2018-02-28 18:02 UTC (permalink / raw)
To: qemu-devel; +Cc: dgilbert, peter.maydell, quintela, drjones
The x86 boot block header currently is generated with a shell script.
To better support other CPUs (e.g. aarch64), we convert the script
into Makefile. This allows us to 1) support cross-compilation easily,
and 2) avoid creating a script file for every architecture.
Signed-off-by: Wei Huang <wei@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
---
tests/migration/Makefile | 36 ++++++++++++++++++++++++++++++++
tests/migration/rebuild-x86-bootblock.sh | 33 -----------------------------
tests/migration/x86-a-b-bootblock.h | 2 +-
tests/migration/x86-a-b-bootblock.s | 5 ++---
4 files changed, 39 insertions(+), 37 deletions(-)
create mode 100644 tests/migration/Makefile
delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
diff --git a/tests/migration/Makefile b/tests/migration/Makefile
new file mode 100644
index 0000000000..8fbedaa8b8
--- /dev/null
+++ b/tests/migration/Makefile
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
+#
+# Authors:
+# Dave Gilbert <dgilbert@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or later.
+# See the COPYING file in the top-level directory.
+#
+export __note
+override define __note
+/* This file is automatically generated from
+ * tests/migration/$<, edit that and then run
+ * "make $@" inside tests/migration to update,
+ * and then remember to send both in your patch submission.
+ */
+endef
+
+all: x86-a-b-bootblock.h
+# Dummy command so that make thinks it has done something
+ @true
+
+SRC_PATH=../..
+include $(SRC_PATH)/rules.mak
+
+x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
+
+x86-a-b-bootblock.h: x86-a-b-bootblock.s
+ $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
+ $(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
+ dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
+ echo "$$__note" > $@
+ xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@
+
+clean:
+ rm -f *.bootsect *.boot *.o
diff --git a/tests/migration/rebuild-x86-bootblock.sh b/tests/migration/rebuild-x86-bootblock.sh
deleted file mode 100755
index 86cec5d284..0000000000
--- a/tests/migration/rebuild-x86-bootblock.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
-# This work is licensed under the terms of the GNU GPL, version 2 or later.
-# See the COPYING file in the top-level directory.
-#
-# Author: dgilbert@redhat.com
-
-ASMFILE=$PWD/tests/migration/x86-a-b-bootblock.s
-HEADER=$PWD/tests/migration/x86-a-b-bootblock.h
-
-if [ ! -e "$ASMFILE" ]
-then
- echo "Couldn't find $ASMFILE" >&2
- exit 1
-fi
-
-ASM_WORK_DIR=$(mktemp -d --tmpdir X86BB.XXXXXX)
-cd "$ASM_WORK_DIR" &&
-as --32 -march=i486 "$ASMFILE" -o x86.o &&
-objcopy -O binary x86.o x86.boot &&
-dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124 &&
-xxd -i x86.bootsect |
-sed -e 's/.*int.*//' > x86.hex &&
-cat - x86.hex <<HERE > "$HEADER"
-/* This file is automatically generated from
- * tests/migration/x86-a-b-bootblock.s, edit that and then run
- * tests/migration/rebuild-x86-bootblock.sh to update,
- * and then remember to send both in your patch submission.
- */
-HERE
-
-rm x86.hex x86.bootsect x86.boot x86.o
-cd .. && rmdir "$ASM_WORK_DIR"
diff --git a/tests/migration/x86-a-b-bootblock.h b/tests/migration/x86-a-b-bootblock.h
index 78a151fe2a..9e8e2e028b 100644
--- a/tests/migration/x86-a-b-bootblock.h
+++ b/tests/migration/x86-a-b-bootblock.h
@@ -1,6 +1,6 @@
/* This file is automatically generated from
* tests/migration/x86-a-b-bootblock.s, edit that and then run
- * tests/migration/rebuild-x86-bootblock.sh to update,
+ * "make x86-a-b-bootblock.h" inside tests/migration to update,
* and then remember to send both in your patch submission.
*/
unsigned char x86_bootsect[] = {
diff --git a/tests/migration/x86-a-b-bootblock.s b/tests/migration/x86-a-b-bootblock.s
index b1642641a7..98dbfab084 100644
--- a/tests/migration/x86-a-b-bootblock.s
+++ b/tests/migration/x86-a-b-bootblock.s
@@ -3,9 +3,8 @@
# range.
# Outputs an initial 'A' on serial followed by repeated 'B's
#
-# run tests/migration/rebuild-x86-bootblock.sh
-# to regenerate the hex, and remember to include both the .h and .s
-# in any patches.
+# In tests/migration dir, run 'make x86-a-b-bootblock.h' to regenerate
+# the hex, and remember to include both the .h and .s in any patches.
#
# Copyright (c) 2016 Red Hat, Inc. and/or its affiliates
# This work is licensed under the terms of the GNU GPL, version 2 or later.
--
2.14.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file
2018-02-28 18:02 [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64 Wei Huang
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak Wei Huang
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile Wei Huang
@ 2018-02-28 18:02 ` Wei Huang
2018-03-01 9:48 ` Andrew Jones
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64 Wei Huang
2018-03-01 15:28 ` [Qemu-devel] [PATCH V7 0/4] " Dr. David Alan Gilbert
4 siblings, 1 reply; 22+ messages in thread
From: Wei Huang @ 2018-02-28 18:02 UTC (permalink / raw)
To: qemu-devel; +Cc: dgilbert, peter.maydell, quintela, drjones
This patch moves the settings related migration-test from the
migration-test.c file to a seperate header file. It also renames the
x86-a-b-bootblock.s file extension from .s to .S, allowing gcc
pre-processor to include the C-style header file correctly.
Signed-off-by: Wei Huang <wei@redhat.com>
---
tests/migration-test.c | 34 +++++++++++++---------
tests/migration/Makefile | 4 +--
tests/migration/migration-test.h | 22 ++++++++++++++
.../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--
tests/migration/x86-a-b-bootblock.h | 2 +-
5 files changed, 49 insertions(+), 20 deletions(-)
create mode 100644 tests/migration/migration-test.h
rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (94%)
diff --git a/tests/migration-test.c b/tests/migration-test.c
index 74f9361bdd..12c04a9648 100644
--- a/tests/migration-test.c
+++ b/tests/migration-test.c
@@ -21,10 +21,10 @@
#include "sysemu/sysemu.h"
#include "hw/nvram/chrp_nvram.h"
-#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
+#include "migration/migration-test.h"
-const unsigned start_address = 1024 * 1024;
-const unsigned end_address = 100 * 1024 * 1024;
+unsigned start_address;
+unsigned end_address;
bool got_stop;
#if defined(__linux__)
@@ -77,8 +77,8 @@ static bool ufd_version_check(void)
static const char *tmpfs;
-/* A simple PC boot sector that modifies memory (1-100MB) quickly
- * outputting a 'B' every so often if it's still running.
+/* The boot file modifies memory area in [start_address, end_address)
+ * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
*/
#include "tests/migration/x86-a-b-bootblock.h"
@@ -104,9 +104,8 @@ static void init_bootfile_ppc(const char *bootpath)
memcpy(header->name, "common", 6);
chrp_nvram_finish_partition(header, MIN_NVRAM_SIZE);
- /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB,
- * so let's modify memory between 1MB and 100MB
- * to do like PC bootsector
+ /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB. So it is OK to modify
+ * memory between start_address and end_address like PC bootsector does.
*/
sprintf(buf + 16,
@@ -263,11 +262,11 @@ static void wait_for_migration_pass(QTestState *who)
static void check_guests_ram(QTestState *who)
{
/* Our ASM test will have been incrementing one byte from each page from
- * 1MB to <100MB in order.
- * This gives us a constraint that any page's byte should be equal or less
- * than the previous pages byte (mod 256); and they should all be equal
- * except for one transition at the point where we meet the incrementer.
- * (We're running this with the guest stopped).
+ * start_address to < end_address in order. This gives us a constraint
+ * that any page's byte should be equal or less than the previous pages
+ * byte (mod 256); and they should all be equal except for one transition
+ * at the point where we meet the incrementer. (We're running this with
+ * the guest stopped).
*/
unsigned address;
uint8_t first_byte;
@@ -278,7 +277,8 @@ static void check_guests_ram(QTestState *who)
qtest_memread(who, start_address, &first_byte, 1);
last_byte = first_byte;
- for (address = start_address + 4096; address < end_address; address += 4096)
+ for (address = start_address + TEST_MEM_PAGE_SIZE; address < end_address;
+ address += TEST_MEM_PAGE_SIZE)
{
uint8_t b;
qtest_memread(who, address, &b, 1);
@@ -404,6 +404,9 @@ static void test_migrate_start(QTestState **from, QTestState **to,
" -drive file=%s,format=raw"
" -incoming %s",
accel, tmpfs, bootpath, uri);
+
+ start_address = X86_TEST_MEM_START;
+ end_address = X86_TEST_MEM_END;
} else if (strcmp(arch, "ppc64") == 0) {
/* On ppc64, the test only works with kvm-hv, but not with kvm-pr */
@@ -421,6 +424,9 @@ static void test_migrate_start(QTestState **from, QTestState **to,
" -serial file:%s/dest_serial"
" -incoming %s",
accel, tmpfs, uri);
+
+ start_address = PPC_TEST_MEM_START;
+ end_address = PPC_TEST_MEM_END;
} else {
g_assert_not_reached();
}
diff --git a/tests/migration/Makefile b/tests/migration/Makefile
index 8fbedaa8b8..013b8d1f44 100644
--- a/tests/migration/Makefile
+++ b/tests/migration/Makefile
@@ -25,8 +25,8 @@ include $(SRC_PATH)/rules.mak
x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
-x86-a-b-bootblock.h: x86-a-b-bootblock.s
- $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
+x86-a-b-bootblock.h: x86-a-b-bootblock.S
+ $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
$(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
echo "$$__note" > $@
diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
new file mode 100644
index 0000000000..06c46a2fe0
--- /dev/null
+++ b/tests/migration/migration-test.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#ifndef _TEST_MIGRATION_H_
+#define _TEST_MIGRATION_H_
+
+/* Common */
+#define TEST_MEM_PAGE_SIZE 4096
+
+/* x86 */
+#define X86_TEST_MEM_START (1 * 1024 * 1024)
+#define X86_TEST_MEM_END (100 * 1024 * 1024)
+
+/* PPC */
+#define PPC_TEST_MEM_START (1 * 1024 * 1024)
+#define PPC_TEST_MEM_END (100 * 1024 * 1024)
+#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
+
+#endif /* _TEST_MIGRATION_H_ */
diff --git a/tests/migration/x86-a-b-bootblock.s b/tests/migration/x86-a-b-bootblock.S
similarity index 94%
rename from tests/migration/x86-a-b-bootblock.s
rename to tests/migration/x86-a-b-bootblock.S
index 98dbfab084..a4da995a89 100644
--- a/tests/migration/x86-a-b-bootblock.s
+++ b/tests/migration/x86-a-b-bootblock.S
@@ -12,6 +12,7 @@
#
# Author: dgilbert@redhat.com
+#include "migration-test.h"
.code16
.org 0x7c00
@@ -45,11 +46,11 @@ start: # at 0x7c00 ?
mov $0, %bl
mainloop:
# Start from 1MB
- mov $(1024*1024),%eax
+ mov $X86_TEST_MEM_START,%eax
innerloop:
incb (%eax)
- add $4096,%eax
- cmp $(100*1024*1024),%eax
+ add $TEST_MEM_PAGE_SIZE,%eax
+ cmp $X86_TEST_MEM_END,%eax
jl innerloop
inc %bl
diff --git a/tests/migration/x86-a-b-bootblock.h b/tests/migration/x86-a-b-bootblock.h
index 9e8e2e028b..44e4b99506 100644
--- a/tests/migration/x86-a-b-bootblock.h
+++ b/tests/migration/x86-a-b-bootblock.h
@@ -1,5 +1,5 @@
/* This file is automatically generated from
- * tests/migration/x86-a-b-bootblock.s, edit that and then run
+ * tests/migration/x86-a-b-bootblock.S, edit that and then run
* "make x86-a-b-bootblock.h" inside tests/migration to update,
* and then remember to send both in your patch submission.
*/
--
2.14.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64
2018-02-28 18:02 [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64 Wei Huang
` (2 preceding siblings ...)
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file Wei Huang
@ 2018-02-28 18:02 ` Wei Huang
2018-03-01 9:45 ` Andrew Jones
2018-03-12 15:41 ` Andrew Jones
2018-03-01 15:28 ` [Qemu-devel] [PATCH V7 0/4] " Dr. David Alan Gilbert
4 siblings, 2 replies; 22+ messages in thread
From: Wei Huang @ 2018-02-28 18:02 UTC (permalink / raw)
To: qemu-devel; +Cc: dgilbert, peter.maydell, quintela, drjones
This patch adds migration test support for aarch64. The test code, which
implements the same functionality as x86, is booted as a kernel in qemu.
Here are the design choices we make for aarch64:
* We choose this -kernel approach because aarch64 QEMU doesn't provide a
built-in fw like x86 does. So instead of relying on a boot loader, we
use -kernel approach for aarch64.
* The serial output is sent to PL011 directly.
* The physical memory base for mach-virt machine is 0x40000000. We change
the start_address and end_address for aarch64.
In addition to providing the binary, this patch also includes the source
code and the build script in tests/migration/. So users can change the
source and/or re-compile the binary as they wish.
Signed-off-by: Wei Huang <wei@redhat.com>
---
tests/Makefile.include | 1 +
tests/migration-test.c | 44 +++++++++++++++++++--
tests/migration/Makefile | 12 +++++-
tests/migration/aarch64-a-b-kernel.S | 75 ++++++++++++++++++++++++++++++++++++
tests/migration/aarch64-a-b-kernel.h | 19 +++++++++
tests/migration/migration-test.h | 9 +++++
6 files changed, 154 insertions(+), 6 deletions(-)
create mode 100644 tests/migration/aarch64-a-b-kernel.S
create mode 100644 tests/migration/aarch64-a-b-kernel.h
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 577eb573a2..538173866c 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -372,6 +372,7 @@ check-qtest-arm-y += tests/sdhci-test$(EXESUF)
check-qtest-aarch64-y = tests/numa-test$(EXESUF)
check-qtest-aarch64-y += tests/sdhci-test$(EXESUF)
check-qtest-aarch64-y += tests/boot-serial-test$(EXESUF)
+check-qtest-aarch64-y += tests/migration-test$(EXESUF)
check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
diff --git a/tests/migration-test.c b/tests/migration-test.c
index 12c04a9648..ff424330a1 100644
--- a/tests/migration-test.c
+++ b/tests/migration-test.c
@@ -11,6 +11,7 @@
*/
#include "qemu/osdep.h"
+#include <sys/utsname.h>
#include "libqtest.h"
#include "qapi/qmp/qdict.h"
@@ -81,12 +82,13 @@ static const char *tmpfs;
* repeatedly. It outputs a 'B' at a fixed rate while it's still running.
*/
#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/aarch64-a-b-kernel.h"
-static void init_bootfile_x86(const char *bootpath)
+static void init_bootfile(const char *bootpath, void *content)
{
FILE *bootfile = fopen(bootpath, "wb");
- g_assert_cmpint(fwrite(x86_bootsect, 512, 1, bootfile), ==, 1);
+ g_assert_cmpint(fwrite(content, 512, 1, bootfile), ==, 1);
fclose(bootfile);
}
@@ -392,7 +394,7 @@ static void test_migrate_start(QTestState **from, QTestState **to,
got_stop = false;
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
- init_bootfile_x86(bootpath);
+ init_bootfile(bootpath, x86_bootsect);
cmd_src = g_strdup_printf("-machine accel=%s -m 150M"
" -name source,debug-threads=on"
" -serial file:%s/src_serial"
@@ -427,6 +429,40 @@ static void test_migrate_start(QTestState **from, QTestState **to,
start_address = PPC_TEST_MEM_START;
end_address = PPC_TEST_MEM_END;
+ } else if (strcmp(arch, "aarch64") == 0) {
+ const char *cpu;
+ const char *gic_ver;
+ struct utsname utsname;
+
+ /* kvm and tcg need different cpu and gic-version configs */
+ if (access("/dev/kvm", F_OK) == 0 && uname(&utsname) == 0 &&
+ strcmp(utsname.machine, "aarch64") == 0) {
+ accel = "kvm";
+ cpu = "host";
+ gic_ver = "host";
+ } else {
+ accel = "tcg";
+ cpu = "cortex-a57";
+ gic_ver = "2";
+ }
+
+ init_bootfile(bootpath, aarch64_kernel);
+ cmd_src = g_strdup_printf("-machine virt,accel=%s,gic-version=%s "
+ "-name vmsource,debug-threads=on -cpu %s "
+ "-m 150M -serial file:%s/src_serial "
+ "-kernel %s ",
+ accel, gic_ver, cpu, tmpfs, bootpath);
+ cmd_dst = g_strdup_printf("-machine virt,accel=%s,gic-version=%s "
+ "-name vmdest,debug-threads=on -cpu %s "
+ "-m 150M -serial file:%s/dest_serial "
+ "-kernel %s "
+ "-incoming %s ",
+ accel, gic_ver, cpu, tmpfs, bootpath, uri);
+
+ start_address = ARM_TEST_MEM_START;
+ end_address = ARM_TEST_MEM_END;
+
+ g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
} else {
g_assert_not_reached();
}
@@ -511,7 +547,7 @@ static void test_deprecated(void)
{
QTestState *from;
- from = qtest_start("");
+ from = qtest_start("-machine none");
deprecated_set_downtime(from, 0.12345);
deprecated_set_speed(from, "12345");
diff --git a/tests/migration/Makefile b/tests/migration/Makefile
index 013b8d1f44..1324427a93 100644
--- a/tests/migration/Makefile
+++ b/tests/migration/Makefile
@@ -16,7 +16,7 @@ override define __note
*/
endef
-all: x86-a-b-bootblock.h
+all: x86-a-b-bootblock.h aarch64-a-b-kernel.h
# Dummy command so that make thinks it has done something
@true
@@ -24,6 +24,7 @@ SRC_PATH=../..
include $(SRC_PATH)/rules.mak
x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
+aarch64_cross_prefix := $(call find-cross-prefix,aarch64)
x86-a-b-bootblock.h: x86-a-b-bootblock.S
$(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
@@ -32,5 +33,12 @@ x86-a-b-bootblock.h: x86-a-b-bootblock.S
echo "$$__note" > $@
xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@
+aarch64-a-b-kernel.h: aarch64-a-b-kernel.S
+ $(aarch64_cross_prefix)gcc -o aarch64.elf -nostdlib \
+ -Wl,--build-id=none $<
+ $(aarch64_cross_prefix)objcopy -O binary aarch64.elf aarch64.kernel
+ echo "$$__note" > $@
+ xxd -i aarch64.kernel | sed -e 's/.*int.*//' >> $@
+
clean:
- rm -f *.bootsect *.boot *.o
+ rm -f *.bootsect *.boot *.o *.elf *.kernel
diff --git a/tests/migration/aarch64-a-b-kernel.S b/tests/migration/aarch64-a-b-kernel.S
new file mode 100644
index 0000000000..eec8f44f16
--- /dev/null
+++ b/tests/migration/aarch64-a-b-kernel.S
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
+#
+# Author:
+# Wei Huang <wei@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or later.
+# See the COPYING file in the top-level directory.
+#
+# Note: Please make sure the compiler compiles the assembly code below with
+# pc-relative address. Also the branch instructions should use relative
+# addresses only.
+
+#include "migration-test.h"
+
+.section .text
+
+ .globl _start
+
+_start:
+ /* disable MMU to use phys mem address */
+ mrs x0, sctlr_el1
+ bic x0, x0, #(1<<0)
+ msr sctlr_el1, x0
+ isb
+
+ /* traverse test memory region */
+ mov x0, #ARM_TEST_MEM_START
+ mov x1, #ARM_TEST_MEM_END
+
+ /* output char 'A' to PL011 */
+ mov w3, 'A'
+ mov x2, #ARM_MACH_VIRT_UART
+ strb w3, [x2]
+
+ /* clean up memory */
+ mov w3, #0
+ mov x4, x0
+clean:
+ strb w3, [x4]
+ add x4, x4, #TEST_MEM_PAGE_SIZE
+ cmp x4, x1
+ ble clean
+
+ /* w5 keeps a counter so we can limit the output speed */
+ mov w5, #0
+
+ /* main body */
+mainloop:
+ mov x4, x0
+
+innerloop:
+ /* clean cache because el2 might still cache guest data under KVM */
+ dc civac, x4
+
+ /* increment the first byte of each page by 1 */
+ ldrb w3, [x4]
+ add w3, w3, #1
+ and w3, w3, #0xff
+ strb w3, [x4]
+
+ add x4, x4, #TEST_MEM_PAGE_SIZE
+ cmp x4, x1
+ blt innerloop
+
+ add w5, w5, #1
+ and w5, w5, #0xff
+ cmp w5, #0
+ bne mainloop
+
+ /* output char 'B' to PL011 */
+ mov w3, 'B'
+ strb w3, [x2]
+
+ b mainloop
diff --git a/tests/migration/aarch64-a-b-kernel.h b/tests/migration/aarch64-a-b-kernel.h
new file mode 100644
index 0000000000..53b44d3e99
--- /dev/null
+++ b/tests/migration/aarch64-a-b-kernel.h
@@ -0,0 +1,19 @@
+/* This file is automatically generated from
+ * tests/migration/aarch64-a-b-kernel.S, edit that and then run
+ * "make aarch64-a-b-kernel.h" inside tests/migration to update,
+ * and then remember to send both in your patch submission.
+ */
+unsigned char aarch64_kernel[] = {
+ 0x00, 0x10, 0x38, 0xd5, 0x00, 0xf8, 0x7f, 0x92, 0x00, 0x10, 0x18, 0xd5,
+ 0xdf, 0x3f, 0x03, 0xd5, 0x00, 0x02, 0xa8, 0xd2, 0x01, 0xc8, 0xa8, 0xd2,
+ 0x23, 0x08, 0x80, 0x52, 0x02, 0x20, 0xa1, 0xd2, 0x43, 0x00, 0x00, 0x39,
+ 0x03, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x00, 0xaa, 0x83, 0x00, 0x00, 0x39,
+ 0x84, 0x04, 0x40, 0x91, 0x9f, 0x00, 0x01, 0xeb, 0xad, 0xff, 0xff, 0x54,
+ 0x05, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x00, 0xaa, 0x24, 0x7e, 0x0b, 0xd5,
+ 0x83, 0x00, 0x40, 0x39, 0x63, 0x04, 0x00, 0x11, 0x63, 0x1c, 0x00, 0x12,
+ 0x83, 0x00, 0x00, 0x39, 0x84, 0x04, 0x40, 0x91, 0x9f, 0x00, 0x01, 0xeb,
+ 0x2b, 0xff, 0xff, 0x54, 0xa5, 0x04, 0x00, 0x11, 0xa5, 0x1c, 0x00, 0x12,
+ 0xbf, 0x00, 0x00, 0x71, 0x81, 0xfe, 0xff, 0x54, 0x43, 0x08, 0x80, 0x52,
+ 0x43, 0x00, 0x00, 0x39, 0xf1, 0xff, 0xff, 0x17
+};
+
diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
index 06c46a2fe0..a55b74c98c 100644
--- a/tests/migration/migration-test.h
+++ b/tests/migration/migration-test.h
@@ -19,4 +19,13 @@
#define PPC_TEST_MEM_END (100 * 1024 * 1024)
#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
+/* ARM */
+#define ARM_TEST_MEM_START (0x40000000 + 1 * 1024 * 1024)
+#define ARM_TEST_MEM_END (0x40000000 + 100 * 1024 * 1024)
+#define ARM_MACH_VIRT_UART 0x09000000
+/* AArch64 kernel load address is 0x40080000, and the test memory starts at
+ * 0x40100000. So the maximum allowable kernel size is 512KB.
+ */
+#define ARM_TEST_MAX_KERNEL_SIZE (512 * 1024)
+
#endif /* _TEST_MIGRATION_H_ */
--
2.14.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64 Wei Huang
@ 2018-03-01 9:45 ` Andrew Jones
2018-03-12 15:41 ` Andrew Jones
1 sibling, 0 replies; 22+ messages in thread
From: Andrew Jones @ 2018-03-01 9:45 UTC (permalink / raw)
To: Wei Huang; +Cc: qemu-devel, dgilbert, peter.maydell, quintela
On Wed, Feb 28, 2018 at 12:02:15PM -0600, Wei Huang wrote:
> This patch adds migration test support for aarch64. The test code, which
> implements the same functionality as x86, is booted as a kernel in qemu.
> Here are the design choices we make for aarch64:
>
> * We choose this -kernel approach because aarch64 QEMU doesn't provide a
> built-in fw like x86 does. So instead of relying on a boot loader, we
> use -kernel approach for aarch64.
> * The serial output is sent to PL011 directly.
> * The physical memory base for mach-virt machine is 0x40000000. We change
> the start_address and end_address for aarch64.
>
> In addition to providing the binary, this patch also includes the source
> code and the build script in tests/migration/. So users can change the
> source and/or re-compile the binary as they wish.
>
> Signed-off-by: Wei Huang <wei@redhat.com>
> ---
> tests/Makefile.include | 1 +
> tests/migration-test.c | 44 +++++++++++++++++++--
> tests/migration/Makefile | 12 +++++-
> tests/migration/aarch64-a-b-kernel.S | 75 ++++++++++++++++++++++++++++++++++++
> tests/migration/aarch64-a-b-kernel.h | 19 +++++++++
> tests/migration/migration-test.h | 9 +++++
> 6 files changed, 154 insertions(+), 6 deletions(-)
> create mode 100644 tests/migration/aarch64-a-b-kernel.S
> create mode 100644 tests/migration/aarch64-a-b-kernel.h
>
Reviewed-by: Andrew Jones <drjones@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file Wei Huang
@ 2018-03-01 9:48 ` Andrew Jones
2018-03-01 15:26 ` Dr. David Alan Gilbert
0 siblings, 1 reply; 22+ messages in thread
From: Andrew Jones @ 2018-03-01 9:48 UTC (permalink / raw)
To: Wei Huang; +Cc: qemu-devel, peter.maydell, dgilbert, quintela
On Wed, Feb 28, 2018 at 12:02:14PM -0600, Wei Huang wrote:
> This patch moves the settings related migration-test from the
> migration-test.c file to a seperate header file. It also renames the
> x86-a-b-bootblock.s file extension from .s to .S, allowing gcc
> pre-processor to include the C-style header file correctly.
>
> Signed-off-by: Wei Huang <wei@redhat.com>
> ---
> tests/migration-test.c | 34 +++++++++++++---------
> tests/migration/Makefile | 4 +--
> tests/migration/migration-test.h | 22 ++++++++++++++
> .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--
> tests/migration/x86-a-b-bootblock.h | 2 +-
> 5 files changed, 49 insertions(+), 20 deletions(-)
> create mode 100644 tests/migration/migration-test.h
> rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (94%)
>
> diff --git a/tests/migration-test.c b/tests/migration-test.c
> index 74f9361bdd..12c04a9648 100644
> --- a/tests/migration-test.c
> +++ b/tests/migration-test.c
> @@ -21,10 +21,10 @@
> #include "sysemu/sysemu.h"
> #include "hw/nvram/chrp_nvram.h"
>
> -#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
> +#include "migration/migration-test.h"
>
> -const unsigned start_address = 1024 * 1024;
> -const unsigned end_address = 100 * 1024 * 1024;
> +unsigned start_address;
> +unsigned end_address;
> bool got_stop;
>
> #if defined(__linux__)
> @@ -77,8 +77,8 @@ static bool ufd_version_check(void)
>
> static const char *tmpfs;
>
> -/* A simple PC boot sector that modifies memory (1-100MB) quickly
> - * outputting a 'B' every so often if it's still running.
> +/* The boot file modifies memory area in [start_address, end_address)
> + * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
> */
> #include "tests/migration/x86-a-b-bootblock.h"
>
> @@ -104,9 +104,8 @@ static void init_bootfile_ppc(const char *bootpath)
> memcpy(header->name, "common", 6);
> chrp_nvram_finish_partition(header, MIN_NVRAM_SIZE);
>
> - /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB,
> - * so let's modify memory between 1MB and 100MB
> - * to do like PC bootsector
> + /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB. So it is OK to modify
> + * memory between start_address and end_address like PC bootsector does.
This comment reads a bit strange now that it starts with explicit sizes
and then uses generic terms. I think I'd move the comment to the header
file where PPC_TEST_MEM_START/END are defined, tweaking it a bit. Also,
the same g_assert enforcement done for AArch64 could be applied to PPC,
but with a max kernel size of 100K. Even PC could get an assert, but with
a max kernel size of 1M.
> */
>
> sprintf(buf + 16,
> @@ -263,11 +262,11 @@ static void wait_for_migration_pass(QTestState *who)
> static void check_guests_ram(QTestState *who)
> {
> /* Our ASM test will have been incrementing one byte from each page from
> - * 1MB to <100MB in order.
> - * This gives us a constraint that any page's byte should be equal or less
> - * than the previous pages byte (mod 256); and they should all be equal
> - * except for one transition at the point where we meet the incrementer.
> - * (We're running this with the guest stopped).
> + * start_address to < end_address in order. This gives us a constraint
> + * that any page's byte should be equal or less than the previous pages
> + * byte (mod 256); and they should all be equal except for one transition
> + * at the point where we meet the incrementer. (We're running this with
> + * the guest stopped).
> */
> unsigned address;
> uint8_t first_byte;
> @@ -278,7 +277,8 @@ static void check_guests_ram(QTestState *who)
> qtest_memread(who, start_address, &first_byte, 1);
> last_byte = first_byte;
>
> - for (address = start_address + 4096; address < end_address; address += 4096)
> + for (address = start_address + TEST_MEM_PAGE_SIZE; address < end_address;
> + address += TEST_MEM_PAGE_SIZE)
> {
> uint8_t b;
> qtest_memread(who, address, &b, 1);
> @@ -404,6 +404,9 @@ static void test_migrate_start(QTestState **from, QTestState **to,
> " -drive file=%s,format=raw"
> " -incoming %s",
> accel, tmpfs, bootpath, uri);
> +
> + start_address = X86_TEST_MEM_START;
> + end_address = X86_TEST_MEM_END;
> } else if (strcmp(arch, "ppc64") == 0) {
>
> /* On ppc64, the test only works with kvm-hv, but not with kvm-pr */
> @@ -421,6 +424,9 @@ static void test_migrate_start(QTestState **from, QTestState **to,
> " -serial file:%s/dest_serial"
> " -incoming %s",
> accel, tmpfs, uri);
> +
> + start_address = PPC_TEST_MEM_START;
> + end_address = PPC_TEST_MEM_END;
> } else {
> g_assert_not_reached();
> }
> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> index 8fbedaa8b8..013b8d1f44 100644
> --- a/tests/migration/Makefile
> +++ b/tests/migration/Makefile
> @@ -25,8 +25,8 @@ include $(SRC_PATH)/rules.mak
>
> x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
>
> -x86-a-b-bootblock.h: x86-a-b-bootblock.s
> - $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
> +x86-a-b-bootblock.h: x86-a-b-bootblock.S
> + $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
> $(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
> dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
> echo "$$__note" > $@
> diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
> new file mode 100644
> index 0000000000..06c46a2fe0
> --- /dev/null
> +++ b/tests/migration/migration-test.h
> @@ -0,0 +1,22 @@
> +/*
> + * Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +#ifndef _TEST_MIGRATION_H_
> +#define _TEST_MIGRATION_H_
> +
> +/* Common */
> +#define TEST_MEM_PAGE_SIZE 4096
> +
> +/* x86 */
> +#define X86_TEST_MEM_START (1 * 1024 * 1024)
> +#define X86_TEST_MEM_END (100 * 1024 * 1024)
> +
> +/* PPC */
> +#define PPC_TEST_MEM_START (1 * 1024 * 1024)
> +#define PPC_TEST_MEM_END (100 * 1024 * 1024)
> +#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
> +
> +#endif /* _TEST_MIGRATION_H_ */
> diff --git a/tests/migration/x86-a-b-bootblock.s b/tests/migration/x86-a-b-bootblock.S
> similarity index 94%
> rename from tests/migration/x86-a-b-bootblock.s
> rename to tests/migration/x86-a-b-bootblock.S
> index 98dbfab084..a4da995a89 100644
> --- a/tests/migration/x86-a-b-bootblock.s
> +++ b/tests/migration/x86-a-b-bootblock.S
> @@ -12,6 +12,7 @@
> #
> # Author: dgilbert@redhat.com
>
> +#include "migration-test.h"
>
> .code16
> .org 0x7c00
> @@ -45,11 +46,11 @@ start: # at 0x7c00 ?
> mov $0, %bl
> mainloop:
> # Start from 1MB
> - mov $(1024*1024),%eax
> + mov $X86_TEST_MEM_START,%eax
> innerloop:
> incb (%eax)
> - add $4096,%eax
> - cmp $(100*1024*1024),%eax
> + add $TEST_MEM_PAGE_SIZE,%eax
> + cmp $X86_TEST_MEM_END,%eax
> jl innerloop
>
> inc %bl
> diff --git a/tests/migration/x86-a-b-bootblock.h b/tests/migration/x86-a-b-bootblock.h
> index 9e8e2e028b..44e4b99506 100644
> --- a/tests/migration/x86-a-b-bootblock.h
> +++ b/tests/migration/x86-a-b-bootblock.h
> @@ -1,5 +1,5 @@
> /* This file is automatically generated from
> - * tests/migration/x86-a-b-bootblock.s, edit that and then run
> + * tests/migration/x86-a-b-bootblock.S, edit that and then run
> * "make x86-a-b-bootblock.h" inside tests/migration to update,
> * and then remember to send both in your patch submission.
> */
> --
> 2.14.3
>
>
I added a new suggestion to this patch, but it's not a deal breaker for
me, so
Reviewed-by: Andrew Jones <drjones@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file
2018-03-01 9:48 ` Andrew Jones
@ 2018-03-01 15:26 ` Dr. David Alan Gilbert
0 siblings, 0 replies; 22+ messages in thread
From: Dr. David Alan Gilbert @ 2018-03-01 15:26 UTC (permalink / raw)
To: Andrew Jones; +Cc: Wei Huang, qemu-devel, peter.maydell, quintela
* Andrew Jones (drjones@redhat.com) wrote:
> On Wed, Feb 28, 2018 at 12:02:14PM -0600, Wei Huang wrote:
> > This patch moves the settings related migration-test from the
> > migration-test.c file to a seperate header file. It also renames the
> > x86-a-b-bootblock.s file extension from .s to .S, allowing gcc
> > pre-processor to include the C-style header file correctly.
> >
> > Signed-off-by: Wei Huang <wei@redhat.com>
> > ---
> > tests/migration-test.c | 34 +++++++++++++---------
> > tests/migration/Makefile | 4 +--
> > tests/migration/migration-test.h | 22 ++++++++++++++
> > .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--
> > tests/migration/x86-a-b-bootblock.h | 2 +-
> > 5 files changed, 49 insertions(+), 20 deletions(-)
> > create mode 100644 tests/migration/migration-test.h
> > rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (94%)
> >
> > diff --git a/tests/migration-test.c b/tests/migration-test.c
> > index 74f9361bdd..12c04a9648 100644
> > --- a/tests/migration-test.c
> > +++ b/tests/migration-test.c
> > @@ -21,10 +21,10 @@
> > #include "sysemu/sysemu.h"
> > #include "hw/nvram/chrp_nvram.h"
> >
> > -#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
> > +#include "migration/migration-test.h"
> >
> > -const unsigned start_address = 1024 * 1024;
> > -const unsigned end_address = 100 * 1024 * 1024;
> > +unsigned start_address;
> > +unsigned end_address;
> > bool got_stop;
> >
> > #if defined(__linux__)
> > @@ -77,8 +77,8 @@ static bool ufd_version_check(void)
> >
> > static const char *tmpfs;
> >
> > -/* A simple PC boot sector that modifies memory (1-100MB) quickly
> > - * outputting a 'B' every so often if it's still running.
> > +/* The boot file modifies memory area in [start_address, end_address)
> > + * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
> > */
> > #include "tests/migration/x86-a-b-bootblock.h"
> >
> > @@ -104,9 +104,8 @@ static void init_bootfile_ppc(const char *bootpath)
> > memcpy(header->name, "common", 6);
> > chrp_nvram_finish_partition(header, MIN_NVRAM_SIZE);
> >
> > - /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB,
> > - * so let's modify memory between 1MB and 100MB
> > - * to do like PC bootsector
> > + /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB. So it is OK to modify
> > + * memory between start_address and end_address like PC bootsector does.
>
> This comment reads a bit strange now that it starts with explicit sizes
> and then uses generic terms. I think I'd move the comment to the header
> file where PPC_TEST_MEM_START/END are defined, tweaking it a bit. Also,
> the same g_assert enforcement done for AArch64 could be applied to PPC,
> but with a max kernel size of 100K. Even PC could get an assert, but with
> a max kernel size of 1M.
IMHO the easiest solution here is just to leave the ppc comments alone;
if ppc wants to change it they can do.
Dave
>
> > */
> >
> > sprintf(buf + 16,
> > @@ -263,11 +262,11 @@ static void wait_for_migration_pass(QTestState *who)
> > static void check_guests_ram(QTestState *who)
> > {
> > /* Our ASM test will have been incrementing one byte from each page from
> > - * 1MB to <100MB in order.
> > - * This gives us a constraint that any page's byte should be equal or less
> > - * than the previous pages byte (mod 256); and they should all be equal
> > - * except for one transition at the point where we meet the incrementer.
> > - * (We're running this with the guest stopped).
> > + * start_address to < end_address in order. This gives us a constraint
> > + * that any page's byte should be equal or less than the previous pages
> > + * byte (mod 256); and they should all be equal except for one transition
> > + * at the point where we meet the incrementer. (We're running this with
> > + * the guest stopped).
> > */
> > unsigned address;
> > uint8_t first_byte;
> > @@ -278,7 +277,8 @@ static void check_guests_ram(QTestState *who)
> > qtest_memread(who, start_address, &first_byte, 1);
> > last_byte = first_byte;
> >
> > - for (address = start_address + 4096; address < end_address; address += 4096)
> > + for (address = start_address + TEST_MEM_PAGE_SIZE; address < end_address;
> > + address += TEST_MEM_PAGE_SIZE)
> > {
> > uint8_t b;
> > qtest_memread(who, address, &b, 1);
> > @@ -404,6 +404,9 @@ static void test_migrate_start(QTestState **from, QTestState **to,
> > " -drive file=%s,format=raw"
> > " -incoming %s",
> > accel, tmpfs, bootpath, uri);
> > +
> > + start_address = X86_TEST_MEM_START;
> > + end_address = X86_TEST_MEM_END;
> > } else if (strcmp(arch, "ppc64") == 0) {
> >
> > /* On ppc64, the test only works with kvm-hv, but not with kvm-pr */
> > @@ -421,6 +424,9 @@ static void test_migrate_start(QTestState **from, QTestState **to,
> > " -serial file:%s/dest_serial"
> > " -incoming %s",
> > accel, tmpfs, uri);
> > +
> > + start_address = PPC_TEST_MEM_START;
> > + end_address = PPC_TEST_MEM_END;
> > } else {
> > g_assert_not_reached();
> > }
> > diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> > index 8fbedaa8b8..013b8d1f44 100644
> > --- a/tests/migration/Makefile
> > +++ b/tests/migration/Makefile
> > @@ -25,8 +25,8 @@ include $(SRC_PATH)/rules.mak
> >
> > x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> >
> > -x86-a-b-bootblock.h: x86-a-b-bootblock.s
> > - $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
> > +x86-a-b-bootblock.h: x86-a-b-bootblock.S
> > + $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
> > $(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
> > dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
> > echo "$$__note" > $@
> > diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
> > new file mode 100644
> > index 0000000000..06c46a2fe0
> > --- /dev/null
> > +++ b/tests/migration/migration-test.h
> > @@ -0,0 +1,22 @@
> > +/*
> > + * Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
> > + *
> > + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> > + * See the COPYING file in the top-level directory.
> > + */
> > +#ifndef _TEST_MIGRATION_H_
> > +#define _TEST_MIGRATION_H_
> > +
> > +/* Common */
> > +#define TEST_MEM_PAGE_SIZE 4096
> > +
> > +/* x86 */
> > +#define X86_TEST_MEM_START (1 * 1024 * 1024)
> > +#define X86_TEST_MEM_END (100 * 1024 * 1024)
> > +
> > +/* PPC */
> > +#define PPC_TEST_MEM_START (1 * 1024 * 1024)
> > +#define PPC_TEST_MEM_END (100 * 1024 * 1024)
> > +#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
> > +
> > +#endif /* _TEST_MIGRATION_H_ */
> > diff --git a/tests/migration/x86-a-b-bootblock.s b/tests/migration/x86-a-b-bootblock.S
> > similarity index 94%
> > rename from tests/migration/x86-a-b-bootblock.s
> > rename to tests/migration/x86-a-b-bootblock.S
> > index 98dbfab084..a4da995a89 100644
> > --- a/tests/migration/x86-a-b-bootblock.s
> > +++ b/tests/migration/x86-a-b-bootblock.S
> > @@ -12,6 +12,7 @@
> > #
> > # Author: dgilbert@redhat.com
> >
> > +#include "migration-test.h"
> >
> > .code16
> > .org 0x7c00
> > @@ -45,11 +46,11 @@ start: # at 0x7c00 ?
> > mov $0, %bl
> > mainloop:
> > # Start from 1MB
> > - mov $(1024*1024),%eax
> > + mov $X86_TEST_MEM_START,%eax
> > innerloop:
> > incb (%eax)
> > - add $4096,%eax
> > - cmp $(100*1024*1024),%eax
> > + add $TEST_MEM_PAGE_SIZE,%eax
> > + cmp $X86_TEST_MEM_END,%eax
> > jl innerloop
> >
> > inc %bl
> > diff --git a/tests/migration/x86-a-b-bootblock.h b/tests/migration/x86-a-b-bootblock.h
> > index 9e8e2e028b..44e4b99506 100644
> > --- a/tests/migration/x86-a-b-bootblock.h
> > +++ b/tests/migration/x86-a-b-bootblock.h
> > @@ -1,5 +1,5 @@
> > /* This file is automatically generated from
> > - * tests/migration/x86-a-b-bootblock.s, edit that and then run
> > + * tests/migration/x86-a-b-bootblock.S, edit that and then run
> > * "make x86-a-b-bootblock.h" inside tests/migration to update,
> > * and then remember to send both in your patch submission.
> > */
> > --
> > 2.14.3
> >
> >
>
> I added a new suggestion to this patch, but it's not a deal breaker for
> me, so
>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64
2018-02-28 18:02 [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64 Wei Huang
` (3 preceding siblings ...)
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64 Wei Huang
@ 2018-03-01 15:28 ` Dr. David Alan Gilbert
4 siblings, 0 replies; 22+ messages in thread
From: Dr. David Alan Gilbert @ 2018-03-01 15:28 UTC (permalink / raw)
To: Wei Huang; +Cc: qemu-devel, peter.maydell, quintela, drjones
* Wei Huang (wei@redhat.com) wrote:
> This patchset adds a migration test for aarch64. It leverages
> Dave Gilbert's recent patch "tests/migration: Add source to PC boot block"
> to create a new test case for aarch64.
Other than Drew's comment about the ppc comment; I'm happy with this.
Dave
> V6->V7:
> * Define test memory start/end addresses for all architectures
> * Check aarch64 kernel binary size, limit under 512KB
>
> V5->V6:
> * Add Reviewed-by to patch 1-3
> * Add more design notes in patch 4 (aarch64 assembly compilation, bin space)
>
> V4->V5:
> * Extract cross compilation detection code into rules.mak for sharing
> * Minor comment and code revision in migration-test.c & aarch64-a-b-kernel.S
>
> V3->V4:
> * Rename .s to .S, allowing assembly to include C-style header file
> * Move test defines into a new migration-test.h file
> * Use different cpu & gic settings for kvm and tcg modes on aarch64
> * Clean up aarch64-a-b-kernel.S based on Andrew Jones' comments
>
> V2->V3:
> * Convert build script to Makefile
> * Add cross-compilation support
> * Fix CPU type for "tcg" machine type
> * Revise asm code and the compilation process from asm to header file
>
> V1->V2:
> * Similar to Dave Gilbert's recent changes to migration-test, we
> provide the test source and a build script in V2.
> * aarch64 kernel blob is defined as "unsigned char" because the source
> is now provided in V2.
> * Add "-machine none" to test_deprecated() because aarch64 doesn't have
> a default machine type.
>
> RFC->V1:
> * aarch64 kernel blob is defined as an uint32_t array
> * The test code is re-written to address a data caching issue under KVM.
> Tests passed under both x86 and aarch64.
> * Re-use init_bootfile_x86() for both x86 and aarch64
> * Other minor fixes
>
> Thanks,
> -Wei
>
> Wei Huang (4):
> rules: Move cross compilation auto detection functions to rules.mak
> tests/migration: Convert the boot block compilation script into
> Makefile
> tests/migration: Add migration-test header file
> tests: Add migration test for aarch64
>
> roms/Makefile | 24 ++-----
> rules.mak | 15 +++++
> tests/Makefile.include | 1 +
> tests/migration-test.c | 78 +++++++++++++++++-----
> tests/migration/Makefile | 44 ++++++++++++
> tests/migration/aarch64-a-b-kernel.S | 75 +++++++++++++++++++++
> tests/migration/aarch64-a-b-kernel.h | 19 ++++++
> tests/migration/migration-test.h | 31 +++++++++
> tests/migration/rebuild-x86-bootblock.sh | 33 ---------
> .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 12 ++--
> tests/migration/x86-a-b-bootblock.h | 4 +-
> 11 files changed, 260 insertions(+), 76 deletions(-)
> create mode 100644 tests/migration/Makefile
> create mode 100644 tests/migration/aarch64-a-b-kernel.S
> create mode 100644 tests/migration/aarch64-a-b-kernel.h
> create mode 100644 tests/migration/migration-test.h
> delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
> rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (88%)
>
> --
> 2.14.3
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak Wei Huang
@ 2018-03-02 14:51 ` Laurent Vivier
2018-03-02 16:27 ` Laurent Vivier
1 sibling, 0 replies; 22+ messages in thread
From: Laurent Vivier @ 2018-03-02 14:51 UTC (permalink / raw)
To: Wei Huang, qemu-devel; +Cc: peter.maydell, drjones, dgilbert, quintela
On 28/02/2018 19:02, Wei Huang wrote:
> This patch moves the auto detection functions for cross compilation from
> roms/Makefile to rules.mak. So the functions can be shared among Makefiles
> in QEMU.
>
> Signed-off-by: Wei Huang <wei@redhat.com>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
> ---
> roms/Makefile | 24 +++++++-----------------
> rules.mak | 15 +++++++++++++++
> 2 files changed, 22 insertions(+), 17 deletions(-)
>
> diff --git a/roms/Makefile b/roms/Makefile
> index b5e5a69e91..e972c65333 100644
> --- a/roms/Makefile
> +++ b/roms/Makefile
> @@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
> pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
> pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
>
> -#
> -# cross compiler auto detection
> -#
> -path := $(subst :, ,$(PATH))
> -system := $(shell uname -s | tr "A-Z" "a-z")
> -
> -# first find cross binutils in path
> -find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
> -# then check we have cross gcc too
> -find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> -# finally strip off path + toolname so we get the prefix
> -find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> -
> -powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> -powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> -x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> -
> # tag our seabios builds
> SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
>
> @@ -66,6 +49,13 @@ default:
> @echo " skiboot -- update skiboot.lid"
> @echo " u-boot.e500 -- update u-boot.e500"
>
> +SRC_PATH=..
> +include $(SRC_PATH)/rules.mak
Did you check it works for not in-tree build?
Something like:
cd qemu
mkdir build
cd build
../configure
make
...
for instance in po/Makefile, we have:
# Set SRC_PATH for in-tree builds without configuration.
SRC_PATH=..
...
-include ../config-host.mak
include $(SRC_PATH)/rules.mak
and config-host.mak defines the absolute path of SRC_PATH
Thanks,
Laurent
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile Wei Huang
@ 2018-03-02 15:25 ` Laurent Vivier
2018-03-02 15:54 ` Wei Huang
0 siblings, 1 reply; 22+ messages in thread
From: Laurent Vivier @ 2018-03-02 15:25 UTC (permalink / raw)
To: Wei Huang, qemu-devel; +Cc: peter.maydell, drjones, dgilbert, quintela
On 28/02/2018 19:02, Wei Huang wrote:
> The x86 boot block header currently is generated with a shell script.
> To better support other CPUs (e.g. aarch64), we convert the script
> into Makefile. This allows us to 1) support cross-compilation easily,
> and 2) avoid creating a script file for every architecture.
>
> Signed-off-by: Wei Huang <wei@redhat.com>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
> ---
> tests/migration/Makefile | 36 ++++++++++++++++++++++++++++++++
> tests/migration/rebuild-x86-bootblock.sh | 33 -----------------------------
> tests/migration/x86-a-b-bootblock.h | 2 +-
> tests/migration/x86-a-b-bootblock.s | 5 ++---
> 4 files changed, 39 insertions(+), 37 deletions(-)
> create mode 100644 tests/migration/Makefile
> delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
>
> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> new file mode 100644
> index 0000000000..8fbedaa8b8
> --- /dev/null
> +++ b/tests/migration/Makefile
> @@ -0,0 +1,36 @@
> +#
> +# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
> +#
> +# Authors:
> +# Dave Gilbert <dgilbert@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or later.
> +# See the COPYING file in the top-level directory.
> +#
> +export __note
> +override define __note
> +/* This file is automatically generated from
> + * tests/migration/$<, edit that and then run
> + * "make $@" inside tests/migration to update,
> + * and then remember to send both in your patch submission.
> + */
> +endef
> +
> +all: x86-a-b-bootblock.h
> +# Dummy command so that make thinks it has done something
> + @true
> +
> +SRC_PATH=../..
> +include $(SRC_PATH)/rules.mak
does it work in not in-tree build?
> +
> +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> +
> +x86-a-b-bootblock.h: x86-a-b-bootblock.s
> + $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
> + $(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
> + dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
> + echo "$$__note" > $@
> + xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@
To be really in the spirit of a makefile, you should have a rule by target:
x86.o: x86-a-b-bootblock.s
$(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
x86.boot: x86.o
$(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
x86.bootsect: x86.boot
dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
x86-a-b-bootblock.h: x86.bootsect
echo "$$__note" > header.tmp
xxd -i x86.bootsect | sed -e 's/.*int.*//' >> header.tmp
mv header.tmp $@
Thanks,
Laurent
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile
2018-03-02 15:25 ` Laurent Vivier
@ 2018-03-02 15:54 ` Wei Huang
0 siblings, 0 replies; 22+ messages in thread
From: Wei Huang @ 2018-03-02 15:54 UTC (permalink / raw)
To: Laurent Vivier, qemu-devel; +Cc: peter.maydell, drjones, dgilbert, quintela
On 03/02/2018 09:25 AM, Laurent Vivier wrote:
> On 28/02/2018 19:02, Wei Huang wrote:
>> The x86 boot block header currently is generated with a shell script.
>> To better support other CPUs (e.g. aarch64), we convert the script
>> into Makefile. This allows us to 1) support cross-compilation easily,
>> and 2) avoid creating a script file for every architecture.
>>
>> Signed-off-by: Wei Huang <wei@redhat.com>
>> Reviewed-by: Andrew Jones <drjones@redhat.com>
>> ---
>> tests/migration/Makefile | 36 ++++++++++++++++++++++++++++++++
>> tests/migration/rebuild-x86-bootblock.sh | 33 -----------------------------
>> tests/migration/x86-a-b-bootblock.h | 2 +-
>> tests/migration/x86-a-b-bootblock.s | 5 ++---
>> 4 files changed, 39 insertions(+), 37 deletions(-)
>> create mode 100644 tests/migration/Makefile
>> delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
>>
>> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
>> new file mode 100644
>> index 0000000000..8fbedaa8b8
>> --- /dev/null
>> +++ b/tests/migration/Makefile
>> @@ -0,0 +1,36 @@
>> +#
>> +# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
>> +#
>> +# Authors:
>> +# Dave Gilbert <dgilbert@redhat.com>
>> +#
>> +# This work is licensed under the terms of the GNU GPL, version 2 or later.
>> +# See the COPYING file in the top-level directory.
>> +#
>> +export __note
>> +override define __note
>> +/* This file is automatically generated from
>> + * tests/migration/$<, edit that and then run
>> + * "make $@" inside tests/migration to update,
>> + * and then remember to send both in your patch submission.
>> + */
>> +endef
>> +
>> +all: x86-a-b-bootblock.h
>> +# Dummy command so that make thinks it has done something
>> + @true
>> +
>> +SRC_PATH=../..
>> +include $(SRC_PATH)/rules.mak
>
> does it work in not in-tree build?
Yes, I tried it with a out-of-tree build and it worked. More
specifically, because .h file (e.g. x86-a-b-bootblock.h) is provided,
this Makefile is disjoint from the main build system and it has to be
invoked explicitly. So it won't be affected by out-of-tree build.
>
>> +
>> +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
>> +
>> +x86-a-b-bootblock.h: x86-a-b-bootblock.s
>> + $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
>> + $(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
>> + dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
>> + echo "$$__note" > $@
>> + xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@
>
> To be really in the spirit of a makefile, you should have a rule by target:
>
> x86.o: x86-a-b-bootblock.s
> $(x86_64_cross_prefix)as --32 -march=i486 $< -o x86.o
>
> x86.boot: x86.o
> $(x86_64_cross_prefix)objcopy -O binary x86.o x86.boot
>
> x86.bootsect: x86.boot
> dd if=x86.boot of=x86.bootsect bs=256 count=2 skip=124
>
> x86-a-b-bootblock.h: x86.bootsect
> echo "$$__note" > header.tmp
> xxd -i x86.bootsect | sed -e 's/.*int.*//' >> header.tmp
> mv header.tmp $@
>
It is cleaner, I agree. But it will make the Makefile quite bulky
(remember that we have to do the same for aarch64 and others).
> Thanks,
> Laurent
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak Wei Huang
2018-03-02 14:51 ` Laurent Vivier
@ 2018-03-02 16:27 ` Laurent Vivier
2018-03-05 11:01 ` Dr. David Alan Gilbert
1 sibling, 1 reply; 22+ messages in thread
From: Laurent Vivier @ 2018-03-02 16:27 UTC (permalink / raw)
To: Wei Huang, qemu-devel; +Cc: peter.maydell, drjones, dgilbert, quintela
On 28/02/2018 19:02, Wei Huang wrote:
> This patch moves the auto detection functions for cross compilation from
> roms/Makefile to rules.mak. So the functions can be shared among Makefiles
> in QEMU.
>
> Signed-off-by: Wei Huang <wei@redhat.com>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
> ---
> roms/Makefile | 24 +++++++-----------------
> rules.mak | 15 +++++++++++++++
> 2 files changed, 22 insertions(+), 17 deletions(-)
>
> diff --git a/roms/Makefile b/roms/Makefile
> index b5e5a69e91..e972c65333 100644
> --- a/roms/Makefile
> +++ b/roms/Makefile
> @@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
> pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
> pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
>
> -#
> -# cross compiler auto detection
> -#
> -path := $(subst :, ,$(PATH))
> -system := $(shell uname -s | tr "A-Z" "a-z")
> -
> -# first find cross binutils in path
> -find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
> -# then check we have cross gcc too
> -find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> -# finally strip off path + toolname so we get the prefix
> -find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> -
> -powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> -powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> -x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> -
> # tag our seabios builds
> SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
>
> @@ -66,6 +49,13 @@ default:
> @echo " skiboot -- update skiboot.lid"
> @echo " u-boot.e500 -- update u-boot.e500"
>
> +SRC_PATH=..
> +include $(SRC_PATH)/rules.mak
> +
> +powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> +powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> +
> bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
> cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
> cp seabios/builds/seabios-256k/bios.bin ../pc-bios/bios-256k.bin
> diff --git a/rules.mak b/rules.mak
> index 6e943335f3..ef8adee3f8 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -62,6 +62,21 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
> $(foreach o,$(filter %.mo,$1),$($o-objs)) \
> $(filter-out %.o %.mo,$1))
>
> +# Cross compilation auto detection. Use find-cross-prefix to detect the
> +# target archtecture's prefix, and then append it to the build tool or pass
> +# it to CROSS_COMPILE directly. Here is one example:
> +# x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> +# $(x86_64_cross_prefix)gcc -c test.c -o test.o
> +# make -C testdir CROSS_COMPILE=$(x86_64_cross_prefix)
> +cross-search-path := $(subst :, ,$(PATH))
> +cross-host-system := $(shell uname -s | tr "A-Z" "a-z")
> +
> +find-cross-ld = $(firstword $(wildcard $(patsubst \
> + %,%/$(1)-*$(cross-host-system)*-ld,$(cross-search-path))))
> +find-cross-gcc = $(firstword $(wildcard \
> + $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> +find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> +
> %.o: %.c
> $(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \
> $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \
>
With this patch, "make slof" fails:
git submodule init roms/SLOF
git submodule update roms/SLOF
cd roms
make slof
...
make[4]: Entering directory
'/home/lvivier/Projects/qemu-upstream/roms/SLOF/lib/libnvram'
[CC] Makefile.dep
powerpc64-linux-gnu-ar: nvram.o: No such file or directory
make[4]: *** [Makefile:31: ../libnvram.a] Error 1
Perhaps rules.mak defines values inherited by SLOF makefiles that are
incompatible?
Thanks,
Laurent
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-02 16:27 ` Laurent Vivier
@ 2018-03-05 11:01 ` Dr. David Alan Gilbert
2018-03-05 13:36 ` Andrew Jones
0 siblings, 1 reply; 22+ messages in thread
From: Dr. David Alan Gilbert @ 2018-03-05 11:01 UTC (permalink / raw)
To: Laurent Vivier; +Cc: Wei Huang, qemu-devel, peter.maydell, drjones, quintela
* Laurent Vivier (lvivier@redhat.com) wrote:
> On 28/02/2018 19:02, Wei Huang wrote:
> > This patch moves the auto detection functions for cross compilation from
> > roms/Makefile to rules.mak. So the functions can be shared among Makefiles
> > in QEMU.
> >
> > Signed-off-by: Wei Huang <wei@redhat.com>
> > Reviewed-by: Andrew Jones <drjones@redhat.com>
> > ---
> > roms/Makefile | 24 +++++++-----------------
> > rules.mak | 15 +++++++++++++++
> > 2 files changed, 22 insertions(+), 17 deletions(-)
> >
> > diff --git a/roms/Makefile b/roms/Makefile
> > index b5e5a69e91..e972c65333 100644
> > --- a/roms/Makefile
> > +++ b/roms/Makefile
> > @@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
> > pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
> > pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
> >
> > -#
> > -# cross compiler auto detection
> > -#
> > -path := $(subst :, ,$(PATH))
> > -system := $(shell uname -s | tr "A-Z" "a-z")
> > -
> > -# first find cross binutils in path
> > -find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
> > -# then check we have cross gcc too
> > -find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> > -# finally strip off path + toolname so we get the prefix
> > -find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> > -
> > -powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> > -powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> > -x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > -
> > # tag our seabios builds
> > SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
> >
> > @@ -66,6 +49,13 @@ default:
> > @echo " skiboot -- update skiboot.lid"
> > @echo " u-boot.e500 -- update u-boot.e500"
> >
> > +SRC_PATH=..
> > +include $(SRC_PATH)/rules.mak
> > +
> > +powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> > +powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> > +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > +
> > bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
> > cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
> > cp seabios/builds/seabios-256k/bios.bin ../pc-bios/bios-256k.bin
> > diff --git a/rules.mak b/rules.mak
> > index 6e943335f3..ef8adee3f8 100644
> > --- a/rules.mak
> > +++ b/rules.mak
> > @@ -62,6 +62,21 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
> > $(foreach o,$(filter %.mo,$1),$($o-objs)) \
> > $(filter-out %.o %.mo,$1))
> >
> > +# Cross compilation auto detection. Use find-cross-prefix to detect the
> > +# target archtecture's prefix, and then append it to the build tool or pass
> > +# it to CROSS_COMPILE directly. Here is one example:
> > +# x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > +# $(x86_64_cross_prefix)gcc -c test.c -o test.o
> > +# make -C testdir CROSS_COMPILE=$(x86_64_cross_prefix)
> > +cross-search-path := $(subst :, ,$(PATH))
> > +cross-host-system := $(shell uname -s | tr "A-Z" "a-z")
> > +
> > +find-cross-ld = $(firstword $(wildcard $(patsubst \
> > + %,%/$(1)-*$(cross-host-system)*-ld,$(cross-search-path))))
> > +find-cross-gcc = $(firstword $(wildcard \
> > + $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> > +find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> > +
> > %.o: %.c
> > $(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \
> > $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \
> >
>
> With this patch, "make slof" fails:
>
> git submodule init roms/SLOF
> git submodule update roms/SLOF
> cd roms
> make slof
> ...
> make[4]: Entering directory
> '/home/lvivier/Projects/qemu-upstream/roms/SLOF/lib/libnvram'
> [CC] Makefile.dep
> powerpc64-linux-gnu-ar: nvram.o: No such file or directory
> make[4]: *** [Makefile:31: ../libnvram.a] Error 1
>
> Perhaps rules.mak defines values inherited by SLOF makefiles that are
> incompatible?
OK, can we go back a step here; and split this series; it's trying to do
two entirely different things:
a) Add an aarch64 migration test
b) Refactor some of the build stuff
I'd like to see (a) posted separately, doing things approximately the same way that
the x86 ROM is doing it.
Dave
> Thanks,
> Laurent
>
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 11:01 ` Dr. David Alan Gilbert
@ 2018-03-05 13:36 ` Andrew Jones
2018-03-05 13:40 ` Peter Maydell
2018-03-05 13:52 ` Dr. David Alan Gilbert
0 siblings, 2 replies; 22+ messages in thread
From: Andrew Jones @ 2018-03-05 13:36 UTC (permalink / raw)
To: Dr. David Alan Gilbert
Cc: Laurent Vivier, Wei Huang, peter.maydell, qemu-devel, quintela
On Mon, Mar 05, 2018 at 11:01:23AM +0000, Dr. David Alan Gilbert wrote:
> * Laurent Vivier (lvivier@redhat.com) wrote:
> > On 28/02/2018 19:02, Wei Huang wrote:
> > > This patch moves the auto detection functions for cross compilation from
> > > roms/Makefile to rules.mak. So the functions can be shared among Makefiles
> > > in QEMU.
> > >
> > > Signed-off-by: Wei Huang <wei@redhat.com>
> > > Reviewed-by: Andrew Jones <drjones@redhat.com>
> > > ---
> > > roms/Makefile | 24 +++++++-----------------
> > > rules.mak | 15 +++++++++++++++
> > > 2 files changed, 22 insertions(+), 17 deletions(-)
> > >
> > > diff --git a/roms/Makefile b/roms/Makefile
> > > index b5e5a69e91..e972c65333 100644
> > > --- a/roms/Makefile
> > > +++ b/roms/Makefile
> > > @@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
> > > pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
> > > pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
> > >
> > > -#
> > > -# cross compiler auto detection
> > > -#
> > > -path := $(subst :, ,$(PATH))
> > > -system := $(shell uname -s | tr "A-Z" "a-z")
> > > -
> > > -# first find cross binutils in path
> > > -find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
> > > -# then check we have cross gcc too
> > > -find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> > > -# finally strip off path + toolname so we get the prefix
> > > -find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> > > -
> > > -powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> > > -powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> > > -x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > > -
> > > # tag our seabios builds
> > > SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
> > >
> > > @@ -66,6 +49,13 @@ default:
> > > @echo " skiboot -- update skiboot.lid"
> > > @echo " u-boot.e500 -- update u-boot.e500"
> > >
> > > +SRC_PATH=..
> > > +include $(SRC_PATH)/rules.mak
> > > +
> > > +powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> > > +powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> > > +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > > +
> > > bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
> > > cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
> > > cp seabios/builds/seabios-256k/bios.bin ../pc-bios/bios-256k.bin
> > > diff --git a/rules.mak b/rules.mak
> > > index 6e943335f3..ef8adee3f8 100644
> > > --- a/rules.mak
> > > +++ b/rules.mak
> > > @@ -62,6 +62,21 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
> > > $(foreach o,$(filter %.mo,$1),$($o-objs)) \
> > > $(filter-out %.o %.mo,$1))
> > >
> > > +# Cross compilation auto detection. Use find-cross-prefix to detect the
> > > +# target archtecture's prefix, and then append it to the build tool or pass
> > > +# it to CROSS_COMPILE directly. Here is one example:
> > > +# x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > > +# $(x86_64_cross_prefix)gcc -c test.c -o test.o
> > > +# make -C testdir CROSS_COMPILE=$(x86_64_cross_prefix)
> > > +cross-search-path := $(subst :, ,$(PATH))
> > > +cross-host-system := $(shell uname -s | tr "A-Z" "a-z")
> > > +
> > > +find-cross-ld = $(firstword $(wildcard $(patsubst \
> > > + %,%/$(1)-*$(cross-host-system)*-ld,$(cross-search-path))))
> > > +find-cross-gcc = $(firstword $(wildcard \
> > > + $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> > > +find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> > > +
> > > %.o: %.c
> > > $(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \
> > > $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \
> > >
> >
> > With this patch, "make slof" fails:
> >
> > git submodule init roms/SLOF
> > git submodule update roms/SLOF
> > cd roms
> > make slof
> > ...
> > make[4]: Entering directory
> > '/home/lvivier/Projects/qemu-upstream/roms/SLOF/lib/libnvram'
> > [CC] Makefile.dep
> > powerpc64-linux-gnu-ar: nvram.o: No such file or directory
> > make[4]: *** [Makefile:31: ../libnvram.a] Error 1
> >
> > Perhaps rules.mak defines values inherited by SLOF makefiles that are
> > incompatible?
>
> OK, can we go back a step here; and split this series; it's trying to do
> two entirely different things:
>
> a) Add an aarch64 migration test
> b) Refactor some of the build stuff
>
> I'd like to see (a) posted separately, doing things approximately the same way that
> the x86 ROM is doing it.
IMO, the makefile is the right approach. I wouldn't like to see AArch64
added with a script and then converted, along with x86, to a makefile at
some later time (probably never).
We can drop the build refactoring, at the expense of adding redundant
cross-compile support, but still introduce a makefile. Likely nobody will
ever get around to the refactoring needed to remove that redundancy, but
oh well...
I think we try to fix the SLOF build issue first, though.
Thanks,
drew
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 13:36 ` Andrew Jones
@ 2018-03-05 13:40 ` Peter Maydell
2018-03-05 13:52 ` Daniel P. Berrangé
2018-03-05 13:52 ` Dr. David Alan Gilbert
1 sibling, 1 reply; 22+ messages in thread
From: Peter Maydell @ 2018-03-05 13:40 UTC (permalink / raw)
To: Andrew Jones
Cc: Dr. David Alan Gilbert, Laurent Vivier, Wei Huang,
QEMU Developers, Juan Quintela
On 5 March 2018 at 13:36, Andrew Jones <drjones@redhat.com> wrote:
> IMO, the makefile is the right approach. I wouldn't like to see AArch64
> added with a script and then converted, along with x86, to a makefile at
> some later time (probably never).
I'm not really enthusiastic about this approach of picking a cross
compiler in the makefile rather than configure, though. The stuff
we have at the moment that tries to build the x86 ROMs with whatever
random host compiler we happen to be using is already a source
of occasional brokenness. If we're going to try to build target
code on a wider basis than just the x86 roms I'd like to see it
done in a cleaner manner...
thanks
-- PMM
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 13:40 ` Peter Maydell
@ 2018-03-05 13:52 ` Daniel P. Berrangé
0 siblings, 0 replies; 22+ messages in thread
From: Daniel P. Berrangé @ 2018-03-05 13:52 UTC (permalink / raw)
To: Peter Maydell
Cc: Andrew Jones, Laurent Vivier, Wei Huang, Juan Quintela,
Dr. David Alan Gilbert, QEMU Developers
On Mon, Mar 05, 2018 at 01:40:06PM +0000, Peter Maydell wrote:
> On 5 March 2018 at 13:36, Andrew Jones <drjones@redhat.com> wrote:
> > IMO, the makefile is the right approach. I wouldn't like to see AArch64
> > added with a script and then converted, along with x86, to a makefile at
> > some later time (probably never).
>
> I'm not really enthusiastic about this approach of picking a cross
> compiler in the makefile rather than configure, though. The stuff
> we have at the moment that tries to build the x86 ROMs with whatever
> random host compiler we happen to be using is already a source
> of occasional brokenness. If we're going to try to build target
> code on a wider basis than just the x86 roms I'd like to see it
> done in a cleaner manner...
Seems like for each arch that we need a cross compiler for, we
ought to have configure args & a corresponding config.mak variable
eg
configure \
--cross-cc-aarch64=aarch64-redhat-linux-gcc \
--cross-cc-x86_64=x86_64-redhat-linux-gcc \
If the --cross-cc-$ARCH arg isn't given we can just autodetect
one, if present.
This would end up setting in config.mak
CROSS_CC_X86_64=x86_64-redhat-linux-c++
CROSS_CC_AARCH64=aarch64-redhat-linux-c++
If the --cross-cc-$ARCH arg is not given, and we can't automatically
find a suitable compiler for that arch, then CC_$ARCH make variable
should be left undefined. Any rules using these cross-compilers should
automatically disable themselves, to ensure we don't suddenly force
all people building QEMU to install many cross compilers.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 13:36 ` Andrew Jones
2018-03-05 13:40 ` Peter Maydell
@ 2018-03-05 13:52 ` Dr. David Alan Gilbert
2018-03-05 17:59 ` Wei Huang
1 sibling, 1 reply; 22+ messages in thread
From: Dr. David Alan Gilbert @ 2018-03-05 13:52 UTC (permalink / raw)
To: Andrew Jones
Cc: Laurent Vivier, Wei Huang, peter.maydell, qemu-devel, quintela
* Andrew Jones (drjones@redhat.com) wrote:
> On Mon, Mar 05, 2018 at 11:01:23AM +0000, Dr. David Alan Gilbert wrote:
> > * Laurent Vivier (lvivier@redhat.com) wrote:
> > > On 28/02/2018 19:02, Wei Huang wrote:
> > > > This patch moves the auto detection functions for cross compilation from
> > > > roms/Makefile to rules.mak. So the functions can be shared among Makefiles
> > > > in QEMU.
> > > >
> > > > Signed-off-by: Wei Huang <wei@redhat.com>
> > > > Reviewed-by: Andrew Jones <drjones@redhat.com>
> > > > ---
> > > > roms/Makefile | 24 +++++++-----------------
> > > > rules.mak | 15 +++++++++++++++
> > > > 2 files changed, 22 insertions(+), 17 deletions(-)
> > > >
> > > > diff --git a/roms/Makefile b/roms/Makefile
> > > > index b5e5a69e91..e972c65333 100644
> > > > --- a/roms/Makefile
> > > > +++ b/roms/Makefile
> > > > @@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
> > > > pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
> > > > pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
> > > >
> > > > -#
> > > > -# cross compiler auto detection
> > > > -#
> > > > -path := $(subst :, ,$(PATH))
> > > > -system := $(shell uname -s | tr "A-Z" "a-z")
> > > > -
> > > > -# first find cross binutils in path
> > > > -find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
> > > > -# then check we have cross gcc too
> > > > -find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> > > > -# finally strip off path + toolname so we get the prefix
> > > > -find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> > > > -
> > > > -powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> > > > -powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> > > > -x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > > > -
> > > > # tag our seabios builds
> > > > SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
> > > >
> > > > @@ -66,6 +49,13 @@ default:
> > > > @echo " skiboot -- update skiboot.lid"
> > > > @echo " u-boot.e500 -- update u-boot.e500"
> > > >
> > > > +SRC_PATH=..
> > > > +include $(SRC_PATH)/rules.mak
> > > > +
> > > > +powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
> > > > +powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
> > > > +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > > > +
> > > > bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
> > > > cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
> > > > cp seabios/builds/seabios-256k/bios.bin ../pc-bios/bios-256k.bin
> > > > diff --git a/rules.mak b/rules.mak
> > > > index 6e943335f3..ef8adee3f8 100644
> > > > --- a/rules.mak
> > > > +++ b/rules.mak
> > > > @@ -62,6 +62,21 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
> > > > $(foreach o,$(filter %.mo,$1),$($o-objs)) \
> > > > $(filter-out %.o %.mo,$1))
> > > >
> > > > +# Cross compilation auto detection. Use find-cross-prefix to detect the
> > > > +# target archtecture's prefix, and then append it to the build tool or pass
> > > > +# it to CROSS_COMPILE directly. Here is one example:
> > > > +# x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> > > > +# $(x86_64_cross_prefix)gcc -c test.c -o test.o
> > > > +# make -C testdir CROSS_COMPILE=$(x86_64_cross_prefix)
> > > > +cross-search-path := $(subst :, ,$(PATH))
> > > > +cross-host-system := $(shell uname -s | tr "A-Z" "a-z")
> > > > +
> > > > +find-cross-ld = $(firstword $(wildcard $(patsubst \
> > > > + %,%/$(1)-*$(cross-host-system)*-ld,$(cross-search-path))))
> > > > +find-cross-gcc = $(firstword $(wildcard \
> > > > + $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
> > > > +find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
> > > > +
> > > > %.o: %.c
> > > > $(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \
> > > > $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \
> > > >
> > >
> > > With this patch, "make slof" fails:
> > >
> > > git submodule init roms/SLOF
> > > git submodule update roms/SLOF
> > > cd roms
> > > make slof
> > > ...
> > > make[4]: Entering directory
> > > '/home/lvivier/Projects/qemu-upstream/roms/SLOF/lib/libnvram'
> > > [CC] Makefile.dep
> > > powerpc64-linux-gnu-ar: nvram.o: No such file or directory
> > > make[4]: *** [Makefile:31: ../libnvram.a] Error 1
> > >
> > > Perhaps rules.mak defines values inherited by SLOF makefiles that are
> > > incompatible?
> >
> > OK, can we go back a step here; and split this series; it's trying to do
> > two entirely different things:
> >
> > a) Add an aarch64 migration test
> > b) Refactor some of the build stuff
> >
> > I'd like to see (a) posted separately, doing things approximately the same way that
> > the x86 ROM is doing it.
>
> IMO, the makefile is the right approach.
It may be; however, for what benefit? How many iterations have we gone
through here for something that (in the x86 case) was shipped as a hex
blob and never regenerated. IMHO even the script is overkill, comments
in the .s file would be enough given just how often this stuff gets
changed. Simplicity seems a better aim.
> I wouldn't like to see AArch64
> added with a script and then converted, along with x86, to a makefile at
> some later time (probably never).
>
> We can drop the build refactoring, at the expense of adding redundant
> cross-compile support, but still introduce a makefile. Likely nobody will
> ever get around to the refactoring needed to remove that redundancy, but
> oh well...
>
> I think we try to fix the SLOF build issue first, though.
OK.
Dave
> Thanks,
> drew
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 13:52 ` Dr. David Alan Gilbert
@ 2018-03-05 17:59 ` Wei Huang
2018-03-05 18:35 ` Laurent Vivier
0 siblings, 1 reply; 22+ messages in thread
From: Wei Huang @ 2018-03-05 17:59 UTC (permalink / raw)
To: Dr. David Alan Gilbert, Andrew Jones
Cc: Laurent Vivier, quintela, qemu-devel, peter.maydell
On 03/05/2018 07:52 AM, Dr. David Alan Gilbert wrote:
> * Andrew Jones (drjones@redhat.com) wrote:
>> On Mon, Mar 05, 2018 at 11:01:23AM +0000, Dr. David Alan Gilbert wrote:
>>> * Laurent Vivier (lvivier@redhat.com) wrote:
>>>> On 28/02/2018 19:02, Wei Huang wrote:
>>>>> This patch moves the auto detection functions for cross compilation from
>>>>> roms/Makefile to rules.mak. So the functions can be shared among Makefiles
>>>>> in QEMU.
>>>>>
>>>>> Signed-off-by: Wei Huang <wei@redhat.com>
>>>>> Reviewed-by: Andrew Jones <drjones@redhat.com>
>>>>> ---
>>>>> roms/Makefile | 24 +++++++-----------------
>>>>> rules.mak | 15 +++++++++++++++
>>>>> 2 files changed, 22 insertions(+), 17 deletions(-)
>>>>>
>>>>> diff --git a/roms/Makefile b/roms/Makefile
>>>>> index b5e5a69e91..e972c65333 100644
>>>>> --- a/roms/Makefile
>>>>> +++ b/roms/Makefile
>>>>> @@ -21,23 +21,6 @@ pxe-rom-virtio efi-rom-virtio : DID := 1000
>>>>> pxe-rom-vmxnet3 efi-rom-vmxnet3 : VID := 15ad
>>>>> pxe-rom-vmxnet3 efi-rom-vmxnet3 : DID := 07b0
>>>>>
>>>>> -#
>>>>> -# cross compiler auto detection
>>>>> -#
>>>>> -path := $(subst :, ,$(PATH))
>>>>> -system := $(shell uname -s | tr "A-Z" "a-z")
>>>>> -
>>>>> -# first find cross binutils in path
>>>>> -find-cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path))))
>>>>> -# then check we have cross gcc too
>>>>> -find-cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
>>>>> -# finally strip off path + toolname so we get the prefix
>>>>> -find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
>>>>> -
>>>>> -powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
>>>>> -powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
>>>>> -x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
>>>>> -
>>>>> # tag our seabios builds
>>>>> SEABIOS_EXTRAVERSION="-prebuilt.qemu-project.org"
>>>>>
>>>>> @@ -66,6 +49,13 @@ default:
>>>>> @echo " skiboot -- update skiboot.lid"
>>>>> @echo " u-boot.e500 -- update u-boot.e500"
>>>>>
>>>>> +SRC_PATH=..
>>>>> +include $(SRC_PATH)/rules.mak
>>>>> +
>>>>> +powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
>>>>> +powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
>>>>> +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
>>>>> +
>>>>> bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
>>>>> cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
>>>>> cp seabios/builds/seabios-256k/bios.bin ../pc-bios/bios-256k.bin
>>>>> diff --git a/rules.mak b/rules.mak
>>>>> index 6e943335f3..ef8adee3f8 100644
>>>>> --- a/rules.mak
>>>>> +++ b/rules.mak
>>>>> @@ -62,6 +62,21 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
>>>>> $(foreach o,$(filter %.mo,$1),$($o-objs)) \
>>>>> $(filter-out %.o %.mo,$1))
>>>>>
>>>>> +# Cross compilation auto detection. Use find-cross-prefix to detect the
>>>>> +# target archtecture's prefix, and then append it to the build tool or pass
>>>>> +# it to CROSS_COMPILE directly. Here is one example:
>>>>> +# x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
>>>>> +# $(x86_64_cross_prefix)gcc -c test.c -o test.o
>>>>> +# make -C testdir CROSS_COMPILE=$(x86_64_cross_prefix)
>>>>> +cross-search-path := $(subst :, ,$(PATH))
>>>>> +cross-host-system := $(shell uname -s | tr "A-Z" "a-z")
>>>>> +
>>>>> +find-cross-ld = $(firstword $(wildcard $(patsubst \
>>>>> + %,%/$(1)-*$(cross-host-system)*-ld,$(cross-search-path))))
>>>>> +find-cross-gcc = $(firstword $(wildcard \
>>>>> + $(patsubst %ld,%gcc,$(call find-cross-ld,$(1)))))
>>>>> +find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
>>>>> +
>>>>> %.o: %.c
>>>>> $(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \
>>>>> $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \
>>>>>
>>>>
>>>> With this patch, "make slof" fails:
>>>>
>>>> git submodule init roms/SLOF
>>>> git submodule update roms/SLOF
>>>> cd roms
>>>> make slof
>>>> ...
>>>> make[4]: Entering directory
>>>> '/home/lvivier/Projects/qemu-upstream/roms/SLOF/lib/libnvram'
>>>> [CC] Makefile.dep
>>>> powerpc64-linux-gnu-ar: nvram.o: No such file or directory
>>>> make[4]: *** [Makefile:31: ../libnvram.a] Error 1
>>>>
>>>> Perhaps rules.mak defines values inherited by SLOF makefiles that are
>>>> incompatible?
>>>
>>> OK, can we go back a step here; and split this series; it's trying to do
>>> two entirely different things:
>>>
>>> a) Add an aarch64 migration test
>>> b) Refactor some of the build stuff
>>>
>>> I'd like to see (a) posted separately, doing things approximately the same way that
>>> the x86 ROM is doing it.
>>
>> IMO, the makefile is the right approach.
>
> It may be; however, for what benefit? How many iterations have we gone
> through here for something that (in the x86 case) was shipped as a hex
> blob and never regenerated. IMHO even the script is overkill, comments
> in the .s file would be enough given just how often this stuff gets
> changed. Simplicity seems a better aim.
>
>> I wouldn't like to see AArch64
>> added with a script and then converted, along with x86, to a makefile at
>> some later time (probably never).
>>
>> We can drop the build refactoring, at the expense of adding redundant
>> cross-compile support, but still introduce a makefile. Likely nobody will
>> ever get around to the refactoring needed to remove that redundancy, but
>> oh well...
>>
>> I think we try to fix the SLOF build issue first, though.
>
> OK.
SLO build actually is OK if we don't move the cross-compile stuff to the
generic rules.mak.
So this cross-compile approach has lots of objection (unclean, broken
rom build etc.). A complete solution will make this patchset bloated,
which is diverted away from original purpose of migration-test.
Dave & Drew: will the following be acceptable?
1. Still use Makefile for .s->.h compilation
2. In Makefile, we don't support cross-compilation. This avoids
duplicating the cross-compile detection code at all. Whoever really
wants to re-generate .h file must be avid programmers. They can either
find a native machine or fix Makefile themselves.
3. The cross-compile re-factoring will become a separate patchset. In
that patchset, both ROM and migration-test Makefiles will be changed to
support cross compilation.
Thoughts?
>
> Dave
>
>> Thanks,
>> drew
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 17:59 ` Wei Huang
@ 2018-03-05 18:35 ` Laurent Vivier
2018-04-04 12:38 ` Alex Bennée
0 siblings, 1 reply; 22+ messages in thread
From: Laurent Vivier @ 2018-03-05 18:35 UTC (permalink / raw)
To: Wei Huang, Dr. David Alan Gilbert, Andrew Jones
Cc: quintela, qemu-devel, peter.maydell
On 05/03/2018 18:59, Wei Huang wrote:
...
>
> SLO build actually is OK if we don't move the cross-compile stuff to the
> generic rules.mak.
>
> So this cross-compile approach has lots of objection (unclean, broken
> rom build etc.). A complete solution will make this patchset bloated,
> which is diverted away from original purpose of migration-test.
>
> Dave & Drew: will the following be acceptable?
>
> 1. Still use Makefile for .s->.h compilation
> 2. In Makefile, we don't support cross-compilation. This avoids
> duplicating the cross-compile detection code at all. Whoever really
> wants to re-generate .h file must be avid programmers. They can either
> find a native machine or fix Makefile themselves.
> 3. The cross-compile re-factoring will become a separate patchset. In
> that patchset, both ROM and migration-test Makefiles will be changed to
> support cross compilation.
>
> Thoughts?
I agree with Peter: I think an improvement would be to detect/configure
cross-compilers at the configure level, not in the Makefile.
thanks,
Laurent
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64 Wei Huang
2018-03-01 9:45 ` Andrew Jones
@ 2018-03-12 15:41 ` Andrew Jones
1 sibling, 0 replies; 22+ messages in thread
From: Andrew Jones @ 2018-03-12 15:41 UTC (permalink / raw)
To: Wei Huang; +Cc: qemu-devel, dgilbert, peter.maydell, quintela
On Wed, Feb 28, 2018 at 12:02:15PM -0600, Wei Huang wrote:
> This patch adds migration test support for aarch64. The test code, which
> implements the same functionality as x86, is booted as a kernel in qemu.
> Here are the design choices we make for aarch64:
>
> * We choose this -kernel approach because aarch64 QEMU doesn't provide a
> built-in fw like x86 does. So instead of relying on a boot loader, we
> use -kernel approach for aarch64.
> * The serial output is sent to PL011 directly.
> * The physical memory base for mach-virt machine is 0x40000000. We change
> the start_address and end_address for aarch64.
>
> In addition to providing the binary, this patch also includes the source
> code and the build script in tests/migration/. So users can change the
> source and/or re-compile the binary as they wish.
>
> Signed-off-by: Wei Huang <wei@redhat.com>
> ---
> tests/Makefile.include | 1 +
> tests/migration-test.c | 44 +++++++++++++++++++--
> tests/migration/Makefile | 12 +++++-
> tests/migration/aarch64-a-b-kernel.S | 75 ++++++++++++++++++++++++++++++++++++
> tests/migration/aarch64-a-b-kernel.h | 19 +++++++++
> tests/migration/migration-test.h | 9 +++++
> 6 files changed, 154 insertions(+), 6 deletions(-)
> create mode 100644 tests/migration/aarch64-a-b-kernel.S
> create mode 100644 tests/migration/aarch64-a-b-kernel.h
>
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index 577eb573a2..538173866c 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -372,6 +372,7 @@ check-qtest-arm-y += tests/sdhci-test$(EXESUF)
> check-qtest-aarch64-y = tests/numa-test$(EXESUF)
> check-qtest-aarch64-y += tests/sdhci-test$(EXESUF)
> check-qtest-aarch64-y += tests/boot-serial-test$(EXESUF)
> +check-qtest-aarch64-y += tests/migration-test$(EXESUF)
>
> check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
>
> diff --git a/tests/migration-test.c b/tests/migration-test.c
> index 12c04a9648..ff424330a1 100644
> --- a/tests/migration-test.c
> +++ b/tests/migration-test.c
> @@ -11,6 +11,7 @@
> */
>
> #include "qemu/osdep.h"
> +#include <sys/utsname.h>
>
> #include "libqtest.h"
> #include "qapi/qmp/qdict.h"
> @@ -81,12 +82,13 @@ static const char *tmpfs;
> * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
> */
> #include "tests/migration/x86-a-b-bootblock.h"
> +#include "tests/migration/aarch64-a-b-kernel.h"
>
> -static void init_bootfile_x86(const char *bootpath)
> +static void init_bootfile(const char *bootpath, void *content)
> {
> FILE *bootfile = fopen(bootpath, "wb");
>
> - g_assert_cmpint(fwrite(x86_bootsect, 512, 1, bootfile), ==, 1);
> + g_assert_cmpint(fwrite(content, 512, 1, bootfile), ==, 1);
> fclose(bootfile);
> }
>
> @@ -392,7 +394,7 @@ static void test_migrate_start(QTestState **from, QTestState **to,
> got_stop = false;
>
> if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> - init_bootfile_x86(bootpath);
> + init_bootfile(bootpath, x86_bootsect);
> cmd_src = g_strdup_printf("-machine accel=%s -m 150M"
> " -name source,debug-threads=on"
> " -serial file:%s/src_serial"
> @@ -427,6 +429,40 @@ static void test_migrate_start(QTestState **from, QTestState **to,
>
> start_address = PPC_TEST_MEM_START;
> end_address = PPC_TEST_MEM_END;
> + } else if (strcmp(arch, "aarch64") == 0) {
> + const char *cpu;
> + const char *gic_ver;
> + struct utsname utsname;
> +
> + /* kvm and tcg need different cpu and gic-version configs */
> + if (access("/dev/kvm", F_OK) == 0 && uname(&utsname) == 0 &&
> + strcmp(utsname.machine, "aarch64") == 0) {
> + accel = "kvm";
> + cpu = "host";
> + gic_ver = "host";
> + } else {
> + accel = "tcg";
> + cpu = "cortex-a57";
> + gic_ver = "2";
> + }
> +
> + init_bootfile(bootpath, aarch64_kernel);
> + cmd_src = g_strdup_printf("-machine virt,accel=%s,gic-version=%s "
> + "-name vmsource,debug-threads=on -cpu %s "
> + "-m 150M -serial file:%s/src_serial "
> + "-kernel %s ",
> + accel, gic_ver, cpu, tmpfs, bootpath);
> + cmd_dst = g_strdup_printf("-machine virt,accel=%s,gic-version=%s "
> + "-name vmdest,debug-threads=on -cpu %s "
> + "-m 150M -serial file:%s/dest_serial "
> + "-kernel %s "
> + "-incoming %s ",
> + accel, gic_ver, cpu, tmpfs, bootpath, uri);
I know I'm the one that pointed out the need for uname() and
gic-version=host, but that was before '-cpu max' was introduced. The above
if-else could now be removed and the command line changed to have
'-machine virt,accel=kvm:tcg,gic-version=max -cpu max' instead. We'll
end up with gic-version=3 for TCG instead of 2, but that shouldn't matter.
Anyway, I won't insist on the change, as the above also works fine, but
I thought I'd point out this potential '-cpu max' use here.
Thanks,
drew
> +
> + start_address = ARM_TEST_MEM_START;
> + end_address = ARM_TEST_MEM_END;
> +
> + g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
> } else {
> g_assert_not_reached();
> }
> @@ -511,7 +547,7 @@ static void test_deprecated(void)
> {
> QTestState *from;
>
> - from = qtest_start("");
> + from = qtest_start("-machine none");
>
> deprecated_set_downtime(from, 0.12345);
> deprecated_set_speed(from, "12345");
> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> index 013b8d1f44..1324427a93 100644
> --- a/tests/migration/Makefile
> +++ b/tests/migration/Makefile
> @@ -16,7 +16,7 @@ override define __note
> */
> endef
>
> -all: x86-a-b-bootblock.h
> +all: x86-a-b-bootblock.h aarch64-a-b-kernel.h
> # Dummy command so that make thinks it has done something
> @true
>
> @@ -24,6 +24,7 @@ SRC_PATH=../..
> include $(SRC_PATH)/rules.mak
>
> x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
> +aarch64_cross_prefix := $(call find-cross-prefix,aarch64)
>
> x86-a-b-bootblock.h: x86-a-b-bootblock.S
> $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
> @@ -32,5 +33,12 @@ x86-a-b-bootblock.h: x86-a-b-bootblock.S
> echo "$$__note" > $@
> xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@
>
> +aarch64-a-b-kernel.h: aarch64-a-b-kernel.S
> + $(aarch64_cross_prefix)gcc -o aarch64.elf -nostdlib \
> + -Wl,--build-id=none $<
> + $(aarch64_cross_prefix)objcopy -O binary aarch64.elf aarch64.kernel
> + echo "$$__note" > $@
> + xxd -i aarch64.kernel | sed -e 's/.*int.*//' >> $@
> +
> clean:
> - rm -f *.bootsect *.boot *.o
> + rm -f *.bootsect *.boot *.o *.elf *.kernel
> diff --git a/tests/migration/aarch64-a-b-kernel.S b/tests/migration/aarch64-a-b-kernel.S
> new file mode 100644
> index 0000000000..eec8f44f16
> --- /dev/null
> +++ b/tests/migration/aarch64-a-b-kernel.S
> @@ -0,0 +1,75 @@
> +#
> +# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
> +#
> +# Author:
> +# Wei Huang <wei@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or later.
> +# See the COPYING file in the top-level directory.
> +#
> +# Note: Please make sure the compiler compiles the assembly code below with
> +# pc-relative address. Also the branch instructions should use relative
> +# addresses only.
> +
> +#include "migration-test.h"
> +
> +.section .text
> +
> + .globl _start
> +
> +_start:
> + /* disable MMU to use phys mem address */
> + mrs x0, sctlr_el1
> + bic x0, x0, #(1<<0)
> + msr sctlr_el1, x0
> + isb
> +
> + /* traverse test memory region */
> + mov x0, #ARM_TEST_MEM_START
> + mov x1, #ARM_TEST_MEM_END
> +
> + /* output char 'A' to PL011 */
> + mov w3, 'A'
> + mov x2, #ARM_MACH_VIRT_UART
> + strb w3, [x2]
> +
> + /* clean up memory */
> + mov w3, #0
> + mov x4, x0
> +clean:
> + strb w3, [x4]
> + add x4, x4, #TEST_MEM_PAGE_SIZE
> + cmp x4, x1
> + ble clean
> +
> + /* w5 keeps a counter so we can limit the output speed */
> + mov w5, #0
> +
> + /* main body */
> +mainloop:
> + mov x4, x0
> +
> +innerloop:
> + /* clean cache because el2 might still cache guest data under KVM */
> + dc civac, x4
> +
> + /* increment the first byte of each page by 1 */
> + ldrb w3, [x4]
> + add w3, w3, #1
> + and w3, w3, #0xff
> + strb w3, [x4]
> +
> + add x4, x4, #TEST_MEM_PAGE_SIZE
> + cmp x4, x1
> + blt innerloop
> +
> + add w5, w5, #1
> + and w5, w5, #0xff
> + cmp w5, #0
> + bne mainloop
> +
> + /* output char 'B' to PL011 */
> + mov w3, 'B'
> + strb w3, [x2]
> +
> + b mainloop
> diff --git a/tests/migration/aarch64-a-b-kernel.h b/tests/migration/aarch64-a-b-kernel.h
> new file mode 100644
> index 0000000000..53b44d3e99
> --- /dev/null
> +++ b/tests/migration/aarch64-a-b-kernel.h
> @@ -0,0 +1,19 @@
> +/* This file is automatically generated from
> + * tests/migration/aarch64-a-b-kernel.S, edit that and then run
> + * "make aarch64-a-b-kernel.h" inside tests/migration to update,
> + * and then remember to send both in your patch submission.
> + */
> +unsigned char aarch64_kernel[] = {
> + 0x00, 0x10, 0x38, 0xd5, 0x00, 0xf8, 0x7f, 0x92, 0x00, 0x10, 0x18, 0xd5,
> + 0xdf, 0x3f, 0x03, 0xd5, 0x00, 0x02, 0xa8, 0xd2, 0x01, 0xc8, 0xa8, 0xd2,
> + 0x23, 0x08, 0x80, 0x52, 0x02, 0x20, 0xa1, 0xd2, 0x43, 0x00, 0x00, 0x39,
> + 0x03, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x00, 0xaa, 0x83, 0x00, 0x00, 0x39,
> + 0x84, 0x04, 0x40, 0x91, 0x9f, 0x00, 0x01, 0xeb, 0xad, 0xff, 0xff, 0x54,
> + 0x05, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x00, 0xaa, 0x24, 0x7e, 0x0b, 0xd5,
> + 0x83, 0x00, 0x40, 0x39, 0x63, 0x04, 0x00, 0x11, 0x63, 0x1c, 0x00, 0x12,
> + 0x83, 0x00, 0x00, 0x39, 0x84, 0x04, 0x40, 0x91, 0x9f, 0x00, 0x01, 0xeb,
> + 0x2b, 0xff, 0xff, 0x54, 0xa5, 0x04, 0x00, 0x11, 0xa5, 0x1c, 0x00, 0x12,
> + 0xbf, 0x00, 0x00, 0x71, 0x81, 0xfe, 0xff, 0x54, 0x43, 0x08, 0x80, 0x52,
> + 0x43, 0x00, 0x00, 0x39, 0xf1, 0xff, 0xff, 0x17
> +};
> +
> diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
> index 06c46a2fe0..a55b74c98c 100644
> --- a/tests/migration/migration-test.h
> +++ b/tests/migration/migration-test.h
> @@ -19,4 +19,13 @@
> #define PPC_TEST_MEM_END (100 * 1024 * 1024)
> #define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
>
> +/* ARM */
> +#define ARM_TEST_MEM_START (0x40000000 + 1 * 1024 * 1024)
> +#define ARM_TEST_MEM_END (0x40000000 + 100 * 1024 * 1024)
> +#define ARM_MACH_VIRT_UART 0x09000000
> +/* AArch64 kernel load address is 0x40080000, and the test memory starts at
> + * 0x40100000. So the maximum allowable kernel size is 512KB.
> + */
> +#define ARM_TEST_MAX_KERNEL_SIZE (512 * 1024)
> +
> #endif /* _TEST_MIGRATION_H_ */
> --
> 2.14.3
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak
2018-03-05 18:35 ` Laurent Vivier
@ 2018-04-04 12:38 ` Alex Bennée
0 siblings, 0 replies; 22+ messages in thread
From: Alex Bennée @ 2018-04-04 12:38 UTC (permalink / raw)
To: Laurent Vivier
Cc: Wei Huang, Dr. David Alan Gilbert, Andrew Jones, peter.maydell,
qemu-devel, quintela
Laurent Vivier <lvivier@redhat.com> writes:
> On 05/03/2018 18:59, Wei Huang wrote:
> ...
>>
>> SLO build actually is OK if we don't move the cross-compile stuff to the
>> generic rules.mak.
>>
>> So this cross-compile approach has lots of objection (unclean, broken
>> rom build etc.). A complete solution will make this patchset bloated,
>> which is diverted away from original purpose of migration-test.
>>
>> Dave & Drew: will the following be acceptable?
>>
>> 1. Still use Makefile for .s->.h compilation
>> 2. In Makefile, we don't support cross-compilation. This avoids
>> duplicating the cross-compile detection code at all. Whoever really
>> wants to re-generate .h file must be avid programmers. They can either
>> find a native machine or fix Makefile themselves.
>> 3. The cross-compile re-factoring will become a separate patchset. In
>> that patchset, both ROM and migration-test Makefiles will be changed to
>> support cross compilation.
>>
>> Thoughts?
>
> I agree with Peter: I think an improvement would be to detect/configure
> cross-compilers at the configure level, not in the Makefile.
I'm going to have a go at this now for docker and host installed
cross-compilers.
>
> thanks,
> Laurent
--
Alex Bennée
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2018-04-04 12:38 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-28 18:02 [Qemu-devel] [PATCH V7 0/4] tests: Add migration test for aarch64 Wei Huang
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak Wei Huang
2018-03-02 14:51 ` Laurent Vivier
2018-03-02 16:27 ` Laurent Vivier
2018-03-05 11:01 ` Dr. David Alan Gilbert
2018-03-05 13:36 ` Andrew Jones
2018-03-05 13:40 ` Peter Maydell
2018-03-05 13:52 ` Daniel P. Berrangé
2018-03-05 13:52 ` Dr. David Alan Gilbert
2018-03-05 17:59 ` Wei Huang
2018-03-05 18:35 ` Laurent Vivier
2018-04-04 12:38 ` Alex Bennée
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile Wei Huang
2018-03-02 15:25 ` Laurent Vivier
2018-03-02 15:54 ` Wei Huang
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file Wei Huang
2018-03-01 9:48 ` Andrew Jones
2018-03-01 15:26 ` Dr. David Alan Gilbert
2018-02-28 18:02 ` [Qemu-devel] [PATCH V7 4/4] tests: Add migration test for aarch64 Wei Huang
2018-03-01 9:45 ` Andrew Jones
2018-03-12 15:41 ` Andrew Jones
2018-03-01 15:28 ` [Qemu-devel] [PATCH V7 0/4] " Dr. David Alan Gilbert
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).