tests: Add migration test for aarch64
v6 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.
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 | 70 ++++++++++++++------
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 | 27 ++++++++
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, 248 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
PATCH v6 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
@@ -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
@@ -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
PATCH v6 2/4 tests/migration: Convert the boot block compilation script into Makefile
In reply to Wei HuangThe 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
@@ -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
@@ -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
PATCH v6 3/4 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 | 28 +++++++++++-----------
tests/migration/Makefile | 4 ++--
tests/migration/migration-test.h | 18 ++++++++++++++
.../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++---
tests/migration/x86-a-b-bootblock.h | 2 +-
5 files changed, 39 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 +14 -14
@@ -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__)
@@ -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 );
tests/migration/Makefile +2 -2
@@ -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 +18 -0
@@ -0,0 +1,18 @@ +/* +* 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 V6 3/4] tests/migration: Add migration-test header file
Quoted 62 lines · * Wei Huang ([email protected]) wrote:
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]>Reviewed-by Andrew Jones <[email protected]>--- tests/migration-test.c | 28 +++++++++++----------- tests/migration/Makefile | 4 ++-- tests/migration/migration-test.h | 18 ++++++++++++++ .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--- tests/migration/x86-a-b-bootblock.h | 2 +- 5 files changed, 39 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 +7
-8@@ -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__)@@ -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
tests/migration-test.c static void wait_for_migration_pass(QTestState *who) · line 269
Quoted 10 lines
tests/migration-test.c +5
-5-* 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).
No, please don't modify the other architectures.
It's OK for you to get the start/end value from the define in the header but we can't assume they're movable; they're architecture specific values that are chosen to fit where we know we have RAM.
Dave
Quoted 96 lines
tests/migration-test.c +2
-1*/ 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 );tests/migration/Makefile +2
-2@@ -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 +18
-0@@ -0,0 +1,18 @@ +/* +* 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 %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
--
Dr. David Alan Gilbert / [email protected] / Manchester, UK
Re: [Qemu-devel] [PATCH V6 3/4] tests/migration: Add migration-test header file
Quoted 76 lines · Dr. David Alan Gilbert
Quoted 62 lines · * Wei Huang ([email protected]) wrote:
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]>Reviewed-by Andrew Jones <[email protected]>--- tests/migration-test.c | 28 +++++++++++----------- tests/migration/Makefile | 4 ++-- tests/migration/migration-test.h | 18 ++++++++++++++ .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--- tests/migration/x86-a-b-bootblock.h | 2 +- 5 files changed, 39 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 +7
-8@@ -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__)@@ -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 tests/migration-test.c static void wait_for_migration_pass(QTestState *who) · line 269
Quoted 10 lines
tests/migration-test.c +5
-5-* 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). No, please don't modify the other architectures.
Quoted 3 lines
It's OK for you to get the start/end value from the define in the header but we can't assume they're movable; they're architecture specific values that are chosen to fit where we know we have RAM.
Drew didn't like the idea of having #define TEST_MEM_START/TEST_MEM_END in headerfile, and in the meanwhile, we still use 1MB/100MB in comments. Anyway we didn't modify the underneath semantic for other architectures.
Quoted 102 lines
Dave
Quoted 96 lines
tests/migration-test.c +2
-1*/ 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 );tests/migration/Makefile +2
-2@@ -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 +18
-0@@ -0,0 +1,18 @@ +/* +* 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 %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--
Dr. David Alan Gilbert / [email protected] / Manchester, UK
Re: [Qemu-devel] [PATCH V6 3/4] tests/migration: Add migration-test header file
Quoted 79 lines · * Wei Huang ([email protected]) wrote:
Quoted 76 lines · Dr. David Alan Gilbert
Quoted 62 lines · * Wei Huang ([email protected]) wrote:
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]>Reviewed-by Andrew Jones <[email protected]>--- tests/migration-test.c | 28 +++++++++++----------- tests/migration/Makefile | 4 ++-- tests/migration/migration-test.h | 18 ++++++++++++++ .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--- tests/migration/x86-a-b-bootblock.h | 2 +- 5 files changed, 39 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 +7
-8@@ -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__)@@ -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 tests/migration-test.c static void wait_for_migration_pass(QTestState *who) · line 269
Quoted 10 lines
tests/migration-test.c +5
-5-* 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). No, please don't modify the other architectures.
Quoted 7 lines
Quoted 3 lines
It's OK for you to get the start/end value from the define in the header but we can't assume they're movable; they're architecture specific values that are chosen to fit where we know we have RAM.
Drew didn't like the idea of having #define TEST_MEM_START/TEST_MEM_END in headerfile, and in the meanwhile, we still use 1MB/100MB in comments. Anyway we didn't modify the underneath semantic for other architectures.
The problem is you have to be VERY careful; because while it might make sense to move the start for one architecture it might break on another.
Dave
Quoted 94 lines
Quoted 94 lines
Dave
Quoted 91 lines
tests/migration-test.c +2
-1*/ 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 );tests/migration/Makefile +2
-2@@ -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 +18
-0@@ -0,0 +1,18 @@ +/* +* 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 %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,
Quoted 8 lines
Quoted 8 lines
Quoted 5 lines
tests/migration/x86-a-b-bootblock.h +0
-0* and then remember to send both in your patch submission. */ Signature · 1 line
2.14.3--
Dr. David Alan Gilbert / [email protected] / Manchester, UK
--
Dr. David Alan Gilbert / [email protected] / Manchester, UK
Re: [Qemu-devel] [PATCH V6 3/4] tests/migration: Add migration-test header file
Quoted 84 lines · Dr. David Alan Gilbert
Quoted 83 lines · * Wei Huang ([email protected]) wrote:
Quoted 79 lines · Dr. David Alan Gilbert
Quoted 62 lines · * Wei Huang ([email protected]) wrote:
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]>Reviewed-by Andrew Jones <[email protected]>--- tests/migration-test.c | 28 +++++++++++----------- tests/migration/Makefile | 4 ++-- tests/migration/migration-test.h | 18 ++++++++++++++ .../{x86-a-b-bootblock.s => x86-a-b-bootblock.S} | 7 +++--- tests/migration/x86-a-b-bootblock.h | 2 +- 5 files changed, 39 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 +7
-8@@ -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__)@@ -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 tests/migration-test.c static void wait_for_migration_pass(QTestState *who) · line 269
Quoted 10 lines
tests/migration-test.c +5
-5-* 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). No, please don't modify the other architectures.
It's OK for you to get the start/end value from the define in the header but we can't assume they're movable; they're architecture specific values that are chosen to fit where we know we have RAM.
Quoted 6 lines
Quoted 3 lines
Drew didn't like the idea of having #define TEST_MEM_START/TEST_MEM_END in headerfile, and in the meanwhile, we still use 1MB/100MB in comments. Anyway we didn't modify the underneath semantic for other architectures.
The problem is you have to be VERY careful; because while it might make sense to move the start for one architecture it might break on another.
We should make the addreses explicitly arch-specific. In the header create arch-specific defines like below. In the code don't initialize start/end_address to anything. Instead only set them to their arch- specific defines in their arch-specific blocks of test_migrate_start().
#define X86_TEST_MEM_START (1024*1024)
#define X86_TEST_MEM_END (100*1024*1024)
#define ARM_TEST_MEM_START (0x40000000 + 1024*1024)
#define ARM_TEST_MEM_END (0x40000000 + 100*1024*1024)
Thanks,
drew
Quoted 108 lines
Dave
Quoted 94 lines
Quoted 94 lines
Dave
Quoted 91 lines
tests/migration-test.c +2
-1*/ 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 );tests/migration/Makefile +2
-2@@ -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 +18
-0@@ -0,0 +1,18 @@ +/* +* 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 %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, Quoted 8 lines
Quoted 8 lines
Quoted 5 lines
tests/migration/x86-a-b-bootblock.h +0
-0* and then remember to send both in your patch submission. */ Signature · 1 line
2.14.3--
Dr. David Alan Gilbert / [email protected] / Manchester, UK--
Dr. David Alan Gilbert / [email protected] / Manchester, UK
PATCH v6 4/4 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 | 46 +++++++++++++++++++--- 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(+), 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 +40 -6
86 lines not on this page · raw message
tests/migration/Makefile +10 -2
@@ -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
@@ -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
@@ -15,4 +15,13 @@/* PPC */ #define MIN_NVRAM_SIZE 8192/* from spapr_nvram.c */ +/* AArch64 */ +#define ARM_MACH_VIRT_UART 0x09000000 +/* AArch64 kernel load address is 0x40080000. It should be safe to start the +* test memory at 0x40000000 + TEST_MEM_START, which literally creates a 512KB +* space to host the kernel binary. +*/ +#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 113 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 | 46 +++++++++++++++++++--- 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(+), 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 +29
-5@@ -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;* 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"@@ -421,6 +423,38 @@ 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 ",
tests/migration-test.c static void test_migrate_start(QTestState **from, QTestState **to, · line 457
Quoted 10 lines
tests/migration-test.c +10
-0+ accel, gic_ver, cpu, tmpfs, bootpath); + cmd_dst =g_strdup_printf ("-machine virt,accel=%s,gic-version=%s " +"-name vmdest,debug-threads=on -cpu %s " +"-m 150M -serial file:%s/dest_serial " +"-kernel %s " +"-incoming %s " , + accel, gic_ver, cpu, tmpfs, bootpath, uri); + + start_address =ARM_TEST_MEM_START ; + end_address =ARM_TEST_MEM_END ;
How about enforcing the kernel size requirement?
g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
Quoted 158 lines
tests/migration-test.c +1
-1}else {g_assert_not_reached (); }@@ -505,7 +539,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@@ -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 *.kerneltests/migration/aarch64-a-b-kernel.S new file +75
-0@@ -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 mainlooptests/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 ,0x17 +}; +tests/migration/migration-test.h +0
-0
tests/migration/migration-test.h line 23
Quoted 9 lines
tests/migration/migration-test.h +6
-0@@ -15,4 +15,13 @@/* PPC */ #define MIN_NVRAM_SIZE 8192/* from spapr_nvram.c */ +/* AArch64 */ +#define ARM_MACH_VIRT_UART 0x09000000 +/* AArch64 kernel load address is 0x40080000. It should be safe to start the +* test memory at 0x40000000 + TEST_MEM_START, which literally creates a 512KB +* space to host the kernel binary. +*/
I'd maybe change the wording and provide a define needed for enforcing the kernel size requirement:
/* The AArch64 kernel load address is the RAM base address (0x40000000)
* plus the arm64 kernel load offset (0x80000). Starting the test memory
* at the 1M offset, like x86 does, gives the kernel 512K of space. */
#define ARM_TEST_MAX_KERNEL_SIZE (512*1024)
Quoted 8 lines
tests/migration/migration-test.h +3
-0+#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
Otherwise