Skip to contentSkip to conversation

tests: Add migration test for aarch64

PATCH Superseded Wei Huang 7 participants 22 messages Feb 28, 2018 – Apr 4, 2018

v7 of 9 Superseded Latest is v9 →

lore
Share & tools
lore

Wei Huang

author
#0 lore raw

v7 cover tests: Add migration test for aarch64

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%)
Signature · 1 line
2.14.3
author
#1 lore raw

PATCH v7 1/4 rules: Move cross compilation auto detection functions to rules.mak

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +7 -17
index b5e5a69e91..e972c65333 100644
@@ -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
rules.mak +15 -0
index 6e943335f3..ef8adee3f8 100644
@@ -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) \
Signature · 1 line
2.14.3
#2 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 40 lines · Wei Huang

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +0 -17
index b5e5a69e91..e972c65333 100644
@@ -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"
 

roms/Makefile default: · line 53

Quoted 5 lines
roms/Makefile +2 -0
@@ -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

#3 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

In reply to Wei Huang
Quoted 70 lines · Wei Huang

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +7 -17
index b5e5a69e91..e972c65333 100644
@@ -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
rules.mak +8 -0
index 6e943335f3..ef8adee3f8 100644
@@ -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")

rules.mak expand-objs = $(strip $(sort $(filter %.o,$1)) \ · line 82

Quoted 10 lines
rules.mak +7 -0
+
+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

#4 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 95 lines · * Laurent Vivier ([email protected]) wrote:
Quoted 70 lines · Wei Huang

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +7 -17
index b5e5a69e91..e972c65333 100644
@@ -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
rules.mak +8 -0
index 6e943335f3..ef8adee3f8 100644
@@ -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")

rules.mak expand-objs = $(strip $(sort $(filter %.o,$1)) \ · line 82

Quoted 10 lines
rules.mak +7 -0
+
+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

Quoted 2 lines

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

Quoted 4 lines

Thanks,
Laurent

--
Dr. David Alan Gilbert / [email protected] / Manchester, UK

#5 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 99 lines · Dr. David Alan Gilbert
Quoted 95 lines · * Laurent Vivier ([email protected]) wrote:
Quoted 70 lines · Wei Huang

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +7 -17
index b5e5a69e91..e972c65333 100644
@@ -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
rules.mak +8 -0
index 6e943335f3..ef8adee3f8 100644
@@ -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")

rules.mak expand-objs = $(strip $(sort $(filter %.o,$1)) \ · line 82

Quoted 10 lines
rules.mak +7 -0
+
+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

Quoted 2 lines

Perhaps rules.mak defines values inherited by SLOF makefiles that are incompatible?

Quoted 8 lines

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

#6 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 3 lines · Andrew Jones

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

#7 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 5 lines · Peter Maydell
Quoted 3 lines · Andrew Jones

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).

Quoted 7 lines

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

Signature · 3 lines
|: 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 :|
#8 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

In reply to Andrew Jones
Quoted 103 lines · * Andrew Jones ([email protected]) wrote:
Quoted 102 lines · Dr. David Alan Gilbert
Quoted 95 lines · * Laurent Vivier ([email protected]) wrote:
Quoted 70 lines · Wei Huang

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +7 -17
index b5e5a69e91..e972c65333 100644
@@ -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
rules.mak +8 -0
index 6e943335f3..ef8adee3f8 100644
@@ -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")

rules.mak expand-objs = $(strip $(sort $(filter %.o,$1)) \ · line 82

Quoted 10 lines
rules.mak +7 -0
+
+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

Quoted 2 lines

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:

Quoted 7 lines
Quoted 5 lines

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.

Quoted 10 lines

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

Quoted 2 lines

Thanks,
drew

--
Dr. David Alan Gilbert / [email protected] / Manchester, UK

author
#9 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 122 lines · Dr. David Alan Gilbert
Quoted 103 lines · * Andrew Jones ([email protected]) wrote:
Quoted 102 lines · Dr. David Alan Gilbert
Quoted 95 lines · * Laurent Vivier ([email protected]) wrote:
Quoted 70 lines · Wei Huang

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.

---
 roms/Makefile | 24 +++++++-----------------
 rules.mak     | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 17 deletions(-)
roms/Makefile +7 -17
index b5e5a69e91..e972c65333 100644
@@ -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
rules.mak +8 -0
index 6e943335f3..ef8adee3f8 100644
@@ -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")

rules.mak expand-objs = $(strip $(sort $(filter %.o,$1)) \ · line 82

Quoted 10 lines
rules.mak +7 -0
+
+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

Quoted 2 lines

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:

Quoted 7 lines
Quoted 5 lines

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.

Quoted 4 lines

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).

Quoted 8 lines
Quoted 6 lines

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?

Quoted 8 lines

Dave

Quoted 2 lines

Thanks,
drew

--
Dr. David Alan Gilbert / [email protected] / Manchester, UK

#10 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

On 05/03/2018 18:59, Wei Huang wrote:
...

Quoted 19 lines

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.

Quoted 1 line

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

#11 lore raw

Re: [Qemu-devel] [PATCH V7 1/4] rules: Move cross compilation auto detection functions to rules.mak

Quoted 21 lines · Laurent Vivier

On 05/03/2018 18:59, Wei Huang wrote:
...

Quoted 19 lines

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.

Quoted 4 lines
Quoted 1 line

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.

Quoted 3 lines

thanks,
Laurent

--
Alex Bennée

author
#12 lore raw

PATCH v7 2/4 tests/migration: Convert the boot block compilation script into Makefile

In reply to 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.

---
 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
tests/migration/Makefile new file +36 -0
new file mode 100644
index 0000000000..8fbedaa8b8
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
+#
+# Authors:
+#   Dave Gilbert <[email protected]>
+#
+# 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
tests/migration/rebuild-x86-bootblock.sh deleted +0 -33
deleted file mode 100755
index 86cec5d284..0000000000
@@ -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.h +1 -1
index 78a151fe2a..9e8e2e028b 100644
@@ -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[] = {
tests/migration/x86-a-b-bootblock.s +2 -3
index b1642641a7..98dbfab084 100644
@@ -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.
Signature · 1 line
2.14.3
#13 lore raw

Re: [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile

Quoted 36 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.

---
 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
tests/migration/Makefile new file +14 -0
new file mode 100644
index 0000000000..8fbedaa8b8
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
+#
+# Authors:
+#   Dave Gilbert <[email protected]>
+#
+# 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,

tests/migration/Makefile line 24

Quoted 10 lines
tests/migration/Makefile new file +10 -0
+ * 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?

tests/migration/Makefile line 33

Quoted 9 lines
tests/migration/Makefile new file +9 -0
+
+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

author
#14 lore raw

Re: [Qemu-devel] [PATCH V7 2/4] tests/migration: Convert the boot block compilation script into Makefile

Quoted 41 lines · Laurent Vivier
Quoted 40 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.

---
 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
tests/migration/Makefile new file +18 -0
new file mode 100644
index 0000000000..8fbedaa8b8
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
+#
+# Authors:
+#   Dave Gilbert <[email protected]>
+#
+# 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
+
Quoted 8 lines

tests/migration/Makefile line 24

Quoted 6 lines
tests/migration/Makefile new file +6 -0
+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.

Quoted 19 lines

tests/migration/Makefile line 33

Quoted 10 lines
tests/migration/Makefile new file +9 -0
+
+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
Quoted 8 lines

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).

Quoted 3 lines

Thanks,
Laurent

author
#15 lore raw

PATCH v7 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 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.

---
 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%)
tests/migration-test.c +20 -14
index 74f9361bdd..12c04a9648 100644
@@ -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();
     }
tests/migration/Makefile +2 -2
index 8fbedaa8b8..013b8d1f44 100644
@@ -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" > $@
tests/migration/migration-test.h new file +22 -0
new file mode 100644
index 0000000000..06c46a2fe0
@@ -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_ */
tests/migration/x86-a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.s +4 -3
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
@@ -12,6 +12,7 @@
 #
 # Author: [email protected]
 
+#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
tests/migration/x86-a-b-bootblock.h +1 -1
index 9e8e2e028b..44e4b99506 100644
@@ -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.
  */
Signature · 1 line
2.14.3
Reviewed-by on v7 3/4
#16 lore raw

Re: [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file

Quoted 46 lines · Wei Huang

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.

---
 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%)
tests/migration-test.c +5 -5
index 74f9361bdd..12c04a9648 100644
@@ -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"
 

tests/migration-test.c static void init_bootfile_ppc(const char *bootpath) · line 108

Quoted 8 lines
tests/migration-test.c +2 -3
@@ -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.

Quoted 138 lines
tests/migration-test.c +13 -6
      */
 
     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();
     }
tests/migration/Makefile +2 -2
index 8fbedaa8b8..013b8d1f44 100644
@@ -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" > $@
tests/migration/migration-test.h new file +22 -0
new file mode 100644
index 0000000000..06c46a2fe0
@@ -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_ */
tests/migration/x86-a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.s +4 -3
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
@@ -12,6 +12,7 @@
 #
 # Author: [email protected]
 
+#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
tests/migration/x86-a-b-bootblock.h +1 -1
index 9e8e2e028b..44e4b99506 100644
@@ -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.
  */
Signature · 1 line
2.14.3

I added a new suggestion to this patch, but it's not a deal breaker for me, so

#17 lore raw

Re: [Qemu-devel] [PATCH V7 3/4] tests/migration: Add migration-test header file

Quoted 50 lines · * Andrew Jones ([email protected]) wrote:
Quoted 49 lines · Wei Huang

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.

---
 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%)
