Skip to contentSkip to conversation

tests: Add migration test for aarch64

PATCH Applied Wei Huang 5 participants 17 messages Sep 5, 2018 – Sep 10, 2018

lore
Share & tools
lore

Wei Huang

author
#0 lore raw

v9 cover tests: Add migration test for aarch64

This patchset adds a migration test for aarch64. It leverages Dave Gilbert's migration boot block patches to create a new test case for aarch64.

V8->V9:
* Remove accel= setting for AArch64. It uses the default "kvm:tcg" now
* Revise the header file comment (suggested by drjones)
* Name x86 directory to i386 instead of x86_64; change Makefile accordingly
* Remove $(ARCH) from the assembly and header file names

V7->V8:
* Support cross compilation by searching for CROSS_CC_GUEST option, instead of using the find-cross-prefix defined in roms/Makefile
* Use the "max" options for ARM guest VM's CPU and GIC types
* $(TARGET)/Makefile rules are rewritten based on Laurent Vivier's comment
* NOTE: because Patch 1/2 is re-written, I remove the "Reviewed-by" for reviewers to take a look again. Thanks.

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):
tests/migration: Convert x86 boot block compilation script into
Makefile
tests/migration: Support cross compilation in generating boot header
file
tests/migration: Add migration-test header file
tests: Add migration test for aarch64

 tests/Makefile.include                             |  1 +
 tests/migration-test.c                             | 57 +++++++++++-----
 tests/migration/Makefile                           | 35 ++++++++++
 tests/migration/aarch64/Makefile                   | 20 ++++++
 tests/migration/aarch64/a-b-kernel.S               | 75 ++++++++++++++++++++++
 tests/migration/aarch64/a-b-kernel.h               | 19 ++++++
 tests/migration/i386/Makefile                      | 22 +++++++
 .../{x86-a-b-bootblock.s => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 +--
 tests/migration/migration-test.h                   | 30 +++++++++
 tests/migration/rebuild-x86-bootblock.sh           | 33 ----------
 11 files changed, 248 insertions(+), 56 deletions(-)
 create mode 100644 tests/migration/Makefile
 create mode 100644 tests/migration/aarch64/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/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.s => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
 create mode 100644 tests/migration/migration-test.h
 delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
Signature · 1 line
1.8.3.1
author
#1 lore raw

PATCH v9 1/4 tests/migration: Convert x86 boot block compilation script into Makefile

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.

Note that, in the new design, the cross compiler prefix can be specified by setting the CROSS_PREFIX in "make" command. Also to allow gcc pre-processor to include the C-style file correctly, it also renames the x86-a-b-bootblock.s file extension from .s to .S.

---
 tests/migration/Makefile                           | 31 ++++++++++++++++++++
 tests/migration/rebuild-x86-bootblock.sh           | 33 ----------------------
 .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S}   |  0
 3 files changed, 31 insertions(+), 33 deletions(-)
 create mode 100644 tests/migration/Makefile
 delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
 rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (100%)
tests/migration/Makefile new file +31 -0
new file mode 100644
index 0000000..c0824b4
@@ -0,0 +1,31 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+override define __note
+/* 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.
+ */
+endef
+export __note
+
+.PHONY: all clean
+all: x86-a-b-bootblock.h
+
+x86-a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: x86-a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/rebuild-x86-bootblock.sh deleted +0 -33
deleted file mode 100755
index 86cec5d..0000000
@@ -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: [email protected]
-
-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"
tests/migration/x86-a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.s +0 -0
similarity index 100%
rename from tests/migration/x86-a-b-bootblock.s
rename to tests/migration/x86-a-b-bootblock.S
Signature · 1 line
1.8.3.1
Reviewed-by on v9 1/4
#2 lore raw

Re: [Qemu-devel] [PATCH V9 1/4] tests/migration: Convert x86 boot block compilation script into Makefile

Quoted 12 lines · Wei Huang

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.

Note that, in the new design, the cross compiler prefix can be specified by setting the CROSS_PREFIX in "make" command. Also to allow gcc pre-processor to include the C-style file correctly, it also renames the x86-a-b-bootblock.s file extension from .s to .S.

