xref: /openbmc/qemu/tests/qtest/migration/bootfile.c (revision bdce9bc9179bd7b6f4e12c759dd3cd6794e26a6b)
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