From 97c3f5b8d27230acfc20f479adea64c348750612 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 30 Jan 2024 11:15:33 -0600 Subject: OvmfPkg/IoMmuDxe: Provide an implementation for SetAttribute A recent change to the PciIoMap() function now propagates the return code from the IoMmu protocol SetAttribute() operation. The implementation of this operation in OvmfPkg/IoMmuDxe/CcIoMmu.c returns EFI_UNSUPPORTED, resulting in a failure to boot the guest. Provide an implementation for SetAttribute() that validates the IoMmu access method being requested against the IoMmu mapping operation. Suggested-by: Laszlo Ersek Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky Message-Id: Tested-by: Min Xu Reviewed-by: Min Xu --- OvmfPkg/IoMmuDxe/CcIoMmu.c | 55 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/IoMmuDxe/CcIoMmu.c b/OvmfPkg/IoMmuDxe/CcIoMmu.c index b83a969006..795b945dac 100644 --- a/OvmfPkg/IoMmuDxe/CcIoMmu.c +++ b/OvmfPkg/IoMmuDxe/CcIoMmu.c @@ -5,7 +5,7 @@ operations must be performed on unencrypted buffer hence we use a bounce buffer to map the guest buffer into an unencrypted DMA buffer. - Copyright (c) 2017, AMD Inc. All rights reserved.
+ Copyright (c) 2017 - 2024, AMD Inc. All rights reserved.
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -751,7 +751,58 @@ IoMmuSetAttribute ( IN UINT64 IoMmuAccess ) { - return EFI_UNSUPPORTED; + MAP_INFO *MapInfo; + EFI_STATUS Status; + + DEBUG ((DEBUG_VERBOSE, "%a: Mapping=0x%p Access=%lu\n", __func__, Mapping, IoMmuAccess)); + + if (Mapping == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_SUCCESS; + + // + // An IoMmuAccess value of 0 is always accepted, validate any non-zero value. + // + if (IoMmuAccess != 0) { + MapInfo = (MAP_INFO *)Mapping; + + // + // The mapping operation already implied the access mode. Validate that + // the supplied access mode matches operation access mode. + // + switch (MapInfo->Operation) { + case EdkiiIoMmuOperationBusMasterRead: + case EdkiiIoMmuOperationBusMasterRead64: + if (IoMmuAccess != EDKII_IOMMU_ACCESS_READ) { + Status = EFI_INVALID_PARAMETER; + } + + break; + + case EdkiiIoMmuOperationBusMasterWrite: + case EdkiiIoMmuOperationBusMasterWrite64: + if (IoMmuAccess != EDKII_IOMMU_ACCESS_WRITE) { + Status = EFI_INVALID_PARAMETER; + } + + break; + + case EdkiiIoMmuOperationBusMasterCommonBuffer: + case EdkiiIoMmuOperationBusMasterCommonBuffer64: + if (IoMmuAccess != (EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE)) { + Status = EFI_INVALID_PARAMETER; + } + + break; + + default: + Status = EFI_UNSUPPORTED; + } + } + + return Status; } EDKII_IOMMU_PROTOCOL mIoMmu = { -- cgit v1.2.3