Quoted 9 lines
---
 tests/migration/Makefile                           | 31 ++++++++++++++++++++
 tests/migration/rebuild-x86-bootblock.sh           | 33 ----------------------
 .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S}   |  0
 3 files changed, 31 insertions(+), 33 deletions(-)
 create mode 100644 tests/migration/Makefile
 delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
 rename tests/migration/{x86-a-b-bootblock.s => x86-a-b-bootblock.S} (100%)
author
#3 lore raw

PATCH v9 2/4 tests/migration: Support cross compilation in generating boot header file

In reply to Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX. The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +24 -20

55 lines not on this page · raw message

tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.
 # See the COPYING file in the top-level directory.
tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -4
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
Signature · 1 line
1.8.3.1
#4 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 65 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX. The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +14 -6
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef

tests/migration/Makefile line 21

Quoted 10 lines
tests/migration/Makefile +1 -7
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak)))

The above function hangs unless configuring with '--target-list=x86_64-softmmu,aarch64-softmmu'. I tried just x86_64 alone, just aarch64 alone, and also configuring both x86_64 and i386, but none of those worked. For some reason grep isn't happy with the generated path list. I tested like this

./configure --target-list=x86_64-softmmu,i386-softmmu make -C tests/migration

And, while not an issue of this series, I had to manually add CROSS_CC_GUEST="aarch64-linux-gnu-gcc" to aarch64-softmmu/config-target.mak for it to work, because configure's compiler test fails with the Fedora aarch64-linux-gnu-gcc installation (the linker can't find code it needs to a build a program with main()). I'm not sure if building programs with main() is something the CROSS_CC_GUEST compiler needs to do. Maybe that test can be relaxed. Alex?

Thanks,
drew

Quoted 90 lines
tests/migration/Makefile +9 -7
+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1)))))
+gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call parse-cross-prefix,$(1)))
 
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.
 # See the COPYING file in the top-level directory.
tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -4
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
Signature · 1 line
1.8.3.1
#5 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

----- Original Message -----

Quoted 99 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 7:03:32 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 79 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44
 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +4 -2
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.

tests/migration/Makefile +11 -11
+# See the COPYING file in the top-level directory.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST="
Quoted 2 lines

$(wildcard $(SRC_PATH)/$(patsubst
i386,*86*,$(1))-softmmu/config-target.mak)))

The above function hangs unless configuring with '--target-list=x86_64-softmmu,aarch64-softmmu'. I tried just x86_64 alone, just aarch64 alone, and also configuring both x86_64 and i386, but none of those worked. For some reason grep isn't happy with the generated path list. I tested like this

./configure --target-list=x86_64-softmmu,i386-softmmu make -C tests/migration

Quoted 7 lines

And, while not an issue of this series, I had to manually add CROSS_CC_GUEST="aarch64-linux-gnu-gcc" to aarch64-softmmu/config-target.mak for it to work, because configure's compiler test fails with the Fedora aarch64-linux-gnu-gcc installation (the linker can't find code it needs to a build a program with main()). I'm not sure if building programs with main() is something the CROSS_CC_GUEST compiler needs to do. Maybe that test can be relaxed. Alex?

I saw the same problem and it needs to be addressed in ./configure file. Most distros don't ship with cross-compiled glibc. So compiling main() will fail because of that.

Quoted 100 lines

Thanks,
drew

Quoted 95 lines

+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1))))) +gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call parse-cross-prefix,$(1)))

tests/migration/Makefile +7 -7
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.

# See the COPYING file in the top-level directory.

tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -5
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
--

1.8.3.1

#6 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 110 lines · Wei Huang

----- Original Message -----

Quoted 99 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 7:03:32 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 79 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44
 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +4 -2
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.

tests/migration/Makefile +11 -11
+# See the COPYING file in the top-level directory.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST="
Quoted 2 lines

$(wildcard $(SRC_PATH)/$(patsubst
i386,*86*,$(1))-softmmu/config-target.mak)))

The above function hangs unless configuring with '--target-list=x86_64-softmmu,aarch64-softmmu'. I tried just x86_64 alone, just aarch64 alone, and also configuring both x86_64 and i386, but none of those worked. For some reason grep isn't happy with the generated path list. I tested like this

