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 <lersek@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Message-Id: <c0f9e95f557b601a045da015c1a97201e8aec2ab.1706634932.git.thomas.lendacky@amd.com>
Tested-by: Min Xu <min.m.xu@intel.com>
Reviewed-by: Min Xu <min.m.xu@intel.com>
This commit is contained in:
Tom Lendacky 2024-01-30 11:15:33 -06:00 committed by mergify[bot]
parent 0e9b124f9c
commit 97c3f5b8d2

View File

@ -5,7 +5,7 @@
operations must be performed on unencrypted buffer hence we use a bounce operations must be performed on unencrypted buffer hence we use a bounce
buffer to map the guest buffer into an unencrypted DMA buffer. buffer to map the guest buffer into an unencrypted DMA buffer.
Copyright (c) 2017, AMD Inc. All rights reserved.<BR> Copyright (c) 2017 - 2024, AMD Inc. All rights reserved.<BR>
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@ -751,7 +751,58 @@ IoMmuSetAttribute (
IN UINT64 IoMmuAccess 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 = { EDKII_IOMMU_PROTOCOL mIoMmu = {