[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 20/21] docs: add uefi variable service documentation
From: |
Gerd Hoffmann |
Subject: |
[PATCH v2 20/21] docs: add uefi variable service documentation |
Date: |
Tue, 7 Jan 2025 16:33:47 +0100 |
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
docs/devel/index-internals.rst | 1 +
docs/devel/uefi-vars.rst | 66 ++++++++++++++++++++++++++++++++++
hw/uefi/LIMITATIONS.md | 7 ++++
3 files changed, 74 insertions(+)
create mode 100644 docs/devel/uefi-vars.rst
create mode 100644 hw/uefi/LIMITATIONS.md
diff --git a/docs/devel/index-internals.rst b/docs/devel/index-internals.rst
index ab9fbc448263..56aa589f663c 100644
--- a/docs/devel/index-internals.rst
+++ b/docs/devel/index-internals.rst
@@ -18,6 +18,7 @@ Details about QEMU's various subsystems including how to add
features to them.
s390-cpu-topology
s390-dasd-ipl
tracing
+ uefi-vars
vfio-iommufd
writing-monitor-commands
virtio-backends
diff --git a/docs/devel/uefi-vars.rst b/docs/devel/uefi-vars.rst
new file mode 100644
index 000000000000..3e7bd98b5208
--- /dev/null
+++ b/docs/devel/uefi-vars.rst
@@ -0,0 +1,66 @@
+==============
+UEFI variables
+==============
+
+Guest UEFI variable management
+==============================
+
+The traditional approach for UEFI Variable storage in qemu guests is
+to work as close as possible to physical hardware. That means
+providing pflash as storage and leaving the management of variables
+and flash to the guest.
+
+Secure boot support comes with the requirement that the UEFI variable
+storage must be protected against direct access by the OS. All update
+requests must pass the sanity checks. (Parts of) the firmware must
+run with a higher privilege level than the OS so this can be enforced
+by the firmware. On x86 this has been implemented using System
+Management Mode (SMM) in qemu and kvm, which again is the same
+approach taken by physical hardware. Only privileged code running in
+SMM mode is allowed to access flash storage.
+
+Communication with the firmware code running in SMM mode works by
+serializing the requests to a shared buffer, then trapping into SMM
+mode via SMI. The SMM code processes the request, stores the reply in
+the same buffer and returns.
+
+Host UEFI variable service
+==========================
+
+Instead of running the privileged code inside the guest we can run it
+on the host. The serialization protocol can be reused. The
+communication with the host uses a virtual device, which essentially
+configures the shared buffer location and size, and traps to the host
+to process the requests.
+
+The ``uefi-vars`` device implements the UEFI virtual device. It comes
+in ``uefi-vars-isa`` and ``uefi-vars-sysbus`` flavours. The device
+reimplements the handlers needed, specifically
+``EfiSmmVariableProtocol`` and ``VarCheckPolicyLibMmiHandler``. It
+also consumes events (``EfiEndOfDxeEventGroup``,
+``EfiEventReadyToBoot`` and ``EfiEventExitBootServices``).
+
+The advantage of the approach is that we do not need a special
+privilege level for the firmware to protect itself, i.e. it does not
+depend on SMM emulation on x64, which allows the removal of a bunch of
+complex code for SMM emulation from the linux kernel
+(CONFIG_KVM_SMM=n). It also allows support for secure boot on arm
+without implementing secure world (el3) emulation in kvm.
+
+Of course there are also downsides. The added device increases the
+attack surface of the host, and we are adding some code duplication
+because we have to reimplement some edk2 functionality in qemu.
+
+usage on x86_64 (isa)
+---------------------
+
+.. code::
+
+ qemu-system-x86_64 -device uefi-vars-isa,jsonfile=/path/to/vars.json
+
+usage on aarch64 (sysbus)
+-------------------------
+
+.. code::
+
+ qemu-system-aarch64 -M virt,x-uefi-vars=on
diff --git a/hw/uefi/LIMITATIONS.md b/hw/uefi/LIMITATIONS.md
new file mode 100644
index 000000000000..29308bd587aa
--- /dev/null
+++ b/hw/uefi/LIMITATIONS.md
@@ -0,0 +1,7 @@
+known issues and limitations
+----------------------------
+
+* works only on little endian hosts
+ - accessing structs in guest ram is done without endian conversion.
+* works only for 64-bit guests
+ - UINTN is mapped to uint64_t, for 32-bit guests that would be uint32_t
--
2.47.1
- [PATCH v2 10/21] hw/uefi: add var-service-pkcs7.c, (continued)
- [PATCH v2 10/21] hw/uefi: add var-service-pkcs7.c, Gerd Hoffmann, 2025/01/07
- [PATCH v2 12/21] hw/uefi: add var-service-siglist.c, Gerd Hoffmann, 2025/01/07
- [PATCH v2 14/21] hw/uefi: add trace-events, Gerd Hoffmann, 2025/01/07
- [PATCH v2 15/21] hw/uefi: add UEFI_VARS to Kconfig, Gerd Hoffmann, 2025/01/07
- [PATCH v2 13/21] hw/uefi: add var-service-json.c + qapi for NV vars., Gerd Hoffmann, 2025/01/07
- [PATCH v2 17/21] hw/uefi: add uefi-vars-sysbus device, Gerd Hoffmann, 2025/01/07
- [PATCH v2 16/21] hw/uefi: add to meson, Gerd Hoffmann, 2025/01/07
- [PATCH v2 18/21] hw/uefi: add uefi-vars-isa device, Gerd Hoffmann, 2025/01/07
- [PATCH v2 20/21] docs: add uefi variable service documentation,
Gerd Hoffmann <=
- [PATCH v2 21/21] hw/uefi: add MAINTAINERS entry, Gerd Hoffmann, 2025/01/07
- [PATCH v2 19/21] hw/arm: add uefi variable support to virt machine type, Gerd Hoffmann, 2025/01/07
- Re: [PATCH v2 00/21] hw/uefi: add uefi variable service, Daniel P . Berrangé, 2025/01/07
- Re: [PATCH v2 00/21] hw/uefi: add uefi variable service, Marc-André Lureau, 2025/01/08