mirror of https://github.com/xemu-project/xemu.git
tests/qtest/migration-test: Use custom asm bios for ppc64
Similar to other archs, build a custom bios memory updater. Running the test with OF code is a cool trick, but SLOF takes a long time to boot. This reduces test time by around 3x (150s to 50s). Reviewed-by: Fabiano Rosas <farosas@suse.de> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
parent
bd1dcd86a0
commit
34cc54fb35
|
@ -5,7 +5,7 @@
|
|||
# See the COPYING file in the top-level directory.
|
||||
#
|
||||
|
||||
TARGET_LIST = i386 aarch64 s390x
|
||||
TARGET_LIST = i386 aarch64 s390x ppc64
|
||||
|
||||
SRC_PATH = ../..
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
/* PPC */
|
||||
#define PPC_TEST_MEM_START (1 * 1024 * 1024)
|
||||
#define PPC_TEST_MEM_END (100 * 1024 * 1024)
|
||||
#define PPC_H_PUT_TERM_CHAR 0x58
|
||||
|
||||
/* ARM */
|
||||
#define ARM_TEST_MEM_START (0x40000000 + 1 * 1024 * 1024)
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
.PHONY: all clean
|
||||
all: a-b-kernel.h
|
||||
|
||||
a-b-kernel.h: ppc64.kernel
|
||||
echo "$$__note" > $@
|
||||
xxd -i $< | sed -e 's/.*int.*//' >> $@
|
||||
|
||||
ppc64.kernel: ppc64.elf
|
||||
$(CROSS_PREFIX)objcopy -O binary -S $< $@
|
||||
|
||||
ppc64.elf: a-b-kernel.S
|
||||
$(CROSS_PREFIX)gcc -static -o $@ -nostdlib -Wl,--build-id=none $<
|
||||
|
||||
clean:
|
||||
$(RM) *.kernel *.elf
|
|
@ -0,0 +1,66 @@
|
|||
#
|
||||
# Copyright (c) 2024 IBM, Inc
|
||||
#
|
||||
# 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
|
||||
|
||||
.macro print ch
|
||||
li %r3,PPC_H_PUT_TERM_CHAR
|
||||
li %r4,0
|
||||
li %r5,1
|
||||
li %r6,\ch
|
||||
sldi %r6,%r6,56
|
||||
sc 1
|
||||
.endm
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
. = 0x100
|
||||
/*
|
||||
* Enter 64-bit mode. Not necessary because the test uses 32-bit
|
||||
* addresses, but those constants could easily be changed and break
|
||||
* in 32-bit mode.
|
||||
*/
|
||||
mfmsr %r9
|
||||
li %r10,-1
|
||||
rldimi %r9,%r10,63,0
|
||||
mtmsrd %r9
|
||||
|
||||
/*
|
||||
* Set up test memory region. Non-volatiles are used because the
|
||||
* hcall can clobber regs.
|
||||
* r20 - start address
|
||||
* r21 - number of pages
|
||||
*/
|
||||
lis %r20,PPC_TEST_MEM_START@h
|
||||
ori %r20,%r20,PPC_TEST_MEM_START@l
|
||||
lis %r9,PPC_TEST_MEM_END@h
|
||||
ori %r9,%r9,PPC_TEST_MEM_END@l
|
||||
subf %r21,%r20,%r9
|
||||
li %r10,TEST_MEM_PAGE_SIZE
|
||||
divd %r21,%r21,%r10
|
||||
|
||||
print 'A'
|
||||
|
||||
li %r3,0
|
||||
mr %r9,%r20
|
||||
mtctr %r21
|
||||
1: stb %r3,0(%r9)
|
||||
addi %r9,%r9,TEST_MEM_PAGE_SIZE
|
||||
bdnz 1b
|
||||
|
||||
loop:
|
||||
mr %r9,%r20
|
||||
mtctr %r21
|
||||
1: lbz %r3,0(%r9)
|
||||
addi %r3,%r3,1
|
||||
stb %r3,0(%r9)
|
||||
addi %r9,%r9,TEST_MEM_PAGE_SIZE
|
||||
bdnz 1b
|
||||
|
||||
print 'B'
|
||||
b loop
|
|
@ -0,0 +1,42 @@
|
|||
/* This file is automatically generated from the assembly file in
|
||||
* tests/migration/ppc64. Edit that file and then run "make all"
|
||||
* inside tests/migration to update, and then remember to send both
|
||||
* the header and the assembler differences in your patch submission.
|
||||
*/
|
||||
unsigned char ppc64_kernel[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x7d, 0x20, 0x00, 0xa6, 0x39, 0x40, 0xff, 0xff,
|
||||
0x79, 0x49, 0xf8, 0x0e, 0x7d, 0x20, 0x01, 0x64, 0x3e, 0x80, 0x00, 0x10,
|
||||
0x62, 0x94, 0x00, 0x00, 0x3d, 0x20, 0x06, 0x40, 0x61, 0x29, 0x00, 0x00,
|
||||
0x7e, 0xb4, 0x48, 0x50, 0x39, 0x40, 0x10, 0x00, 0x7e, 0xb5, 0x53, 0xd2,
|
||||
0x38, 0x60, 0x00, 0x58, 0x38, 0x80, 0x00, 0x00, 0x38, 0xa0, 0x00, 0x01,
|
||||
0x38, 0xc0, 0x00, 0x41, 0x78, 0xc6, 0xc1, 0xc6, 0x44, 0x00, 0x00, 0x22,
|
||||
0x38, 0x60, 0x00, 0x00, 0x7e, 0x89, 0xa3, 0x78, 0x7e, 0xa9, 0x03, 0xa6,
|
||||
0x98, 0x69, 0x00, 0x00, 0x39, 0x29, 0x10, 0x00, 0x42, 0x00, 0xff, 0xf8,
|
||||
0x7e, 0x89, 0xa3, 0x78, 0x7e, 0xa9, 0x03, 0xa6, 0x88, 0x69, 0x00, 0x00,
|
||||
0x38, 0x63, 0x00, 0x01, 0x98, 0x69, 0x00, 0x00, 0x39, 0x29, 0x10, 0x00,
|
||||
0x42, 0x00, 0xff, 0xf0, 0x38, 0x60, 0x00, 0x58, 0x38, 0x80, 0x00, 0x00,
|
||||
0x38, 0xa0, 0x00, 0x01, 0x38, 0xc0, 0x00, 0x42, 0x78, 0xc6, 0xc1, 0xc6,
|
||||
0x44, 0x00, 0x00, 0x22, 0x4b, 0xff, 0xff, 0xcc
|
||||
};
|
||||
|
|
@ -128,6 +128,7 @@ static char *bootpath;
|
|||
*/
|
||||
#include "tests/migration/i386/a-b-bootblock.h"
|
||||
#include "tests/migration/aarch64/a-b-kernel.h"
|
||||
#include "tests/migration/ppc64/a-b-kernel.h"
|
||||
#include "tests/migration/s390x/a-b-bios.h"
|
||||
|
||||
static void bootfile_create(char *dir, bool suspend_me)
|
||||
|
@ -147,10 +148,8 @@ static void bootfile_create(char *dir, bool suspend_me)
|
|||
content = s390x_elf;
|
||||
len = sizeof(s390x_elf);
|
||||
} else if (strcmp(arch, "ppc64") == 0) {
|
||||
/*
|
||||
* sane architectures can be programmed at the boot prompt
|
||||
*/
|
||||
return;
|
||||
content = ppc64_kernel;
|
||||
len = sizeof(ppc64_kernel);
|
||||
} else if (strcmp(arch, "aarch64") == 0) {
|
||||
content = aarch64_kernel;
|
||||
len = sizeof(aarch64_kernel);
|
||||
|
@ -181,29 +180,10 @@ static void wait_for_serial(const char *side)
|
|||
{
|
||||
g_autofree char *serialpath = g_strdup_printf("%s/%s", tmpfs, side);
|
||||
FILE *serialfile = fopen(serialpath, "r");
|
||||
const char *arch = qtest_get_arch();
|
||||
int started = (strcmp(side, "src_serial") == 0 &&
|
||||
strcmp(arch, "ppc64") == 0) ? 0 : 1;
|
||||
|
||||
do {
|
||||
int readvalue = fgetc(serialfile);
|
||||
|
||||
if (!started) {
|
||||
/* SLOF prints its banner before starting test,
|
||||
* to ignore it, mark the start of the test with '_',
|
||||
* ignore all characters until this marker
|
||||
*/
|
||||
switch (readvalue) {
|
||||
case '_':
|
||||
started = 1;
|
||||
break;
|
||||
case EOF:
|
||||
fseek(serialfile, 0, SEEK_SET);
|
||||
usleep(1000);
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
switch (readvalue) {
|
||||
case 'A':
|
||||
/* Fine */
|
||||
|
@ -215,8 +195,6 @@ static void wait_for_serial(const char *side)
|
|||
return;
|
||||
|
||||
case EOF:
|
||||
started = (strcmp(side, "src_serial") == 0 &&
|
||||
strcmp(arch, "ppc64") == 0) ? 0 : 1;
|
||||
fseek(serialfile, 0, SEEK_SET);
|
||||
usleep(1000);
|
||||
break;
|
||||
|
@ -737,14 +715,11 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
|||
memory_size = "256M";
|
||||
start_address = PPC_TEST_MEM_START;
|
||||
end_address = PPC_TEST_MEM_END;
|
||||
arch_source = g_strdup_printf("-prom-env 'use-nvramrc?=true' -prom-env "
|
||||
"'nvramrc=hex .\" _\" begin %x %x "
|
||||
"do i c@ 1 + i c! 1000 +loop .\" B\" 0 "
|
||||
"until'", end_address, start_address);
|
||||
machine_alias = "pseries";
|
||||
machine_opts = "vsmt=8";
|
||||
arch_opts = g_strdup("-nodefaults "
|
||||
"-machine " PSERIES_DEFAULT_CAPABILITIES);
|
||||
arch_opts = g_strdup_printf(
|
||||
"-nodefaults -machine " PSERIES_DEFAULT_CAPABILITIES " "
|
||||
"-bios %s", bootpath);
|
||||
} else if (strcmp(arch, "aarch64") == 0) {
|
||||
memory_size = "150M";
|
||||
machine_alias = "virt";
|
||||
|
|
Loading…
Reference in New Issue