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