mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 02:24:58 -06:00
Migration pull 20180214
Note that the 'Add test for migration to bad destination' displays a 'Connection refused' during running, but still gives the correct exit code and OK (It's checking that the source doesn't fail when it can't connect, so that's the right error). If it's particularly disliked that patch can be skipped individually. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJahFawAAoJEAUWMx68W/3nwE4P/ih+c4uIG6rmwmQzfrKz7usM 6yI9doyejn8uslIQAsU+me8LTGzGI8EeevAOONGO7atySIc2BzujVBxwZIRr70rj zJpv3dbU/kLPJC40sZixJ8lvaGQ0iGe9WAGxoOf523ezBzr0ir/Ha1W270ZxgGgw /1MFY45krye/wc+D/TdH3qjh3fkdcbbOMEcTaVJLaM2eKHfSnpQdrx7iE3Z9KZ/G /hgXiIzz8mZsFJTRtwjV1701fj0wKVDUAqgpsY8lmOxRMmFYuZmFKk1D+ppFXaov 3dcrnP5gaX+42lQPKN5uVLH9pix3Q6AqcFRgSHRECugqFBlhckG2ZevatQIynCDB t9kV3fG5oAbfWUASayOhH2u4RUNGo9Hp1HPx7SPRSAhhpH1/p4vUfJKOn84e+jc2 5r4Vyuit9BLwvHtt1awnVJZYVIJ/S/178/bSw//zHDQqKA1YakSmGkAWy5IT6LgF 0eGGHmzxpFE4jMI7biM8OiSd0/SjU/ijV5sSAUyJM36d+ZuzsYf7myI17JQUoPmr /K1ld8y48MAY4K4M0wVBr8pcDY4eUw6XwWTX4FMPwYwdzdGbPNet+aR+VwCieoJU 85e2gP8celL1xQz1bb9q43vV2gqkoAiw8tyUkuXvpPwRSa5foMOrteTr5V7MP660 10Qg5Vp69SvnU7ggQCX+ =drNV -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20180214a' into staging Migration pull 20180214 Note that the 'Add test for migration to bad destination' displays a 'Connection refused' during running, but still gives the correct exit code and OK (It's checking that the source doesn't fail when it can't connect, so that's the right error). If it's particularly disliked that patch can be skipped individually. # gpg: Signature made Wed 14 Feb 2018 15:33:04 GMT # gpg: using RSA key 0516331EBC5BFDE7 # gpg: Good signature from "Dr. David Alan Gilbert (RH2) <dgilbert@redhat.com>" # Primary key fingerprint: 45F5 C71B 4A0C B7FB 977A 9FA9 0516 331E BC5B FDE7 * remotes/dgilbert/tags/pull-migration-20180214a: migration: pass MigrationState to migrate_init() migration: allow send_rq to fail migration: provide postcopy_fault_thread_notify() migration: reuse mis->userfault_quit_fd migration: better error handling with QEMUFile tests/migration: Add test for migration to bad destination migration: Fix early failure cleanup tests/migration: Add source to PC boot block migration: improve documentation of postcopy-ram migration/xen: Check return value of qemu_fclose Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
648ba91596
13 changed files with 388 additions and 122 deletions
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* QTest testcase for migration
|
||||
*
|
||||
* Copyright (c) 2016 Red Hat, Inc. and/or its affiliates
|
||||
* Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
|
||||
* based on the vhost-user-test.c that is:
|
||||
* Copyright (c) 2014 Virtual Open Systems Sarl.
|
||||
*
|
||||
|
@ -78,59 +78,15 @@ static bool ufd_version_check(void)
|
|||
static const char *tmpfs;
|
||||
|
||||
/* A simple PC boot sector that modifies memory (1-100MB) quickly
|
||||
* outputing a 'B' every so often if it's still running.
|
||||
* outputting a 'B' every so often if it's still running.
|
||||
*/
|
||||
unsigned char bootsect[] = {
|
||||
0xfa, 0x0f, 0x01, 0x16, 0x74, 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,
|
||||
0x00, 0x66, 0xba, 0xf8, 0x03, 0xee, 0xb3, 0x00, 0xb8, 0x00, 0x00, 0x10,
|
||||
0x00, 0xfe, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x40,
|
||||
0x06, 0x7c, 0xf2, 0xfe, 0xc3, 0x75, 0xe9, 0x66, 0xb8, 0x42, 0x00, 0x66,
|
||||
0xba, 0xf8, 0x03, 0xee, 0xeb, 0xde, 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, 0x5c, 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,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
|
||||
};
|
||||
#include "tests/migration/x86-a-b-bootblock.h"
|
||||
|
||||
static void init_bootfile_x86(const char *bootpath)
|
||||
{
|
||||
FILE *bootfile = fopen(bootpath, "wb");
|
||||
|
||||
g_assert_cmpint(fwrite(bootsect, 512, 1, bootfile), ==, 1);
|
||||
g_assert_cmpint(fwrite(x86_bootsect, 512, 1, bootfile), ==, 1);
|
||||
fclose(bootfile);
|
||||
}
|
||||
|
||||
|
@ -478,28 +434,31 @@ static void test_migrate_start(QTestState **from, QTestState **to,
|
|||
g_free(cmd_dst);
|
||||
}
|
||||
|
||||
static void test_migrate_end(QTestState *from, QTestState *to)
|
||||
static void test_migrate_end(QTestState *from, QTestState *to, bool test_dest)
|
||||
{
|
||||
unsigned char dest_byte_a, dest_byte_b, dest_byte_c, dest_byte_d;
|
||||
|
||||
qtest_quit(from);
|
||||
|
||||
qtest_memread(to, start_address, &dest_byte_a, 1);
|
||||
if (test_dest) {
|
||||
qtest_memread(to, start_address, &dest_byte_a, 1);
|
||||
|
||||
/* Destination still running, wait for a byte to change */
|
||||
do {
|
||||
qtest_memread(to, start_address, &dest_byte_b, 1);
|
||||
usleep(1000 * 10);
|
||||
} while (dest_byte_a == dest_byte_b);
|
||||
/* Destination still running, wait for a byte to change */
|
||||
do {
|
||||
qtest_memread(to, start_address, &dest_byte_b, 1);
|
||||
usleep(1000 * 10);
|
||||
} while (dest_byte_a == dest_byte_b);
|
||||
|
||||
qtest_qmp_discard_response(to, "{ 'execute' : 'stop'}");
|
||||
/* With it stopped, check nothing changes */
|
||||
qtest_memread(to, start_address, &dest_byte_c, 1);
|
||||
usleep(1000 * 200);
|
||||
qtest_memread(to, start_address, &dest_byte_d, 1);
|
||||
g_assert_cmpint(dest_byte_c, ==, dest_byte_d);
|
||||
qtest_qmp_discard_response(to, "{ 'execute' : 'stop'}");
|
||||
|
||||
check_guests_ram(to);
|
||||
/* With it stopped, check nothing changes */
|
||||
qtest_memread(to, start_address, &dest_byte_c, 1);
|
||||
usleep(1000 * 200);
|
||||
qtest_memread(to, start_address, &dest_byte_d, 1);
|
||||
g_assert_cmpint(dest_byte_c, ==, dest_byte_d);
|
||||
|
||||
check_guests_ram(to);
|
||||
}
|
||||
|
||||
qtest_quit(to);
|
||||
|
||||
|
@ -591,7 +550,38 @@ static void test_migrate(void)
|
|||
|
||||
g_free(uri);
|
||||
|
||||
test_migrate_end(from, to);
|
||||
test_migrate_end(from, to, true);
|
||||
}
|
||||
|
||||
static void test_baddest(void)
|
||||
{
|
||||
QTestState *from, *to;
|
||||
QDict *rsp, *rsp_return;
|
||||
const char *status;
|
||||
bool failed;
|
||||
|
||||
test_migrate_start(&from, &to, "tcp:0:0");
|
||||
migrate(from, "tcp:0:0");
|
||||
do {
|
||||
rsp = wait_command(from, "{ 'execute': 'query-migrate' }");
|
||||
rsp_return = qdict_get_qdict(rsp, "return");
|
||||
|
||||
status = qdict_get_str(rsp_return, "status");
|
||||
|
||||
g_assert(!strcmp(status, "setup") || !(strcmp(status, "failed")));
|
||||
failed = !strcmp(status, "failed");
|
||||
QDECREF(rsp);
|
||||
} while (!failed);
|
||||
|
||||
/* Is the machine currently running? */
|
||||
rsp = wait_command(from, "{ 'execute': 'query-status' }");
|
||||
g_assert(qdict_haskey(rsp, "return"));
|
||||
rsp_return = qdict_get_qdict(rsp, "return");
|
||||
g_assert(qdict_haskey(rsp_return, "running"));
|
||||
g_assert(qdict_get_bool(rsp_return, "running"));
|
||||
QDECREF(rsp);
|
||||
|
||||
test_migrate_end(from, to, false);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
|
@ -615,6 +605,7 @@ int main(int argc, char **argv)
|
|||
|
||||
qtest_add_func("/migration/postcopy/unix", test_migrate);
|
||||
qtest_add_func("/migration/deprecated", test_deprecated);
|
||||
qtest_add_func("/migration/bad_dest", test_baddest);
|
||||
|
||||
ret = g_test_run();
|
||||
|
||||
|
|
33
tests/migration/rebuild-x86-bootblock.sh
Executable file
33
tests/migration/rebuild-x86-bootblock.sh
Executable file
|
@ -0,0 +1,33 @@
|
|||
#!/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: dgilbert@redhat.com
|
||||
|
||||
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"
|
51
tests/migration/x86-a-b-bootblock.h
Normal file
51
tests/migration/x86-a-b-bootblock.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/* 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.
|
||||
*/
|
||||
unsigned char x86_bootsect[] = {
|
||||
0xfa, 0x0f, 0x01, 0x16, 0x74, 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,
|
||||
0x00, 0x66, 0xba, 0xf8, 0x03, 0xee, 0xb3, 0x00, 0xb8, 0x00, 0x00, 0x10,
|
||||
0x00, 0xfe, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x40,
|
||||
0x06, 0x7c, 0xf2, 0xfe, 0xc3, 0x75, 0xe9, 0x66, 0xb8, 0x42, 0x00, 0x66,
|
||||
0xba, 0xf8, 0x03, 0xee, 0xeb, 0xde, 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, 0x5c, 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,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
|
||||
};
|
||||
|
92
tests/migration/x86-a-b-bootblock.s
Normal file
92
tests/migration/x86-a-b-bootblock.s
Normal file
|
@ -0,0 +1,92 @@
|
|||
# x86 bootblock used in migration test
|
||||
# repeatedly increments the first byte of each page in a 100MB
|
||||
# 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.
|
||||
#
|
||||
# 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.
|
||||
# See the COPYING file in the top-level directory.
|
||||
#
|
||||
# Author: dgilbert@redhat.com
|
||||
|
||||
|
||||
.code16
|
||||
.org 0x7c00
|
||||
.file "fill.s"
|
||||
.text
|
||||
.globl start
|
||||
.type start, @function
|
||||
start: # at 0x7c00 ?
|
||||
cli
|
||||
lgdt gdtdesc
|
||||
mov $1,%eax
|
||||
mov %eax,%cr0 # Protected mode enable
|
||||
data32 ljmp $8,$0x7c20
|
||||
|
||||
.org 0x7c20
|
||||
.code32
|
||||
# A20 enable - not sure I actually need this
|
||||
inb $0x92,%al
|
||||
or $2,%al
|
||||
outb %al, $0x92
|
||||
|
||||
# set up DS for the whole of RAM (needed on KVM)
|
||||
mov $16,%eax
|
||||
mov %eax,%ds
|
||||
|
||||
mov $65,%ax
|
||||
mov $0x3f8,%dx
|
||||
outb %al,%dx
|
||||
|
||||
# bl keeps a counter so we limit the output speed
|
||||
mov $0, %bl
|
||||
mainloop:
|
||||
# Start from 1MB
|
||||
mov $(1024*1024),%eax
|
||||
innerloop:
|
||||
incb (%eax)
|
||||
add $4096,%eax
|
||||
cmp $(100*1024*1024),%eax
|
||||
jl innerloop
|
||||
|
||||
inc %bl
|
||||
jnz mainloop
|
||||
|
||||
mov $66,%ax
|
||||
mov $0x3f8,%dx
|
||||
outb %al,%dx
|
||||
|
||||
jmp mainloop
|
||||
|
||||
# GDT magic from old (GPLv2) Grub startup.S
|
||||
.p2align 2 /* force 4-byte alignment */
|
||||
gdt:
|
||||
.word 0, 0
|
||||
.byte 0, 0, 0, 0
|
||||
|
||||
/* -- code segment --
|
||||
* base = 0x00000000, limit = 0xFFFFF (4 KiB Granularity), present
|
||||
* type = 32bit code execute/read, DPL = 0
|
||||
*/
|
||||
.word 0xFFFF, 0
|
||||
.byte 0, 0x9A, 0xCF, 0
|
||||
|
||||
/* -- data segment --
|
||||
* base = 0x00000000, limit 0xFFFFF (4 KiB Granularity), present
|
||||
* type = 32 bit data read/write, DPL = 0
|
||||
*/
|
||||
.word 0xFFFF, 0
|
||||
.byte 0, 0x92, 0xCF, 0
|
||||
|
||||
gdtdesc:
|
||||
.word 0x27 /* limit */
|
||||
.long gdt /* addr */
|
||||
|
||||
/* I'm a bootable disk */
|
||||
.org 0x7dfe
|
||||
.byte 0x55
|
||||
.byte 0xAA
|
Loading…
Add table
Add a link
Reference in a new issue