./configure --target-list=x86_64-softmmu,i386-softmmu make -C tests/migration

Quoted 7 lines

And, while not an issue of this series, I had to manually add CROSS_CC_GUEST="aarch64-linux-gnu-gcc" to aarch64-softmmu/config-target.mak for it to work, because configure's compiler test fails with the Fedora aarch64-linux-gnu-gcc installation (the linker can't find code it needs to a build a program with main()). I'm not sure if building programs with main() is something the CROSS_CC_GUEST compiler needs to do. Maybe that test can be relaxed. Alex?

Quoted 2 lines

I saw the same problem and it needs to be addressed in ./configure file. Most distros don't ship with cross-compiled glibc. So compiling main() will fail because of that.

I don't care too much about that problem. You just need to have the right cross compiler installed. I care about the one above, which is a separate problem and should be fixed. The tests/migration build shouldn't hang when a target-list other than x86_64-softmmu,aarch64-softmmu is used.

Thanks,
drew

Quoted 102 lines
Quoted 101 lines

Thanks,
drew

Quoted 95 lines

+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1))))) +gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call parse-cross-prefix,$(1)))

tests/migration/Makefile +7 -7
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.

# See the COPYING file in the top-level directory.

tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -5
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
--

1.8.3.1

#7 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

----- Original Message -----

Quoted 125 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 9:00:33 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 117 lines · Wei Huang

----- Original Message -----

Quoted 113 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 7:03:32 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 82 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the
migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44
 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S}
 (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h}

(92%)

tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +4 -2
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.

tests/migration/Makefile +11 -11
+# See the COPYING file in the top-level directory.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST="
Quoted 2 lines

$(wildcard $(SRC_PATH)/$(patsubst
i386,*86*,$(1))-softmmu/config-target.mak)))

The above function hangs unless configuring with '--target-list=x86_64-softmmu,aarch64-softmmu'. I tried just x86_64 alone,
just aarch64 alone, and also configuring both x86_64 and i386, but none of those worked. For some reason grep isn't happy with the generated path list. I tested like this

./configure --target-list=x86_64-softmmu,i386-softmmu make -C tests/migration

And, while not an issue of this series, I had to manually add CROSS_CC_GUEST="aarch64-linux-gnu-gcc" to aarch64-softmmu/config-target.mak
for it to work, because configure's compiler test fails with the Fedora aarch64-linux-gnu-gcc installation (the linker can't find code it needs to a build a program with main()). I'm not sure if building programs with main() is something the CROSS_CC_GUEST compiler needs to do. Maybe that test can be relaxed. Alex?

Quoted 9 lines
Quoted 3 lines

I saw the same problem and it needs to be addressed in ./configure file. Most distros don't ship with
cross-compiled glibc. So compiling main() will fail because of that.

I don't care too much about that problem. You just need to have the right cross compiler installed. I care about the one above, which is a separate problem and should be fixed. The tests/migration build shouldn't hang when a target-list other than x86_64-softmmu,aarch64-softmmu is used.

Since you don't have aarch64, the stall happens when grep is supplied with an empty file name and waiting on standard input. There is no easy way to skip standard input for grep. How about the following? Basically we always supply with a terminator.

grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak) /dev/null)

Quoted 108 lines

Thanks,
drew

Quoted 104 lines
Quoted 103 lines

Thanks,
drew

Quoted 97 lines

+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1))))) +gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call parse-cross-prefix,$(1)))

tests/migration/Makefile +7 -7
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.

# See the COPYING file in the top-level directory.

tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -4
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00,
   0x00,

--
1.8.3.1

#8 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 138 lines · Wei Huang

----- Original Message -----

Quoted 125 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 9:00:33 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 117 lines · Wei Huang

----- Original Message -----

Quoted 113 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 7:03:32 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 82 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the
migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44
 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S}
 (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h}

(92%)

tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +4 -2
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.

tests/migration/Makefile +11 -11
+# See the COPYING file in the top-level directory.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST="
Quoted 2 lines

$(wildcard $(SRC_PATH)/$(patsubst
i386,*86*,$(1))-softmmu/config-target.mak)))

