1537f23fbSFabiano Rosas /*
2537f23fbSFabiano Rosas * Guest code setup for migration tests
3537f23fbSFabiano Rosas *
4537f23fbSFabiano Rosas * Copyright (c) 2016-2018 Red Hat, Inc. and/or its affiliates
5537f23fbSFabiano Rosas * based on the vhost-user-test.c that is:
6537f23fbSFabiano Rosas * Copyright (c) 2014 Virtual Open Systems Sarl.
7537f23fbSFabiano Rosas *
8537f23fbSFabiano Rosas * This work is licensed under the terms of the GNU GPL, version 2 or later.
9537f23fbSFabiano Rosas * See the COPYING file in the top-level directory.
10537f23fbSFabiano Rosas *
11537f23fbSFabiano Rosas */
12537f23fbSFabiano Rosas
13537f23fbSFabiano Rosas #include "qemu/osdep.h"
14537f23fbSFabiano Rosas
15537f23fbSFabiano Rosas /*
16537f23fbSFabiano Rosas * The boot file modifies memory area in [start_address, end_address)
17537f23fbSFabiano Rosas * repeatedly. It outputs a 'B' at a fixed rate while it's still running.
18537f23fbSFabiano Rosas */
19537f23fbSFabiano Rosas #include "bootfile.h"
20537f23fbSFabiano Rosas #include "i386/a-b-bootblock.h"
21537f23fbSFabiano Rosas #include "aarch64/a-b-kernel.h"
22537f23fbSFabiano Rosas #include "ppc64/a-b-kernel.h"
23537f23fbSFabiano Rosas #include "s390x/a-b-bios.h"
24537f23fbSFabiano Rosas
25537f23fbSFabiano Rosas static char *bootpath;
26537f23fbSFabiano Rosas
bootfile_delete(void)27537f23fbSFabiano Rosas void bootfile_delete(void)
28537f23fbSFabiano Rosas {
29537f23fbSFabiano Rosas if (!bootpath) {
30537f23fbSFabiano Rosas return;
31537f23fbSFabiano Rosas }
32537f23fbSFabiano Rosas unlink(bootpath);
33537f23fbSFabiano Rosas g_free(bootpath);
34537f23fbSFabiano Rosas bootpath = NULL;
35537f23fbSFabiano Rosas }
36537f23fbSFabiano Rosas
bootfile_create(const char * arch,const char * dir,bool suspend_me)37*e1803dabSFabiano Rosas char *bootfile_create(const char *arch, const char *dir, bool suspend_me)
38537f23fbSFabiano Rosas {
39537f23fbSFabiano Rosas unsigned char *content;
40537f23fbSFabiano Rosas size_t len;
41537f23fbSFabiano Rosas
42537f23fbSFabiano Rosas bootfile_delete();
43537f23fbSFabiano Rosas bootpath = g_strdup_printf("%s/bootsect", dir);
44537f23fbSFabiano Rosas if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
45537f23fbSFabiano Rosas /* the assembled x86 boot sector should be exactly one sector large */
46537f23fbSFabiano Rosas g_assert(sizeof(x86_bootsect) == 512);
47537f23fbSFabiano Rosas x86_bootsect[SYM_suspend_me - SYM_start] = suspend_me;
48537f23fbSFabiano Rosas content = x86_bootsect;
49537f23fbSFabiano Rosas len = sizeof(x86_bootsect);
50537f23fbSFabiano Rosas } else if (g_str_equal(arch, "s390x")) {
51537f23fbSFabiano Rosas content = s390x_elf;
52537f23fbSFabiano Rosas len = sizeof(s390x_elf);
53537f23fbSFabiano Rosas } else if (strcmp(arch, "ppc64") == 0) {
54537f23fbSFabiano Rosas content = ppc64_kernel;
55537f23fbSFabiano Rosas len = sizeof(ppc64_kernel);
56537f23fbSFabiano Rosas } else if (strcmp(arch, "aarch64") == 0) {
57537f23fbSFabiano Rosas content = aarch64_kernel;
58537f23fbSFabiano Rosas len = sizeof(aarch64_kernel);
59537f23fbSFabiano Rosas g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
60537f23fbSFabiano Rosas } else {
61537f23fbSFabiano Rosas g_assert_not_reached();
62537f23fbSFabiano Rosas }
63537f23fbSFabiano Rosas
64537f23fbSFabiano Rosas FILE *bootfile = fopen(bootpath, "wb");
65537f23fbSFabiano Rosas
66537f23fbSFabiano Rosas g_assert_cmpint(fwrite(content, len, 1, bootfile), ==, 1);
67537f23fbSFabiano Rosas fclose(bootfile);
68537f23fbSFabiano Rosas
69537f23fbSFabiano Rosas return bootpath;
70537f23fbSFabiano Rosas }
71