tests/migration-test.c +5 -5
index 74f9361bdd..12c04a9648 100644
@@ -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);
 
Quoted 12 lines

tests/migration-test.c static void init_bootfile_ppc(const char *bootpath) · line 108

Quoted 5 lines
tests/migration-test.c +2 -3
-    /* 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

Quoted 143 lines
Quoted 139 lines
tests/migration-test.c +13 -6
      */
 
     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();
     }
tests/migration/Makefile +2 -2
index 8fbedaa8b8..013b8d1f44 100644
@@ -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" > $@
tests/migration/migration-test.h new file +22 -0
new file mode 100644
index 0000000000..06c46a2fe0
@@ -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_ */
tests/migration/x86-a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.s +4 -3
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
@@ -12,6 +12,7 @@
 #
 # Author: [email protected]
 
+#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
tests/migration/x86-a-b-bootblock.h +1 -1
index 9e8e2e028b..44e4b99506 100644
@@ -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.
  */
Signature · 1 line
2.14.3

I added a new suggestion to this patch, but it's not a deal breaker for me, so

Quoted 1 line

--
Dr. David Alan Gilbert / [email protected] / Manchester, UK

author
#18 lore raw

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

---
 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
tests/Makefile.include +1 -0
index 577eb573a2..538173866c 100644
@@ -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)
 
