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