>From 19b0e88b5e0d6954a924f444b02bcb576a115952 Mon Sep 17 00:00:00 2001 Message-Id: <19b0e88b5e0d6954a924f444b02bcb576a115952.1696517822.git.ehem+xen@xxxxxxx> From: Elliott Mitchell Date: Wed, 4 Oct 2023 21:47:17 -0700 Subject: [PATCH] OvmfPkg/XenBusDxe: Unmap shared information page on exit Xen/ARM now requires the shared information page to only be mapped once. This behavior is expected to be copied to Xen/x86 at some future point. Signed-off-by: Elliott Mitchell --- OvmfPkg/XenBusDxe/XenBusDxe.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.c b/OvmfPkg/XenBusDxe/XenBusDxe.c index 132f43a72b..117a299d10 100644 --- a/OvmfPkg/XenBusDxe/XenBusDxe.c +++ b/OvmfPkg/XenBusDxe/XenBusDxe.c @@ -84,6 +84,33 @@ XenGetSharedInfoPage ( return EFI_SUCCESS; } +/** + Unmap the shared_info_t page from memory. + + @param Dev A XENBUS_DEVICE instance. +**/ +VOID +XenClearSharedInfoPage ( + IN OUT XENBUS_DEVICE *Dev + ) +{ + xen_remove_from_physmap_t Parameter; + + // + // Either never mapped, or else already cleared. No further cleanup + // action required. + // + if (!Dev->SharedInfo) return; + + Parameter.domid = DOMID_SELF; + Parameter.gpfn = (UINTN)Dev->SharedInfo >> EFI_PAGE_SHIFT; + if (XenHypercallMemoryOp (XENMEM_remove_from_physmap, &Parameter) != 0) + return; + + FreePages (Dev->SharedInfo, 1); + Dev->SharedInfo = NULL; +} + /** Unloads an image. @@ -501,6 +528,8 @@ XenBusDxeDriverBindingStop ( XenStoreDeinit (Dev); XenGrantTableDeinit (Dev); + XenClearSharedInfoPage(Dev); + gBS->CloseProtocol ( ControllerHandle, &gEfiDevicePathProtocolGuid, -- 2.39.2