tests/migration-test.c +40 -4

78 lines not on this page · raw message

tests/migration/Makefile +10 -2
index 013b8d1f44..1324427a93 100644
@@ -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
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 0000000000..53b44d3e99
@@ -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
+};
+
tests/migration/migration-test.h +9 -0
index 06c46a2fe0..a55b74c98c 100644
@@ -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_ */
Signature · 1 line
2.14.3
Reviewed-by on v7 4/4
#19 lore raw
Quoted 16 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/. So users can change the source and/or re-compile the binary as they wish.

Quoted 11 lines
---
 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
#20 lore raw
In reply to Wei Huang
Quoted 99 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/. So users can change the source and/or re-compile the binary as they wish.

---
 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
tests/Makefile.include +1 -0
index 577eb573a2..538173866c 100644
@@ -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)
 
tests/migration-test.c +24 -3
index 12c04a9648..ff424330a1 100644
@@ -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 "

tests/migration-test.c static void test_migrate_start(QTestState **from, QTestState **to, · line 460

Quoted 10 lines
tests/migration-test.c +10 -0
+                                  "-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

Quoted 179 lines
tests/migration-test.c +6 -1
+
+        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");
tests/migration/Makefile +10 -2
index 013b8d1f44..1324427a93 100644
@@ -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
tests/migration/aarch64-a-b-kernel.S new file +75 -0
new file mode 100644
index 0000000000..eec8f44f16
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
+#
+# Author:
+#   Wei Huang <[email protected]>
+#
+# 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
tests/migration/aarch64-a-b-kernel.h new file +19 -0
new file mode 100644
index 0000000000..53b44d3e99
@@ -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
+};
+
tests/migration/migration-test.h +9 -0
index 06c46a2fe0..a55b74c98c 100644
@@ -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_ */
Signature · 1 line
2.14.3
#21 lore raw
In reply to Wei Huang
Quoted 3 lines · * Wei Huang ([email protected]) 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

Quoted 59 lines

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 ++--
Quoted 12 lines
 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%)
Signature · 1 line
2.14.3

--
Dr. David Alan Gilbert / [email protected] / Manchester, UK