xref: /illumos-gate/usr/src/cmd/bhyve/qemu_loader.h (revision 32640292339b07090f10ce34d455f98711077343)
1*32640292SAndy Fiddaman /*-
2*32640292SAndy Fiddaman  * SPDX-License-Identifier: BSD-2-Clause
3*32640292SAndy Fiddaman  *
4*32640292SAndy Fiddaman  * Copyright (c) 2022 Beckhoff Automation GmbH & Co. KG
5*32640292SAndy Fiddaman  * Author: Corvin Köhne <c.koehne@beckhoff.com>
6*32640292SAndy Fiddaman  */
7*32640292SAndy Fiddaman 
8*32640292SAndy Fiddaman #pragma once
9*32640292SAndy Fiddaman 
10*32640292SAndy Fiddaman #include "qemu_fwcfg.h"
11*32640292SAndy Fiddaman 
12*32640292SAndy Fiddaman struct qemu_loader;
13*32640292SAndy Fiddaman 
14*32640292SAndy Fiddaman /*
15*32640292SAndy Fiddaman  * Some guest bios like seabios assume the RSDP to be located in the FSEG. Bhyve
16*32640292SAndy Fiddaman  * only supports OVMF which has no such requirement.
17*32640292SAndy Fiddaman  */
18*32640292SAndy Fiddaman enum qemu_loader_zone {
19*32640292SAndy Fiddaman 	QEMU_LOADER_ALLOC_HIGH = 1,
20*32640292SAndy Fiddaman 	QEMU_LOADER_ALLOC_FSEG, /* 0x0F000000 - 0x100000 */
21*32640292SAndy Fiddaman };
22*32640292SAndy Fiddaman 
23*32640292SAndy Fiddaman /**
24*32640292SAndy Fiddaman  * Loads a fwcfg item into guest memory. This command has to be issued before
25*32640292SAndy Fiddaman  * any subsequent command can be used.
26*32640292SAndy Fiddaman  *
27*32640292SAndy Fiddaman  * @param loader     Qemu loader instance the command should be added to.
28*32640292SAndy Fiddaman  * @param name       Name of the fwcfg item which should be allocated.
29*32640292SAndy Fiddaman  * @param alignment  Alignment required by the data.
30*32640292SAndy Fiddaman  * @param zone       Memory zone in which it should be loaded.
31*32640292SAndy Fiddaman  */
32*32640292SAndy Fiddaman int qemu_loader_alloc(struct qemu_loader *loader, const uint8_t *name,
33*32640292SAndy Fiddaman     uint32_t alignment, enum qemu_loader_zone zone);
34*32640292SAndy Fiddaman /**
35*32640292SAndy Fiddaman  * Calculates a checksum for @p name and writes it to @p name + @p off . The
36*32640292SAndy Fiddaman  * checksum calculation ranges from @p start to @p start + @p len. The checksum
37*32640292SAndy Fiddaman  * field is always one byte large and all bytes in the specified range,
38*32640292SAndy Fiddaman  * including the checksum, have to sum up to 0.
39*32640292SAndy Fiddaman  *
40*32640292SAndy Fiddaman  * @param loader Qemu loader instance the command should be added to.
41*32640292SAndy Fiddaman  * @param name   Name of the fwcfg item which should be patched.
42*32640292SAndy Fiddaman  * @param off    Offset into @p name .
43*32640292SAndy Fiddaman  * @param start  Start offset of checksum calculation.
44*32640292SAndy Fiddaman  * @param len    Length of the checksum calculation.
45*32640292SAndy Fiddaman  */
46*32640292SAndy Fiddaman int qemu_loader_add_checksum(struct qemu_loader *loader, const uint8_t *name,
47*32640292SAndy Fiddaman     uint32_t off, uint32_t start, uint32_t len);
48*32640292SAndy Fiddaman /**
49*32640292SAndy Fiddaman  * Adds the address of @p src_name to the value at @p dest_name + @p off . The
50*32640292SAndy Fiddaman  * size of the pointer is determined by @p dest_size and should be 1, 2, 4 or 8.
51*32640292SAndy Fiddaman  *
52*32640292SAndy Fiddaman  * @param loader     Qemu loader instance the command should be added to.
53*32640292SAndy Fiddaman  * @param dest_name  Name of the fwcfg item which should be patched.
54*32640292SAndy Fiddaman  * @param src_name   Name of the fwcfg item which address should be written to
55*32640292SAndy Fiddaman  *                   @p dest_name + @p off.
56*32640292SAndy Fiddaman  * @param off        Offset into @p dest_name .
57*32640292SAndy Fiddaman  * @param size       Size of the pointer (1, 2, 4 or 8).
58*32640292SAndy Fiddaman  */
59*32640292SAndy Fiddaman int qemu_loader_add_pointer(struct qemu_loader *loader,
60*32640292SAndy Fiddaman     const uint8_t *dest_name, const uint8_t *src_name, uint32_t off,
61*32640292SAndy Fiddaman     uint8_t size);
62*32640292SAndy Fiddaman 
63*32640292SAndy Fiddaman /**
64*32640292SAndy Fiddaman  * Creates a qemu loader instance.
65*32640292SAndy Fiddaman  *
66*32640292SAndy Fiddaman  * @param new_loader  Returns the newly created qemu loader instance.
67*32640292SAndy Fiddaman  * @param fwcfg_name  Name of the FwCfg item which represents the qemu loader
68*32640292SAndy Fiddaman  */
69*32640292SAndy Fiddaman int qemu_loader_create(struct qemu_loader **new_loader,
70*32640292SAndy Fiddaman     const uint8_t *fwcfg_name);
71*32640292SAndy Fiddaman /**
72*32640292SAndy Fiddaman  * Signals that all commands are written to the qemu loader. This function
73*32640292SAndy Fiddaman  * creates a proper FwCfg item and registers it.
74*32640292SAndy Fiddaman  *
75*32640292SAndy Fiddaman  * @param loader  Qemu loader instance which should be finished.
76*32640292SAndy Fiddaman  */
77*32640292SAndy Fiddaman int qemu_loader_finish(struct qemu_loader *loader);
78