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