The above function hangs unless configuring with '--target-list=x86_64-softmmu,aarch64-softmmu'. I tried just x86_64 alone,
just aarch64 alone, and also configuring both x86_64 and i386, but none of those worked. For some reason grep isn't happy with the generated path list. I tested like this

./configure --target-list=x86_64-softmmu,i386-softmmu make -C tests/migration

And, while not an issue of this series, I had to manually add CROSS_CC_GUEST="aarch64-linux-gnu-gcc" to aarch64-softmmu/config-target.mak
for it to work, because configure's compiler test fails with the Fedora aarch64-linux-gnu-gcc installation (the linker can't find code it needs to a build a program with main()). I'm not sure if building programs with main() is something the CROSS_CC_GUEST compiler needs to do. Maybe that test can be relaxed. Alex?

Quoted 9 lines
Quoted 3 lines

I saw the same problem and it needs to be addressed in ./configure file. Most distros don't ship with
cross-compiled glibc. So compiling main() will fail because of that.

I don't care too much about that problem. You just need to have the right cross compiler installed. I care about the one above, which is a separate problem and should be fixed. The tests/migration build shouldn't hang when a target-list other than x86_64-softmmu,aarch64-softmmu is used.

Quoted 6 lines

Since you don't have aarch64, the stall happens when grep is supplied with an empty file name and waiting on standard input. There is no easy way to skip standard input for grep. How about the following? Basically we always supply with a terminator.

grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak) /dev/null)

Yeah, that should work. Also, when a target-list of i386-softmmu,x86_64-softmmu is used, since lastword is applied to the grep results, then the cross-cc-guest entry for x86_64 will be selected for the i386 target (since it comes later in the alphabet). That's not correct, but I won't hold the patch up over it.

Thanks,
drew

author
#9 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 144 lines · Andrew Jones
Quoted 143 lines · Wei Huang

----- Original Message -----

Quoted 125 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 9:00:33 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 117 lines · Wei Huang

----- Original Message -----

Quoted 113 lines

From: "Andrew Jones" <[email protected]>
To: "Wei Huang" <[email protected]>
Cc: [email protected], [email protected], "peter maydell" <[email protected]>, [email protected], [email protected], "alex bennee" <[email protected]>
Sent: Thursday, September 6, 2018 7:03:32 AM
Subject: Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Quoted 82 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the
migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX.
The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44
 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S}
 (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h}

(92%)

tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +4 -2
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.

tests/migration/Makefile +11 -11
+# See the COPYING file in the top-level directory.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST="
Quoted 2 lines

$(wildcard $(SRC_PATH)/$(patsubst
i386,*86*,$(1))-softmmu/config-target.mak)))

The above function hangs unless configuring with '--target-list=x86_64-softmmu,aarch64-softmmu'. I tried just x86_64 alone,
just aarch64 alone, and also configuring both x86_64 and i386, but none of those worked. For some reason grep isn't happy with the generated path list. I tested like this

./configure --target-list=x86_64-softmmu,i386-softmmu make -C tests/migration

And, while not an issue of this series, I had to manually add CROSS_CC_GUEST="aarch64-linux-gnu-gcc" to aarch64-softmmu/config-target.mak
for it to work, because configure's compiler test fails with the Fedora aarch64-linux-gnu-gcc installation (the linker can't find code it needs to a build a program with main()). I'm not sure if building programs with main() is something the CROSS_CC_GUEST compiler needs to do. Maybe that test can be relaxed. Alex?

Quoted 9 lines
Quoted 3 lines

I saw the same problem and it needs to be addressed in ./configure file. Most distros don't ship with
cross-compiled glibc. So compiling main() will fail because of that.

I don't care too much about that problem. You just need to have the right cross compiler installed. I care about the one above, which is a separate problem and should be fixed. The tests/migration build shouldn't hang when a target-list other than x86_64-softmmu,aarch64-softmmu is used.

Since you don't have aarch64, the stall happens when grep is supplied with an empty file name and waiting on standard input. There is no easy way to skip standard input for grep. How about the following? Basically we always supply with a terminator.

Quoted 6 lines
Quoted 1 line

grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak) /dev/null)

