mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 11:04:58 -06:00
tests/qtest: option to suspend during migration
Add an option to suspend the src in a-b-bootblock.S, which puts the guest in S3 state after one round of writing to memory. The option is enabled by poking a 1 into the suspend_me word in the boot block prior to starting the src vm. Generate symbol offsets in a-b-bootblock.h so that the suspend_me offset is known. Generate the bootblock for each test, because suspend_me may differ for each. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Acked-by: Peter Xu <peterx@redhat.com> Reviewed-by: Fabiano Rosas <farosas@suse.de> Link: https://lore.kernel.org/r/1704312341-66640-11-git-send-email-steven.sistare@oracle.com Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
parent
f0649758be
commit
5014478e0d
4 changed files with 77 additions and 16 deletions
|
@ -4,9 +4,10 @@
|
|||
.PHONY: all clean
|
||||
all: a-b-bootblock.h
|
||||
|
||||
a-b-bootblock.h: x86.bootsect
|
||||
a-b-bootblock.h: x86.bootsect x86.o
|
||||
echo "$$__note" > header.tmp
|
||||
xxd -i $< | sed -e 's/.*int.*//' >> header.tmp
|
||||
nm x86.o | awk '{print "#define SYM_"$$3" 0x"$$1}' >> header.tmp
|
||||
mv header.tmp $@
|
||||
|
||||
x86.bootsect: x86.boot
|
||||
|
@ -16,7 +17,7 @@ x86.boot: x86.o
|
|||
$(CROSS_PREFIX)objcopy -O binary $< $@
|
||||
|
||||
x86.o: a-b-bootblock.S
|
||||
$(CROSS_PREFIX)gcc -m32 -march=i486 -c $< -o $@
|
||||
$(CROSS_PREFIX)gcc -I.. -m32 -march=i486 -c $< -o $@
|
||||
|
||||
clean:
|
||||
@rm -rf *.boot *.o *.bootsect
|
||||
|
|
|
@ -9,6 +9,23 @@
|
|||
#
|
||||
# Author: dgilbert@redhat.com
|
||||
|
||||
#include "migration-test.h"
|
||||
|
||||
#define ACPI_ENABLE 0xf1
|
||||
#define ACPI_PORT_SMI_CMD 0xb2
|
||||
#define ACPI_PM_BASE 0x600
|
||||
#define PM1A_CNT_OFFSET 4
|
||||
|
||||
#define ACPI_SCI_ENABLE 0x0001
|
||||
#define ACPI_SLEEP_TYPE 0x0400
|
||||
#define ACPI_SLEEP_ENABLE 0x2000
|
||||
#define SLEEP (ACPI_SCI_ENABLE + ACPI_SLEEP_TYPE + ACPI_SLEEP_ENABLE)
|
||||
|
||||
#define LOW_ADDR X86_TEST_MEM_START
|
||||
#define HIGH_ADDR X86_TEST_MEM_END
|
||||
|
||||
/* Save the suspended status at an address that is not written in the loop. */
|
||||
#define suspended (X86_TEST_MEM_START + 4)
|
||||
|
||||
.code16
|
||||
.org 0x7c00
|
||||
|
@ -35,8 +52,8 @@ start: # at 0x7c00 ?
|
|||
mov %eax,%ds
|
||||
|
||||
# Start from 1MB
|
||||
.set TEST_MEM_START, (1024*1024)
|
||||
.set TEST_MEM_END, (100*1024*1024)
|
||||
.set TEST_MEM_START, X86_TEST_MEM_START
|
||||
.set TEST_MEM_END, X86_TEST_MEM_END
|
||||
|
||||
mov $65,%ax
|
||||
mov $0x3f8,%dx
|
||||
|
@ -69,7 +86,30 @@ innerloop:
|
|||
mov $0x3f8,%dx
|
||||
outb %al,%dx
|
||||
|
||||
jmp mainloop
|
||||
# should this test suspend?
|
||||
mov (suspend_me),%eax
|
||||
cmp $0,%eax
|
||||
je mainloop
|
||||
|
||||
# are we waking after suspend? do not suspend again.
|
||||
mov $suspended,%eax
|
||||
mov (%eax),%eax
|
||||
cmp $1,%eax
|
||||
je mainloop
|
||||
|
||||
# enable acpi
|
||||
mov $ACPI_ENABLE,%al
|
||||
outb %al,$ACPI_PORT_SMI_CMD
|
||||
|
||||
# suspend to ram
|
||||
mov $suspended,%eax
|
||||
movl $1,(%eax)
|
||||
mov $SLEEP,%ax
|
||||
mov $(ACPI_PM_BASE + PM1A_CNT_OFFSET),%dx
|
||||
outw %ax,%dx
|
||||
# not reached. The wakeup causes reset and restart at 0x7c00, and we
|
||||
# do not save and restore registers as a real kernel would do.
|
||||
|
||||
|
||||
# GDT magic from old (GPLv2) Grub startup.S
|
||||
.p2align 2 /* force 4-byte alignment */
|
||||
|
@ -95,6 +135,10 @@ gdtdesc:
|
|||
.word 0x27 /* limit */
|
||||
.long gdt /* addr */
|
||||
|
||||
/* test launcher can poke a 1 here to exercise suspend */
|
||||
suspend_me:
|
||||
.int 0
|
||||
|
||||
/* I'm a bootable disk */
|
||||
.org 0x7dfe
|
||||
.byte 0x55
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* the header and the assembler differences in your patch submission.
|
||||
*/
|
||||
unsigned char x86_bootsect[] = {
|
||||
0xfa, 0x0f, 0x01, 0x16, 0x8c, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
|
||||
0xfa, 0x0f, 0x01, 0x16, 0xb8, 0x7c, 0x66, 0xb8, 0x01, 0x00, 0x00, 0x00,
|
||||
0x0f, 0x22, 0xc0, 0x66, 0xea, 0x20, 0x7c, 0x00, 0x00, 0x08, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x92, 0x0c, 0x02,
|
||||
0xe6, 0x92, 0xb8, 0x10, 0x00, 0x00, 0x00, 0x8e, 0xd8, 0x66, 0xb8, 0x41,
|
||||
|
@ -13,13 +13,13 @@ unsigned char x86_bootsect[] = {
|
|||
0x40, 0x06, 0x7c, 0xf1, 0xb8, 0x00, 0x00, 0x10, 0x00, 0xfe, 0x00, 0x05,
|
||||
0x00, 0x10, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x40, 0x06, 0x7c, 0xf2, 0xfe,
|
||||
0xc3, 0x80, 0xe3, 0x3f, 0x75, 0xe6, 0x66, 0xb8, 0x42, 0x00, 0x66, 0xba,
|
||||
0xf8, 0x03, 0xee, 0xeb, 0xdb, 0x8d, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x9a, 0xcf, 0x00,
|
||||
0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0xcf, 0x00, 0x27, 0x00, 0x74, 0x7c,
|
||||
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,
|
||||
0xf8, 0x03, 0xee, 0xa1, 0xbe, 0x7c, 0x00, 0x00, 0x83, 0xf8, 0x00, 0x74,
|
||||
0xd3, 0xb8, 0x04, 0x00, 0x10, 0x00, 0x8b, 0x00, 0x83, 0xf8, 0x01, 0x74,
|
||||
0xc7, 0xb0, 0xf1, 0xe6, 0xb2, 0xb8, 0x04, 0x00, 0x10, 0x00, 0xc7, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x66, 0xb8, 0x01, 0x24, 0x66, 0xba, 0x04, 0x06,
|
||||
0x66, 0xef, 0x66, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0x00, 0x00, 0x00, 0x9a, 0xcf, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||
0x00, 0x92, 0xcf, 0x00, 0x27, 0x00, 0xa0, 0x7c, 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,
|
||||
|
@ -49,3 +49,13 @@ unsigned char x86_bootsect[] = {
|
|||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
|
||||
};
|
||||
|
||||
#define SYM_do_zero 0x00007c3d
|
||||
#define SYM_gdt 0x00007ca0
|
||||
#define SYM_gdtdesc 0x00007cb8
|
||||
#define SYM_innerloop 0x00007c51
|
||||
#define SYM_mainloop 0x00007c4c
|
||||
#define SYM_pre_zero 0x00007c38
|
||||
#define SYM_start 0x00007c00
|
||||
#define SYM_suspend_me 0x00007cbe
|
||||
#define SYM_TEST_MEM_END 0x06400000
|
||||
#define SYM_TEST_MEM_START 0x00100000
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue