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