Yeah, that should work. Also, when a target-list of i386-softmmu,x86_64-softmmu is used, since lastword is applied to the grep results, then the cross-cc-guest entry for x86_64 will be selected for the i386 target (since it comes later in the alphabet).

This was done intentionally. Normally x86_64 cross compiler is able to generate i386/i486 binaries, but not the other way. I prefer x86_64 over i386 for this case...

Quoted 5 lines

That's not correct, but I won't hold the patch up over it.

Thanks,
drew

#10 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

In reply to Wei Huang
Quoted 68 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX. The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +14 -7
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean

tests/migration/Makefile line 24

Quoted 10 lines
tests/migration/Makefile +3 -6
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak)))
+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1)))))
+gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call
 parse-cross-prefix,$(1)))

This all seems awfully fiddly compared to moving the code to tests/tcg and building with the existing machinery. You don't even get the docker fall-back this way.

The aim being to have the ability to build the binary and manually update the .hex/.S encoded version actually used in the test when you don't have cross compilers available right?

I've got some TODOs in tests/tcg to start building the various system tests. Perhaps I should port the various migration kernels when I get to that?

Quoted 74 lines
tests/migration/Makefile +7 -7
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.
 # See the COPYING file in the top-level directory.
tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +0 -1
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* This file is automatically generated from

tests/migration/i386/a-b-bootblock.h line 7

Quoted 10 lines
tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -3
- * 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,

--
Alex Bennée

#11 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

Alex Bennée <[email protected]> wrote:

Quoted 31 lines · D> Wei Huang <[email protected]> writes:
Quoted 25 lines

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX. The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

-.PHONY: all clean

tests/migration/Makefile +3 -6
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak)))
+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1)))))
+gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call
Quoted 1 line

parse-cross-prefix,$(1)))

This all seems awfully fiddly compared to moving the code to tests/tcg and building with the existing machinery. You don't even get the docker fall-back this way.

Quoted 7 lines

The aim being to have the ability to build the binary and manually update the .hex/.S encoded version actually used in the test when you don't have cross compilers available right?

I've got some TODOs in tests/tcg to start building the various system tests. Perhaps I should port the various migration kernels when I get to that?

One only needs to run the compiler when they modify the aarch64 test, and that should be almost never. And if anyone does, it is expected to be an arm developer being runing on an ARM host or having a propper cross-compiler. I.e. that code is not intended to be part of a normal build.

I guess that in general would be useful to have a way to tell Makefile:
I want to compile this with an arm compiler (native or cross), or any other architecture. But this case is a quite simple case that is not supposed to be run often. To put things in prespective, I think that we haven't ever changed the x86-64 migration test code. I can be wrong, but we are talking in less than a run for each qemu release.

Later, Juan.

author
#12 lore raw

Re: [Qemu-devel] [PATCH V9 2/4] tests/migration: Support cross compilation in generating boot header file

In reply to Alex Bennée
Quoted 86 lines · Alex Bennée
Quoted 68 lines · Wei Huang

Recently a new configure option, CROSS_CC_GUEST, was added to $(TARGET)-softmmu/config-target.mak to support TCG-related tests. This patch tries to leverage this option to support cross compilation when the migration boot block file is being re-generated:

* The x86 related files are moved to a new sub-dir (named ./i386).
* A new top-layer Makefile is created in tests/migration/ directory. This Makefile searches and parses CROSS_CC_GUEST to generate CROSS_PREFIX. The CROSS_PREFIX, if available, is then passed to migration/$ARCH/Makefile.

---
 tests/migration-test.c                             |  2 +-
 tests/migration/Makefile                           | 44 ++++++++++++----------
 tests/migration/i386/Makefile                      | 22 +++++++++++
 .../{x86-a-b-bootblock.S => i386/a-b-bootblock.S}  |  4 --
 .../{x86-a-b-bootblock.h => i386/a-b-bootblock.h}  |  8 ++--
 5 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 tests/migration/i386/Makefile
 rename tests/migration/{x86-a-b-bootblock.S => i386/a-b-bootblock.S} (93%)
 rename tests/migration/{x86-a-b-bootblock.h => i386/a-b-bootblock.h} (92%)
