Commit c02b3781 authored by Wei Huang's avatar Wei Huang Committed by Dr. David Alan Gilbert
Browse files

tests: Add migration test for aarch64



This patch adds migration test support for aarch64. The test code, which
implements the same functionality as x86, is booted as a kernel in qemu.
Here are the design choices we make for aarch64:

 * We choose this -kernel approach because aarch64 QEMU doesn't provide a
   built-in fw like x86 does. So instead of relying on a boot loader, we
   use -kernel approach for aarch64.
 * The serial output is sent to PL011 directly.
 * The physical memory base for mach-virt machine is 0x40000000. We change
   the start_address and end_address for aarch64.

In addition to providing the binary, this patch also includes the source
code and the build script in tests/migration/aarch64. So users can change
the source and/or re-compile the binary as they wish.

Reviewed-by: default avatarJuan Quintela <quintela@redhat.com>
Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: default avatarWei Huang <wei@redhat.com>
Message-Id: <1538669326-28135-1-git-send-email-wei@redhat.com>
Signed-off-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
parent 75e50c80
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -402,6 +402,7 @@ check-qtest-arm-y += tests/hexloader-test$(EXESUF)
check-qtest-aarch64-y = tests/numa-test$(EXESUF)
check-qtest-aarch64-$(CONFIG_SDHCI) += tests/sdhci-test$(EXESUF)
check-qtest-aarch64-y += tests/boot-serial-test$(EXESUF)
check-qtest-aarch64-y += tests/migration-test$(EXESUF)

check-qtest-microblazeel-y = $(check-qtest-microblaze-y)

+23 −4
Original line number Diff line number Diff line
@@ -86,12 +86,13 @@ static const char *tmpfs;
 * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
 */
#include "tests/migration/i386/a-b-bootblock.h"
#include "tests/migration/aarch64/a-b-kernel.h"

static void init_bootfile_x86(const char *bootpath)
static void init_bootfile(const char *bootpath, void *content)
{
    FILE *bootfile = fopen(bootpath, "wb");

    g_assert_cmpint(fwrite(x86_bootsect, 512, 1, bootfile), ==, 1);
    g_assert_cmpint(fwrite(content, 512, 1, bootfile), ==, 1);
    fclose(bootfile);
}

@@ -428,7 +429,7 @@ static int test_migrate_start(QTestState **from, QTestState **to,
    got_stop = false;

    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
        init_bootfile_x86(bootpath);
        init_bootfile(bootpath, x86_bootsect);
        cmd_src = g_strdup_printf("-machine accel=%s -m 150M"
                                  " -name source,debug-threads=on"
                                  " -serial file:%s/src_serial"
@@ -459,6 +460,24 @@ static int test_migrate_start(QTestState **from, QTestState **to,

        start_address = PPC_TEST_MEM_START;
        end_address = PPC_TEST_MEM_END;
    } else if (strcmp(arch, "aarch64") == 0) {
        init_bootfile(bootpath, aarch64_kernel);
        cmd_src = g_strdup_printf("-machine virt,accel=%s,gic-version=max "
                                  "-name vmsource,debug-threads=on -cpu max "
                                  "-m 150M -serial file:%s/src_serial "
                                  "-kernel %s ",
                                  accel, tmpfs, bootpath);
        cmd_dst = g_strdup_printf("-machine virt,accel=%s,gic-version=max "
                                  "-name vmdest,debug-threads=on -cpu max "
                                  "-m 150M -serial file:%s/dest_serial "
                                  "-kernel %s "
                                  "-incoming %s ",
                                  accel, tmpfs, bootpath, uri);

        start_address = ARM_TEST_MEM_START;
        end_address = ARM_TEST_MEM_END;

        g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
    } else {
        g_assert_not_reached();
    }
@@ -545,7 +564,7 @@ static void test_deprecated(void)
{
    QTestState *from;

    from = qtest_start("");
    from = qtest_start("-machine none");

    deprecated_set_downtime(from, 0.12345);
    deprecated_set_speed(from, 12345);
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
# See the COPYING file in the top-level directory.
#

TARGET_LIST = i386
TARGET_LIST = i386 aarch64

SRC_PATH = ../..

+18 −0
Original line number Diff line number Diff line
# To specify cross compiler prefix, use CROSS_PREFIX=
#   $ make CROSS_PREFIX=aarch64-linux-gnu-

.PHONY: all clean
all: a-b-kernel.h

a-b-kernel.h: aarch64.kernel
	echo "$$__note" > $@
	xxd -i $< | sed -e 's/.*int.*//' >> $@

aarch64.kernel: aarch64.elf
	$(CROSS_PREFIX)objcopy -O binary $< $@

aarch64.elf: a-b-kernel.S
	$(CROSS_PREFIX)gcc -o $@ -nostdlib -Wl,--build-id=none $<

clean:
	$(RM) *.kernel *.elf
+75 −0
Original line number Diff line number Diff line
#
# Copyright (c) 2018 Red Hat, Inc. and/or its affiliates
#
# Author:
#   Wei Huang <wei@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.
#
# Note: Please make sure the compiler compiles the assembly code below with
# pc-relative address. Also the branch instructions should use relative
# addresses only.

#include "../migration-test.h"

.section .text

        .globl  _start

_start:
        /* disable MMU to use phys mem address */
        mrs     x0, sctlr_el1
        bic     x0, x0, #(1<<0)
        msr     sctlr_el1, x0
        isb

        /* traverse test memory region */
        mov     x0, #ARM_TEST_MEM_START
        mov     x1, #ARM_TEST_MEM_END

        /* output char 'A' to PL011 */
        mov     w3, 'A'
        mov     x2, #ARM_MACH_VIRT_UART
        strb    w3, [x2]

        /* clean up memory */
        mov     w3, #0
        mov     x4, x0
clean:
        strb    w3, [x4]
        add     x4, x4, #TEST_MEM_PAGE_SIZE
        cmp     x4, x1
        ble     clean

        /* w5 keeps a counter so we can limit the output speed */
        mov     w5, #0

        /* main body */
mainloop:
        mov     x4, x0

innerloop:
        /* increment the first byte of each page by 1 */
        ldrb    w3, [x4]
        add     w3, w3, #1
        and     w3, w3, #0xff
        strb    w3, [x4]

        /* make sure QEMU user space can see consistent data as MMU is off */
        dc      civac, x4

        add     x4, x4, #TEST_MEM_PAGE_SIZE
        cmp     x4, x1
        blt     innerloop

        add     w5, w5, #1
        and     w5, w5, #0xff
        cmp     w5, #0
        bne     mainloop

        /* output char 'B' to PL011 */
        mov     w3, 'B'
        strb    w3, [x2]

        b       mainloop
Loading