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