tests/migration-test.c +1 -1
index 0e687b7..fe6b41a 100644
@@ -83,7 +83,7 @@ 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.
  */
-#include "tests/migration/x86-a-b-bootblock.h"
+#include "tests/migration/i386/a-b-bootblock.h"
 
 static void init_bootfile_x86(const char *bootpath)
 {
tests/migration/Makefile +14 -7
index c0824b4..a9ed875 100644
@@ -1,31 +1,35 @@
-# To specify cross compiler prefix, use CROSS_PREFIX=
-#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+#
+# 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.
+#
+
+TARGET_LIST = i386
+
+SRC_PATH = ../..
 
 override define __note
-/* 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/$@. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 endef
 export __note
 
-.PHONY: all clean

tests/migration/Makefile line 24

Quoted 10 lines
tests/migration/Makefile +3 -6
-all: x86-a-b-bootblock.h
-
-x86-a-b-bootblock.h: x86.bootsect
-	echo "$$__note" > header.tmp
-	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
-	mv header.tmp $@
+find-arch-cross-cc = $(lastword $(shell grep -h "CROSS_CC_GUEST=" $(wildcard $(SRC_PATH)/$(patsubst i386,*86*,$(1))-softmmu/config-target.mak)))
+parse-cross-prefix = $(subst gcc,,$(patsubst cc,gcc,$(patsubst CROSS_CC_GUEST="%",%,$(call find-arch-cross-cc,$(1)))))
+gen-cross-prefix = $(patsubst %-,CROSS_PREFIX=%-,$(call
 parse-cross-prefix,$(1)))

This all seems awfully fiddly compared to moving the code to tests/tcg and building with the existing machinery. You don't even get the docker fall-back this way.

Quoted 3 lines

The aim being to have the ability to build the binary and manually update the .hex/.S encoded version actually used in the test when you don't have cross compilers available right?

The purpose is to generate migration test binary (in the .h files) when a cross compiler is available. If you can do it with docker, it is a plus.

But to be honest, unless people are updating the migration test code themselves, it would be extremely rare for them to change (or invoke) this Makefile.

Quoted 4 lines

I've got some TODOs in tests/tcg to start building the various system tests. Perhaps I should port the various migration kernels when I get to that?

Two architectures, x86 and aarch64, needs to be cross-compiled. PPC is OK because it is script-based. Please wait until Juan's tree is pulled.

Quoted 90 lines
Quoted 75 lines
tests/migration/Makefile +7 -7
-x86.bootsect: x86.boot
-	dd if=$< of=$@ bs=256 count=2 skip=124
+.PHONY: all $(TARGET_LIST)
 
-x86.boot: x86.o
-	$(CROSS_PREFIX)objcopy -O binary $< $@
+all: $(TARGET_LIST)
 
-x86.o: x86-a-b-bootblock.S
-	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+$(TARGET_LIST):
+	$(MAKE) -C $@ $(call gen-cross-prefix,$@)
 
 clean:
-	@rm -rf *.boot *.o *.bootsect
+	for target in $(TARGET_LIST); do \
+		$(MAKE) -C $$target clean; \
+	done
tests/migration/i386/Makefile new file +22 -0
new file mode 100644
index 0000000..5c03241
@@ -0,0 +1,22 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=x86_64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-bootblock.h
+
+a-b-bootblock.h: x86.bootsect
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+x86.bootsect: x86.boot
+	dd if=$< of=$@ bs=256 count=2 skip=124
+
+x86.boot: x86.o
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+x86.o: a-b-bootblock.S
+	$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
+
+clean:
+	@rm -rf *.boot *.o *.bootsect
tests/migration/i386/a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.S +0 -4
similarity index 93%
rename from tests/migration/x86-a-b-bootblock.S
rename to tests/migration/i386/a-b-bootblock.S
index b164264..3f97f28 100644
@@ -3,10 +3,6 @@
 #  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.
-#
 # 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.
 # See the COPYING file in the top-level directory.
tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +0 -1
similarity index 92%
rename from tests/migration/x86-a-b-bootblock.h
rename to tests/migration/i386/a-b-bootblock.h
index 78a151f..7d459d4 100644
@@ -1,7 +1,7 @@
-/* This file is automatically generated from

tests/migration/i386/a-b-bootblock.h line 7

Quoted 10 lines
tests/migration/i386/a-b-bootblock.h renamed from tests/migration/x86-a-b-bootblock.h +4 -3
- * 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.
+/* This file is automatically generated from the assembly file in
+ * tests/migration/i386. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences in your patch submission.
  */
 unsigned char x86_bootsect[] = {
   0xfa, 0x0f, 0x01, 0x16, 0x74, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,

--
Alex Bennée

author
#13 lore raw

PATCH v9 3/4 tests/migration: Add migration-test header file

In reply to Wei Huang

This patch moves the settings related migration-test from the migration-test.c file to a new header file.

---
 tests/migration-test.c           | 28 ++++++++++++++++++----------
 tests/migration/migration-test.h | 21 +++++++++++++++++++++
 2 files changed, 39 insertions(+), 10 deletions(-)
 create mode 100644 tests/migration/migration-test.h
tests/migration-test.c +18 -10
index fe6b41a..17c6896 100644
@@ -21,11 +21,13 @@
 #include "chardev/char.h"
 #include "sysemu/sysemu.h"
 
+#include "migration/migration-test.h"
+
 /* TODO actually test the results and get rid of this */
 #define qtest_qmp_discard_response(...) qobject_unref(qtest_qmp(__VA_ARGS__))
 
-const unsigned start_address = 1024 * 1024;
-const unsigned end_address = 100 * 1024 * 1024;
+unsigned start_address;
+unsigned end_address;
 bool got_stop;
 static bool uffd_feature_thread_id;
 
@@ -80,8 +82,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/i386/a-b-bootblock.h"
 
@@ -270,11 +272,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;
@@ -285,7 +287,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);
@@ -437,6 +440,8 @@ static int 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) {
         cmd_src = g_strdup_printf("-machine accel=%s -m 256M"
                                   " -name source,debug-threads=on"
@@ -451,6 +456,9 @@ static int 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();
     }
tests/migration/migration-test.h new file +21 -0
new file mode 100644
index 0000000..c4c0c52
@@ -0,0 +1,21 @@
+/*
+ * 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)
+
+#endif /* _TEST_MIGRATION_H_ */
Signature · 1 line
1.8.3.1
author
#14 lore raw

PATCH v9 4/4 tests: Add migration test for aarch64

In reply to Wei Huang

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/aarch64. So users can change the source and/or re-compile the binary as they wish.

---
 tests/Makefile.include               |  1 +
 tests/migration-test.c               | 27 +++++++++++--
 tests/migration/Makefile             |  2 +-
 tests/migration/aarch64/Makefile     | 20 ++++++++++
 tests/migration/aarch64/a-b-kernel.S | 75 ++++++++++++++++++++++++++++++++++++
 tests/migration/aarch64/a-b-kernel.h | 19 +++++++++
 tests/migration/migration-test.h     |  9 +++++
 7 files changed, 148 insertions(+), 5 deletions(-)
 create mode 100644 tests/migration/aarch64/Makefile
 create mode 100644 tests/migration/aarch64/a-b-kernel.S
 create mode 100644 tests/migration/aarch64/a-b-kernel.h
tests/Makefile.include +1 -0
index 87c81d1..fab8fb9 100644
@@ -390,6 +390,7 @@ check-qtest-arm-y += tests/hexloader-test$(EXESUF)
 check-qtest-aarch64-y = tests/numa-test$(EXESUF)
 check-qtest-aarch64-$(CONFIG_SDHCI) += 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)
 
