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