From 774f52f6debdc3ba4e43bb6f49b1223ca727241b Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 8 Feb 2017 17:14:34 +0100 Subject: [PATCH] OvmfPkg/AcpiPlatformDxe: add QEMU_LOADER_WRITE_POINTER definitions Cc: Jordan Justen Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=359 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen --- OvmfPkg/AcpiPlatformDxe/QemuLoader.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/OvmfPkg/AcpiPlatformDxe/QemuLoader.h b/OvmfPkg/AcpiPlatformDxe/QemuLoader.h index b29944378d..437776d86d 100644 --- a/OvmfPkg/AcpiPlatformDxe/QemuLoader.h +++ b/OvmfPkg/AcpiPlatformDxe/QemuLoader.h @@ -28,6 +28,7 @@ typedef enum { QemuLoaderCmdAllocate = 1, QemuLoaderCmdAddPointer, QemuLoaderCmdAddChecksum, + QemuLoaderCmdWritePointer, } QEMU_LOADER_COMMAND_TYPE; typedef enum { @@ -72,12 +73,37 @@ typedef struct { UINT32 Length; } QEMU_LOADER_ADD_CHECKSUM; +// +// QemuLoaderCmdWritePointer: the bytes at +// [PointerOffset..PointerOffset+PointerSize) in the writeable fw_cfg file +// PointerFile are to receive the absolute address of PointeeFile, as allocated +// and downloaded by the firmware, incremented by the value of PointeeOffset. +// Store the sum of (a) the base address of where PointeeFile's contents have +// been placed (when QemuLoaderCmdAllocate has been executed for PointeeFile) +// and (b) PointeeOffset, to this portion of PointerFile. +// +// This command is similar to QemuLoaderCmdAddPointer; the difference is that +// the "pointer to patch" does not exist in guest-physical address space, only +// in "fw_cfg file space". In addition, the "pointer to patch" is not +// initialized by QEMU in-place with a possibly nonzero offset value: the +// relative offset into PointeeFile comes from the explicit PointeeOffset +// field. +// +typedef struct { + UINT8 PointerFile[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated + UINT8 PointeeFile[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated + UINT32 PointerOffset; + UINT32 PointeeOffset; + UINT8 PointerSize; // one of 1, 2, 4, 8 +} QEMU_LOADER_WRITE_POINTER; + typedef struct { UINT32 Type; // QEMU_LOADER_COMMAND_TYPE values union { QEMU_LOADER_ALLOCATE Allocate; QEMU_LOADER_ADD_POINTER AddPointer; QEMU_LOADER_ADD_CHECKSUM AddChecksum; + QEMU_LOADER_WRITE_POINTER WritePointer; UINT8 Padding[124]; } Command; } QEMU_LOADER_ENTRY; -- 2.39.2