tests/migration-test.c +23 -4
index 17c6896..ecfae0b 100644
@@ -86,12 +86,13 @@ static const char *tmpfs;
  * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
  */
 #include "tests/migration/i386/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);
 }
 
@@ -428,7 +429,7 @@ static int 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"
@@ -459,6 +460,24 @@ static int 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) {
+        init_bootfile(bootpath, aarch64_kernel);
+        cmd_src = g_strdup_printf("-machine virt,accel=%s,gic-version=max "
+                                  "-name vmsource,debug-threads=on -cpu max "
+                                  "-m 150M -serial file:%s/src_serial "
+                                  "-kernel %s ",
+                                  accel, tmpfs, bootpath);
+        cmd_dst = g_strdup_printf("-machine virt,accel=%s,gic-version=max "
+                                  "-name vmdest,debug-threads=on -cpu max "
+                                  "-m 150M -serial file:%s/dest_serial "
+                                  "-kernel %s "
+                                  "-incoming %s ",
+                                  accel, 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();
     }
@@ -545,7 +564,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);
tests/migration/Makefile +1 -1
index a9ed875..13af934 100644
@@ -5,7 +5,7 @@
 # See the COPYING file in the top-level directory.
 #
 
-TARGET_LIST = i386
+TARGET_LIST = i386 aarch64
 
 SRC_PATH = ../..
 
