tests: Add migration test for aarch64
v4 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.
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 (3):
tests/migration: Convert the boot block compilation script into
Makefile
tests/migration: Add migration-test header file
tests: Add migration test for aarch64
tests/Makefile.include | 1 +
tests/migration-test.c | 52 +++++++++++++---
tests/migration/Makefile | 46 ++++++++++++++
tests/migration/aarch64-a-b-kernel.S | 71 ++++++++++++++++++++++
tests/migration/aarch64-a-b-kernel.h | 19 ++++++
tests/migration/migration-test.h | 24 ++++++++
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 +-
9 files changed, 213 insertions(+), 49 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
PATCH v4 1/3 tests/migration: Convert the 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.
--- tests/migration/Makefile | 38 ++++++++++++++++++++++++++++++++ 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, 41 insertions(+), 37 deletions(-) create mode 100644 tests/migration/Makefile delete mode 100755 tests/migration/rebuild-x86-bootblock.sh
tests/migration/Makefile new file +38 -0
@@ -0,0 +1,38 @@ +# +# 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. +# +path := $(subst :, ,$(PATH)) +system := $(shell uname -s | tr "A-Z" "a-z") + +cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path)))) +cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) +find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) + +x86_64_cross_prefix := $(call find-cross-prefix,x86_64) + +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 + +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
@@ -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
@@ -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
@@ -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
Re: [Qemu-devel] [PATCH V4 1/3] tests/migration: Convert the boot block compilation script into Makefile
Quoted 28 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.Signed-off-by Wei Huang <[email protected]>--- tests/migration/Makefile | 38 ++++++++++++++++++++++++++++++++ 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, 41 insertions(+), 37 deletions(-) create mode 100644 tests/migration/Makefile delete mode 100755 tests/migration/rebuild-x86-bootblock.shtests/migration/Makefile new file +7
-0@@ -0,0 +1,38 @@ +# +# 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.
tests/migration/Makefile line 17
Quoted 10 lines
tests/migration/Makefile new file +10
-0+# See the COPYING file in the top-level directory. +# +path := $(subst :, ,$(PATH)) +system := $(shell uname -s | tr "A-Z" "a-z") + +cross-ld = $(firstword $(wildcard $(patsubst %,%/$(1)-*$(system)*-ld,$(path)))) +cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) +find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) + +x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
I see the above lines are copied from roms/Makefile. Is there no way to avoid the duplication? Add them to $(SRC_PATH)/rules.mak and include them?
Quoted 92 lines
tests/migration/Makefile new file +21
-0+ +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 + +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 *.otests/migration/rebuild-x86-bootblock.sh deleted +0
-33@@ -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@@ -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@@ -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
Thanks,
drew
PATCH v4 2/3 tests/migration: Add migration-test header file
In reply to Wei HuangThis 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 | 9 +++++----
tests/migration/Makefile | 4 ++--
tests/migration/migration-test.h | 19 +++++++++++++++++++
.../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 ++++---
tests/migration/x86-a-b-bootblock.h | 2 +-
5 files changed, 31 insertions(+), 10 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 -4
@@ -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 ; +const unsigned start_address =TEST_MEM_START ; +const unsigned end_address =TEST_MEM_END ;bool got_stop;#if defined(__linux__)
@@ -278,7 +278,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 );
tests/migration/Makefile +2 -2
@@ -27,8 +27,8 @@ endef all: x86-a-b-bootblock.h -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 +19 -0
@@ -0,0 +1,19 @@ +/* +* 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_START (1 * 1024 * 1024) +#define TEST_MEM_END (100 * 1024 * 1024) +#define TEST_MEM_PAGE_SIZE 4096 + +/* PPC */ +#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
@@ -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 $TEST_MEM_START,%eax innerloop: incb (%eax) - add $4096,%eax - cmp $(100*1024*1024),%eax + add $TEST_MEM_PAGE_SIZE,%eax + cmp $TEST_MEM_END,%eax jl innerloop inc %bl
tests/migration/x86-a-b-bootblock.h +1 -1
@@ -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
Re: [Qemu-devel] [PATCH V4 2/3] tests/migration: Add migration-test header file
Quoted 35 lines · Wei Huang
This patch moves the settings related migration-test from the
migration-test.cfile to a seperate header file. It also renames the x86-a-b-bootblock.s file extension from .s to .S, allowing gcc pre-processor to include the C-style header file correctly.Signed-off-by Wei Huang <[email protected]>--- tests/migration-test.c | 9 +++++---- tests/migration/Makefile | 4 ++-- tests/migration/migration-test.h | 19 +++++++++++++++++++ .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 ++++--- tests/migration/x86-a-b-bootblock.h | 2 +- 5 files changed, 31 insertions(+), 10 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 +3
-3@@ -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 ; +const unsigned start_address =TEST_MEM_START ; +const unsigned end_address =TEST_MEM_END ;bool got_stop;#if defined(__linux__)
tests/migration-test.c static void check_guests_ram(QTestState *who) · line 285
Quoted 9 lines
tests/migration-test.c +2
-1@@ -278,7 +278,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 );
There are several 1M / 100M comments in this file. Maybe not worth changing, but now that we've defined those values, it seems they should be rewritten more generically.
Quoted 30 lines
tests/migration/Makefile +2
-2@@ -27,8 +27,8 @@ endef all: x86-a-b-bootblock.h -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 +9
-0@@ -0,0 +1,19 @@ +/* +* 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_ +
tests/migration/migration-test.h line 19
Quoted 10 lines
tests/migration/migration-test.h new file +10
-0+/* Common */ +#define TEST_MEM_START (1 * 1024 * 1024) +#define TEST_MEM_END (100 * 1024 * 1024) +#define TEST_MEM_PAGE_SIZE 4096 + +/* PPC */ +#define MIN_NVRAM_SIZE 8192/* from spapr_nvram.c */ + +#endif /* _TEST_MIGRATION_H_ */ +
trailing blank line
Quoted 45 lines
tests/migration/x86-a-b-bootblock.S renamed from tests/migration/x86-a-b-bootblock.s +4
-3@@ -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 $TEST_MEM_START,%eax innerloop: incb (%eax) - add $4096,%eax - cmp $(100*1024*1024),%eax + add $TEST_MEM_PAGE_SIZE,%eax + cmp $TEST_MEM_END,%eax jl innerloop inc %bltests/migration/x86-a-b-bootblock.h +1
-1@@ -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
Otherwise,
PATCH v4 3/3 tests: Add migration test for aarch64
In reply to Wei HuangThis 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 | 47 +++++++++++++++++++++--- tests/migration/Makefile | 12 +++++- tests/migration/aarch64-a-b-kernel.S | 71 ++++++++++++++++++++++++++++++++++++ tests/migration/aarch64-a-b-kernel.h | 19 ++++++++++ tests/migration/migration-test.h | 5 +++ 6 files changed, 147 insertions(+), 8 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
@@ -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 +41 -6
87 lines not on this page · raw message
tests/migration/Makefile +10 -2
@@ -15,6 +15,7 @@ cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) x86_64_cross_prefix := $(call find-cross-prefix,x86_64) +aarch64_cross_prefix := $(call find-cross-prefix,aarch64) export __note override define __note
@@ -25,7 +26,7 @@ override define __note */ endef -all: x86-a-b-bootblock.h +all: x86-a-b-bootblock.h aarch64-a-b-kernel.h x86-a-b-bootblock.h: x86-a-b-bootblock.S $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
@@ -34,5 +35,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,-Ttext=40080000 $< + $(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 +71 -0
71 lines not on this page · raw message
tests/migration/aarch64-a-b-kernel.h new file +19 -0
@@ -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 ,0x97 +}; +
tests/migration/migration-test.h +5 -0
@@ -15,5 +15,10 @@/* PPC */ #define MIN_NVRAM_SIZE 8192/* from spapr_nvram.c */ +/* AArch64 */ +#define ARM_MACH_VIRT_UART 0x09000000 +#define ARM_TEST_MEM_START (0x40000000 + TEST_MEM_START) +#define ARM_TEST_MEM_END (0x40000000 + TEST_MEM_END) +#endif /* _TEST_MIGRATION_H_ */
Signature · 1 line
2.14.3
Quoted 158 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 is0x40000000. We change thestart_addressandend_addressfor aarch64.In addition to providing the binary, this patch also includes the source code and the build script in tests/migration/. So users can change the source and/or re-compile the binary as they wish.
Signed-off-by Wei Huang <[email protected]>--- tests/Makefile.include | 1 + tests/migration-test.c | 47 +++++++++++++++++++++--- tests/migration/Makefile | 12 +++++- tests/migration/aarch64-a-b-kernel.S | 71 ++++++++++++++++++++++++++++++++++++ tests/migration/aarch64-a-b-kernel.h | 19 ++++++++++ tests/migration/migration-test.h | 5 +++ 6 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 tests/migration/aarch64-a-b-kernel.S create mode 100644 tests/migration/aarch64-a-b-kernel.htests/Makefile.include +1
-0@@ -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 +41
-6@@ -11,6 +11,7 @@*/ #include "qemu/osdep.h" +#include <sys/utsname.h> #include "libqtest.h" #include "qapi/qmp/qdict.h" @@ -23,8 +24,8 @@#include "migration/migration-test.h" -const unsigned start_address =TEST_MEM_START ; -const unsigned end_address =TEST_MEM_END ; +unsigned start_address =TEST_MEM_START ; +unsigned end_address =TEST_MEM_END ;bool got_stop;#if defined(__linux__)@@ -81,12 +82,13 @@ static const char *tmpfs;* outputting a 'B' every so often if 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); }@@ -393,7 +395,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"@@ -422,6 +424,39 @@ static void test_migrate_start(QTestState **from, QTestState **to," -serial file:%s/dest_serial" " -incoming %s" , accel, tmpfs, uri); + }else if (strcmp (arch,"aarch64" ) ==0 ) { +const char *cpu; +const char *gic_ver; +struct utsname utsname; + +/* kvm and tcg need different cpu and gic-version configs */ +if (access ("/dev/kvm" ,F_OK ) ==0 &&uname (&utsname) ==0 && +strcmp (utsname.machine,"aarch64" ) ==0 ) { + accel ="kvm" ; + cpu ="host" ; + gic_ver ="host" ; + }else { + accel ="tcg" ; + cpu ="cortex-a57" ; + gic_ver ="2" ; + } + +init_bootfile (bootpath, aarch64_kernel); + cmd_src =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmsource,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/src_serial " +"-kernel %s " , + accel, gic_ver, cpu, tmpfs, bootpath); + cmd_dst =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmdest,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/dest_serial " +"-kernel %s " +"-incoming %s " , + accel, gic_ver, cpu, tmpfs, bootpath, uri); + +/* aarch64 virt machine physical memory starts at 0x40000000 */ + start_address =ARM_TEST_MEM_START ; + end_address =ARM_TEST_MEM_END ; }else {g_assert_not_reached (); }@@ -506,7 +541,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 +2
-1@@ -15,6 +15,7 @@ cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) x86_64_cross_prefix := $(call find-cross-prefix,x86_64) +aarch64_cross_prefix := $(call find-cross-prefix,aarch64) export __note override define __note@@ -25,7 +26,7 @@ override define __note */ endef -all: x86-a-b-bootblock.h +all: x86-a-b-bootblock.h aarch64-a-b-kernel.h x86-a-b-bootblock.h: x86-a-b-bootblock.S $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o
tests/migration/Makefile x86-a-b-bootblock.h: x86-a-b-bootblock.S · line 40
Quoted 6 lines
tests/migration/Makefile +3
-0@@ -34,5 +35,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,-Ttext=40080000 $<
Adding the arm64 Linux kernel offset here is a bit subtle. And, since the TEST_MEM_START is at 1M, that only leaves 512K for test code and data. I think you may want to define this offset somewhere, making it less subtle, and then also factor it in when computing the test mem start.
Quoted 26 lines
tests/migration/Makefile +5
-1+ $(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 *.kerneltests/migration/aarch64-a-b-kernel.S new file +13
-0@@ -0,0 +1,71 @@ +# +# 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. + +#include "migration-test.h" + +.section .text +
tests/migration/aarch64-a-b-kernel.S line 23
Quoted 10 lines
tests/migration/aarch64-a-b-kernel.S new file +10
-0+ .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 1M-100M */
s/1M-100M/the test memory region/
There's no reason to create nice defines if we still have to maintain the comments.
Quoted 19 lines
tests/migration/aarch64-a-b-kernel.S new file +19
-0+ 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
tests/migration/aarch64-a-b-kernel.S line 52
Quoted 10 lines
tests/migration/aarch64-a-b-kernel.S new file +10
-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 4KB page by 1 */
s/4KB page/page/
Quoted 9 lines
tests/migration/aarch64-a-b-kernel.S new file +9
-0+ 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 +
tests/migration/aarch64-a-b-kernel.S line 71
Quoted 10 lines
tests/migration/aarch64-a-b-kernel.S new file +10
-0+ add w5, w5, #1 + and w5, w5, #0xff + cmp w5, #0 + bne mainloop + + /* output char 'B' to PL011 */ + mov w3, 'B' + strb w3, [x2] + + bl mainloop
nit: should use just 'b' here, no need to set the link register.
Quoted 30 lines
tests/migration/aarch64-a-b-kernel.h new file +19
-0@@ -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 ,0x97 +}; +tests/migration/migration-test.h +0
-0
tests/migration/migration-test.h line 22
Quoted 8 lines
tests/migration/migration-test.h +5
-0@@ -15,5 +15,10 @@/* PPC */ #define MIN_NVRAM_SIZE 8192/* from spapr_nvram.c */ +/* AArch64 */ +#define ARM_MACH_VIRT_UART 0x09000000 +#define ARM_TEST_MEM_START (0x40000000 + TEST_MEM_START) +#define ARM_TEST_MEM_END (0x40000000 + TEST_MEM_END) +
As stated above, this should be something like
#define ARM_TEST_MEM_START (0x40000000 + ARM64_KERNEL_OFFSET + TEST_MEM_START)
#define ARM_TEST_MEM_END (0x40000000 + ARM64_KERNEL_OFFSET + TEST_MEM_END)
Otherwise, it's not even obvious that TEST_MEM_START > ARM64_KERNEL_OFFSET
Thanks,
drew
Quoted 6 lines
tests/migration/migration-test.h +0
-0#endif /* _TEST_MIGRATION_H_ */ Signature · 1 line
2.14.3
Quoted 162 lines · Andrew Jones
Quoted 161 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 is0x40000000. We change thestart_addressandend_addressfor aarch64.In addition to providing the binary, this patch also includes the source code and the build script in tests/migration/. So users can change the source and/or re-compile the binary as they wish.
Signed-off-by Wei Huang <[email protected]>--- tests/Makefile.include | 1 + tests/migration-test.c | 47 +++++++++++++++++++++--- tests/migration/Makefile | 12 +++++- tests/migration/aarch64-a-b-kernel.S | 71 ++++++++++++++++++++++++++++++++++++ tests/migration/aarch64-a-b-kernel.h | 19 ++++++++++ tests/migration/migration-test.h | 5 +++ 6 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 tests/migration/aarch64-a-b-kernel.S create mode 100644 tests/migration/aarch64-a-b-kernel.htests/Makefile.include +1
-0@@ -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 +41
-6@@ -11,6 +11,7 @@*/ #include "qemu/osdep.h" +#include <sys/utsname.h> #include "libqtest.h" #include "qapi/qmp/qdict.h" @@ -23,8 +24,8 @@#include "migration/migration-test.h" -const unsigned start_address =TEST_MEM_START ; -const unsigned end_address =TEST_MEM_END ; +unsigned start_address =TEST_MEM_START ; +unsigned end_address =TEST_MEM_END ;bool got_stop;#if defined(__linux__)@@ -81,12 +82,13 @@ static const char *tmpfs;* outputting a 'B' every so often if 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); }@@ -393,7 +395,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"@@ -422,6 +424,39 @@ static void test_migrate_start(QTestState **from, QTestState **to," -serial file:%s/dest_serial" " -incoming %s" , accel, tmpfs, uri); + }else if (strcmp (arch,"aarch64" ) ==0 ) { +const char *cpu; +const char *gic_ver; +struct utsname utsname; + +/* kvm and tcg need different cpu and gic-version configs */ +if (access ("/dev/kvm" ,F_OK ) ==0 &&uname (&utsname) ==0 && +strcmp (utsname.machine,"aarch64" ) ==0 ) { + accel ="kvm" ; + cpu ="host" ; + gic_ver ="host" ; + }else { + accel ="tcg" ; + cpu ="cortex-a57" ; + gic_ver ="2" ; + } + +init_bootfile (bootpath, aarch64_kernel); + cmd_src =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmsource,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/src_serial " +"-kernel %s " , + accel, gic_ver, cpu, tmpfs, bootpath); + cmd_dst =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmdest,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/dest_serial " +"-kernel %s " +"-incoming %s " , + accel, gic_ver, cpu, tmpfs, bootpath, uri); + +/* aarch64 virt machine physical memory starts at 0x40000000 */ + start_address =ARM_TEST_MEM_START ; + end_address =ARM_TEST_MEM_END ; }else {g_assert_not_reached (); }@@ -506,7 +541,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 +2
-1@@ -15,6 +15,7 @@ cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) x86_64_cross_prefix := $(call find-cross-prefix,x86_64) +aarch64_cross_prefix := $(call find-cross-prefix,aarch64) export __note override define __note@@ -25,7 +26,7 @@ override define __note */ endef -all: x86-a-b-bootblock.h +all: x86-a-b-bootblock.h aarch64-a-b-kernel.h x86-a-b-bootblock.h: x86-a-b-bootblock.S $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o@@ -34,5 +35,12 @@ x86-a-b-bootblock.h: x86-a-b-bootblock.S echo "$$__note" > $@ xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@
Quoted 8 lines
tests/migration/Makefile x86-a-b-bootblock.h: x86-a-b-bootblock.S · line 40
Quoted 3 lines
tests/migration/Makefile +3
-0+aarch64-a-b-kernel.h: aarch64-a-b-kernel.S + $(aarch64_cross_prefix)gcc -o aarch64.elf -nostdlib \ + -Wl,--build-id=none,-Ttext=40080000 $<Adding the arm64 Linux kernel offset here is a bit subtle. And, since the
TEST_MEM_STARTis at 1M, that only leaves 512K for test code and data. I think you may want to define this offset somewhere, making it less subtle, and then also factor it in when computing the test mem start.
I have fixed most parts based on your review comments, except for this one. I think the section address, -Ttext=, doesn't matter in this case. Such info is not present aarch64.kernel; plus QEMU loads the kernel into the loader_start address, which is the physical memory base (0x40000000, see virt.c). So the space to store kernel binary is 1MB, which should be large enough to prevent aarch64-a-b-kernel.S from changing code.
Anyway I think we are fine to remove "-Ttext=40080000" here. To address concerns, I add more comments in the migration-test.c (V5).
Quoted 153 lines
Quoted 27 lines
tests/migration/Makefile +5
-1+ $(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 *.kerneltests/migration/aarch64-a-b-kernel.S new file +13
-0@@ -0,0 +1,71 @@ +# +# 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. + +#include "migration-test.h" + +.section .text +tests/migration/aarch64-a-b-kernel.S line 23
Quoted 10 lines
tests/migration/aarch64-a-b-kernel.S new file +10
-0+ .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 1M-100M */s/1M-100M/the test memory region/
There's no reason to create nice defines if we still have to maintain the comments.
Quoted 19 lines
tests/migration/aarch64-a-b-kernel.S new file +19
-0+ 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, #0tests/migration/aarch64-a-b-kernel.S line 52
Quoted 10 lines
tests/migration/aarch64-a-b-kernel.S new file +10
-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 4KB page by 1 */s/4KB page/page/
Quoted 9 lines
tests/migration/aarch64-a-b-kernel.S new file +9
-0+ 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 +tests/migration/aarch64-a-b-kernel.S line 71
Quoted 10 lines
tests/migration/aarch64-a-b-kernel.S new file +10
-0+ add w5, w5, #1 + and w5, w5, #0xff + cmp w5, #0 + bne mainloop + + /* output char 'B' to PL011 */ + mov w3, 'B' + strb w3, [x2] + + bl mainloopnit: should use just 'b' here, no need to set the link register.
Quoted 30 lines
tests/migration/aarch64-a-b-kernel.h new file +19
-0@@ -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 ,0x97 +}; +tests/migration/migration-test.h +0
-0tests/migration/migration-test.h line 22
Quoted 8 lines
tests/migration/migration-test.h +5
-0@@ -15,5 +15,10 @@/* PPC */ #define MIN_NVRAM_SIZE 8192/* from spapr_nvram.c */ +/* AArch64 */ +#define ARM_MACH_VIRT_UART 0x09000000 +#define ARM_TEST_MEM_START (0x40000000 + TEST_MEM_START) +#define ARM_TEST_MEM_END (0x40000000 + TEST_MEM_END) +As stated above, this should be something like
#define
ARM_TEST_MEM_START(0x40000000+ARM64_KERNEL_OFFSET+TEST_MEM_START)
#defineARM_TEST_MEM_END(0x40000000+ARM64_KERNEL_OFFSET+TEST_MEM_END)Otherwise, it's not even obvious that
TEST_MEM_START>ARM64_KERNEL_OFFSETThanks,
drewQuoted 6 lines
tests/migration/migration-test.h +0
-0#endif /* _TEST_MIGRATION_H_ */ Signature · 1 line
2.14.3
Quoted 174 lines · Wei Huang
Quoted 162 lines · Andrew Jones
Quoted 161 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 is0x40000000. We change thestart_addressandend_addressfor aarch64.In addition to providing the binary, this patch also includes the source code and the build script in tests/migration/. So users can change the source and/or re-compile the binary as they wish.
Signed-off-by Wei Huang <[email protected]>--- tests/Makefile.include | 1 + tests/migration-test.c | 47 +++++++++++++++++++++--- tests/migration/Makefile | 12 +++++- tests/migration/aarch64-a-b-kernel.S | 71 ++++++++++++++++++++++++++++++++++++ tests/migration/aarch64-a-b-kernel.h | 19 ++++++++++ tests/migration/migration-test.h | 5 +++ 6 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 tests/migration/aarch64-a-b-kernel.S create mode 100644 tests/migration/aarch64-a-b-kernel.htests/Makefile.include +1
-0@@ -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 +41
-6@@ -11,6 +11,7 @@*/ #include "qemu/osdep.h" +#include <sys/utsname.h> #include "libqtest.h" #include "qapi/qmp/qdict.h" @@ -23,8 +24,8 @@#include "migration/migration-test.h" -const unsigned start_address =TEST_MEM_START ; -const unsigned end_address =TEST_MEM_END ; +unsigned start_address =TEST_MEM_START ; +unsigned end_address =TEST_MEM_END ;bool got_stop;#if defined(__linux__)@@ -81,12 +82,13 @@ static const char *tmpfs;* outputting a 'B' every so often if 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); }@@ -393,7 +395,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"@@ -422,6 +424,39 @@ static void test_migrate_start(QTestState **from, QTestState **to," -serial file:%s/dest_serial" " -incoming %s" , accel, tmpfs, uri); + }else if (strcmp (arch,"aarch64" ) ==0 ) { +const char *cpu; +const char *gic_ver; +struct utsname utsname; + +/* kvm and tcg need different cpu and gic-version configs */ +if (access ("/dev/kvm" ,F_OK ) ==0 &&uname (&utsname) ==0 && +strcmp (utsname.machine,"aarch64" ) ==0 ) { + accel ="kvm" ; + cpu ="host" ; + gic_ver ="host" ; + }else { + accel ="tcg" ; + cpu ="cortex-a57" ; + gic_ver ="2" ; + } + +init_bootfile (bootpath, aarch64_kernel); + cmd_src =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmsource,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/src_serial " +"-kernel %s " , + accel, gic_ver, cpu, tmpfs, bootpath); + cmd_dst =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmdest,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/dest_serial " +"-kernel %s " +"-incoming %s " , + accel, gic_ver, cpu, tmpfs, bootpath, uri); + +/* aarch64 virt machine physical memory starts at 0x40000000 */ + start_address =ARM_TEST_MEM_START ; + end_address =ARM_TEST_MEM_END ; }else {g_assert_not_reached (); }@@ -506,7 +541,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 +2
-1@@ -15,6 +15,7 @@ cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) x86_64_cross_prefix := $(call find-cross-prefix,x86_64) +aarch64_cross_prefix := $(call find-cross-prefix,aarch64) export __note override define __note@@ -25,7 +26,7 @@ override define __note */ endef -all: x86-a-b-bootblock.h +all: x86-a-b-bootblock.h aarch64-a-b-kernel.h x86-a-b-bootblock.h: x86-a-b-bootblock.S $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o@@ -34,5 +35,12 @@ x86-a-b-bootblock.h: x86-a-b-bootblock.S echo "$$__note" > $@ xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@Quoted 8 lines
tests/migration/Makefile x86-a-b-bootblock.h: x86-a-b-bootblock.S · line 40
Quoted 3 lines
tests/migration/Makefile +3
-0+aarch64-a-b-kernel.h: aarch64-a-b-kernel.S + $(aarch64_cross_prefix)gcc -o aarch64.elf -nostdlib \ + -Wl,--build-id=none,-Ttext=40080000 $<Adding the arm64 Linux kernel offset here is a bit subtle. And, since the
TEST_MEM_STARTis at 1M, that only leaves 512K for test code and data. I think you may want to define this offset somewhere, making it less subtle, and then also factor it in when computing the test mem start.
Quoted 3 lines
I have fixed most parts based on your review comments, except for this one. I think the section address, -Ttext=, doesn't matter in this case. Such info is not present aarch64.kernel; plus QEMU loads the kernel into
In this case it doesn't matter because your code only uses pc-relative addresses. It's pretty safe to assume the compiler will only emit pc- relative addresses for code like this, so that's probably fine.
Quoted 3 lines
the
loader_startaddress, which is the physical memory base (0x40000000, seevirt.c). So the space to store kernel binary is 1MB, which should be large enough to preventaarch64-a-b-kernel.Sfrom changing code.
No, it loads the kernel at 0x40000000 + 0x80000, see hw/arm/boot.c:load_aarch64_image() and KERNEL64_LOAD_ADDR.
Quoted 2 lines
Anyway I think we are fine to remove "-Ttext=40080000" here.
Fine by me, but you might want to add a comment saying the code *must* only compile to using pc-relative addresses.
Thanks,
drew
Quoted 187 lines · Andrew Jones
Quoted 174 lines · Wei Huang
Quoted 162 lines · Andrew Jones
Quoted 161 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 is0x40000000. We change thestart_addressandend_addressfor aarch64.In addition to providing the binary, this patch also includes the source code and the build script in tests/migration/. So users can change the source and/or re-compile the binary as they wish.
Signed-off-by Wei Huang <[email protected]>--- tests/Makefile.include | 1 + tests/migration-test.c | 47 +++++++++++++++++++++--- tests/migration/Makefile | 12 +++++- tests/migration/aarch64-a-b-kernel.S | 71 ++++++++++++++++++++++++++++++++++++ tests/migration/aarch64-a-b-kernel.h | 19 ++++++++++ tests/migration/migration-test.h | 5 +++ 6 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 tests/migration/aarch64-a-b-kernel.S create mode 100644 tests/migration/aarch64-a-b-kernel.htests/Makefile.include +1
-0@@ -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 +41
-6@@ -11,6 +11,7 @@*/ #include "qemu/osdep.h" +#include <sys/utsname.h> #include "libqtest.h" #include "qapi/qmp/qdict.h" @@ -23,8 +24,8 @@#include "migration/migration-test.h" -const unsigned start_address =TEST_MEM_START ; -const unsigned end_address =TEST_MEM_END ; +unsigned start_address =TEST_MEM_START ; +unsigned end_address =TEST_MEM_END ;bool got_stop;#if defined(__linux__)@@ -81,12 +82,13 @@ static const char *tmpfs;* outputting a 'B' every so often if 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); }@@ -393,7 +395,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"@@ -422,6 +424,39 @@ static void test_migrate_start(QTestState **from, QTestState **to," -serial file:%s/dest_serial" " -incoming %s" , accel, tmpfs, uri); + }else if (strcmp (arch,"aarch64" ) ==0 ) { +const char *cpu; +const char *gic_ver; +struct utsname utsname; + +/* kvm and tcg need different cpu and gic-version configs */ +if (access ("/dev/kvm" ,F_OK ) ==0 &&uname (&utsname) ==0 && +strcmp (utsname.machine,"aarch64" ) ==0 ) { + accel ="kvm" ; + cpu ="host" ; + gic_ver ="host" ; + }else { + accel ="tcg" ; + cpu ="cortex-a57" ; + gic_ver ="2" ; + } + +init_bootfile (bootpath, aarch64_kernel); + cmd_src =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmsource,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/src_serial " +"-kernel %s " , + accel, gic_ver, cpu, tmpfs, bootpath); + cmd_dst =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmdest,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/dest_serial " +"-kernel %s " +"-incoming %s " , + accel, gic_ver, cpu, tmpfs, bootpath, uri); + +/* aarch64 virt machine physical memory starts at 0x40000000 */ + start_address =ARM_TEST_MEM_START ; + end_address =ARM_TEST_MEM_END ; }else {g_assert_not_reached (); }@@ -506,7 +541,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 +2
-1@@ -15,6 +15,7 @@ cross-gcc = $(firstword $(wildcard $(patsubst %ld,%gcc,$(call cross-ld,$(1))))) find-cross-prefix = $(subst gcc,,$(notdir $(call cross-gcc,$(1)))) x86_64_cross_prefix := $(call find-cross-prefix,x86_64) +aarch64_cross_prefix := $(call find-cross-prefix,aarch64) export __note override define __note@@ -25,7 +26,7 @@ override define __note */ endef -all: x86-a-b-bootblock.h +all: x86-a-b-bootblock.h aarch64-a-b-kernel.h x86-a-b-bootblock.h: x86-a-b-bootblock.S $(x86_64_cross_prefix)gcc -m32 -march=i486 -c $< -o x86.o@@ -34,5 +35,12 @@ x86-a-b-bootblock.h: x86-a-b-bootblock.S echo "$$__note" > $@ xxd -i x86.bootsect | sed -e 's/.*int.*//' >> $@Quoted 8 lines
tests/migration/Makefile x86-a-b-bootblock.h: x86-a-b-bootblock.S · line 40
Quoted 3 lines
tests/migration/Makefile +3
-0+aarch64-a-b-kernel.h: aarch64-a-b-kernel.S + $(aarch64_cross_prefix)gcc -o aarch64.elf -nostdlib \ + -Wl,--build-id=none,-Ttext=40080000 $<Adding the arm64 Linux kernel offset here is a bit subtle. And, since the
TEST_MEM_STARTis at 1M, that only leaves 512K for test code and data. I think you may want to define this offset somewhere, making it less subtle, and then also factor it in when computing the test mem start.Quoted 3 lines
I have fixed most parts based on your review comments, except for this one. I think the section address, -Ttext=, doesn't matter in this case. Such info is not present aarch64.kernel; plus QEMU loads the kernel into
In this case it doesn't matter because your code only uses pc-relative addresses. It's pretty safe to assume the compiler will only emit pc- relative addresses for code like this, so that's probably fine.
Quoted 3 lines
the
loader_startaddress, which is the physical memory base (0x40000000, seevirt.c). So the space to store kernel binary is 1MB, which should be large enough to preventaarch64-a-b-kernel.Sfrom changing code.
Quoted 8 lines
No, it loads the kernel at
0x40000000+0x80000, see hw/arm/boot.c:load_aarch64_image() andKERNEL64_LOAD_ADDR.Quoted 2 lines
Anyway I think we are fine to remove "-Ttext=40080000" here.
Fine by me, but you might want to add a comment saying the code *must* only compile to using pc-relative addresses.
I think all ARM label-based branches are PC-relative (see
https://community.arm.com/processors/b/blog/posts/branch-and-call-sequences-explained).
So compilers aren't supposed to change this semantic. Anyway I just sent a new version. It adds comments about compiler requirements.
Quoted 4 lines
Thanks,
drew