tests/migration/aarch64/Makefile new file +20 -0
new file mode 100644
index 0000000..d440fa8
@@ -0,0 +1,20 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=aarch64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-kernel.h
+
+a-b-kernel.h: aarch64.kernel
+	echo "$$__note" > header.tmp
+	xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
+	mv header.tmp $@
+
+aarch64.kernel: aarch64.elf
+	$(CROSS_PREFIX)objcopy -O binary $< $@
+
+aarch64.elf: a-b-kernel.S
+	$(CROSS_PREFIX)gcc -o $@ -nostdlib -Wl,--build-id=none $<
+
+clean:
+	@rm -rf *.kernel *.elf
+
tests/migration/aarch64/a-b-kernel.S new file +75 -0

75 lines not on this page · raw message

tests/migration/aarch64/a-b-kernel.h new file +19 -0
new file mode 100644
index 0000000..521125e
@@ -0,0 +1,19 @@
+/* This file is automatically generated from the assembly file in
+ * tests/migration/aarch64. Edit that file and then run "make all"
+ * inside tests/migration to update, and then remember to send both
+ * the header and the assembler differences 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
+};
+
tests/migration/migration-test.h +9 -0
index c4c0c52..6939a13 100644
@@ -18,4 +18,13 @@
 #define PPC_TEST_MEM_START (1 * 1024 * 1024)
 #define PPC_TEST_MEM_END   (100 * 1024 * 1024)
 
+/* 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_ */
Signature · 1 line
1.8.3.1
Reviewed-by on v9 4/4
#15 lore raw
Quoted 17 lines · Wei Huang

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/aarch64. So users can change the source and/or re-compile the binary as they wish.

Quoted 13 lines
---
 tests/Makefile.include               |  1 +
 tests/migration-test.c               | 27 +++++++++++--
 tests/migration/Makefile             |  2 +-
 tests/migration/aarch64/Makefile     | 20 ++++++++++
 tests/migration/aarch64/a-b-kernel.S | 75 ++++++++++++++++++++++++++++++++++++
 tests/migration/aarch64/a-b-kernel.h | 19 +++++++++
 tests/migration/migration-test.h     |  9 +++++
 7 files changed, 148 insertions(+), 5 deletions(-)
 create mode 100644 tests/migration/aarch64/Makefile
 create mode 100644 tests/migration/aarch64/a-b-kernel.S
 create mode 100644 tests/migration/aarch64/a-b-kernel.h

I see this is already pulled, but just in case it still matters

#16 lore raw
In reply to Wei Huang
Quoted 50 lines · Wei Huang

This patchset adds a migration test for aarch64. It leverages Dave Gilbert's migration boot block patches to create a new test case for aarch64.

V8->V9:
* Remove accel= setting for AArch64. It uses the default "kvm:tcg" now
* Revise the header file comment (suggested by drjones)
* Name x86 directory to i386 instead of x86_64; change Makefile accordingly
* Remove $(ARCH) from the assembly and header file names

V7->V8:
* Support cross compilation by searching for CROSS_CC_GUEST option, instead of using the find-cross-prefix defined in roms/Makefile
* Use the "max" options for ARM guest VM's CPU and GIC types
* $(TARGET)/Makefile rules are rewritten based on Laurent Vivier's comment
* NOTE: because Patch 1/2 is re-written, I remove the "Reviewed-by" for reviewers to take a look again. Thanks.

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.

Quoted 6 lines

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

Queued for next Migration PULL request, thanks.

Later, Juan.