From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web10.35247.1607956975738364334 for ; Mon, 14 Dec 2020 06:42:55 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=softfail (domain: linaro.org, ip: 217.140.110.172, mailfrom: sughosh.ganu@linaro.org) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5C0EB30E; Mon, 14 Dec 2020 06:42:55 -0800 (PST) Received: from a076522.blr.arm.com (a076522.blr.arm.com [10.162.16.44]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 686B33F66E; Mon, 14 Dec 2020 06:42:53 -0800 (PST) From: "Sughosh Ganu" To: devel@edk2.groups.io Cc: Sami Mujawar , Ard Biesheuvel , Leif Lindholm , Sahil Malhotra , Achin Gupta Subject: [PATCH v2 11/13] StandaloneMmMmuLib: Add option to use FF-A calls to set memory region's permissions Date: Mon, 14 Dec 2020 20:12:14 +0530 Message-Id: <20201214144216.26328-12-sughosh.ganu@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201214144216.26328-1-sughosh.ganu@linaro.org> References: <20201214144216.26328-1-sughosh.ganu@linaro.org> From: Achin Gupta Allow setting memory region's permissions using either of the Firmware Framework(FF-A) ABI transport or through the earlier used SVC calls. Signed-off-by: Achin Gupta Co-developed-by: Sughosh Ganu --- ArmPkg/Library/StandaloneMmMmuLib/AArch64/ArmMmuStandaloneMmLib.c | 78 +++++++++++++------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/ArmPkg/Library/StandaloneMmMmuLib/AArch64/ArmMmuStandaloneMmLib.c b/ArmPkg/Library/StandaloneMmMmuLib/AArch64/ArmMmuStandaloneMmLib.c index 893e291907..be63994920 100644 --- a/ArmPkg/Library/StandaloneMmMmuLib/AArch64/ArmMmuStandaloneMmLib.c +++ b/ArmPkg/Library/StandaloneMmMmuLib/AArch64/ArmMmuStandaloneMmLib.c @@ -97,45 +97,71 @@ RequestMemoryPermissionChange ( IN UINTN Permissions ) { + BOOLEAN FfaEnabled; EFI_STATUS Status; ARM_SVC_ARGS ChangeMemoryPermissionsSvcArgs = {0}; - ChangeMemoryPermissionsSvcArgs.Arg0 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64; - ChangeMemoryPermissionsSvcArgs.Arg1 = BaseAddress; - ChangeMemoryPermissionsSvcArgs.Arg2 = EFI_SIZE_TO_PAGES(Length); - ChangeMemoryPermissionsSvcArgs.Arg3 = Permissions; + FfaEnabled = FeaturePcdGet (PcdFfaEnable); + + if (FfaEnabled) { + ChangeMemoryPermissionsSvcArgs.Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64; + ChangeMemoryPermissionsSvcArgs.Arg1 = ARM_FFA_DESTINATION_ENDPOINT_ID; + ChangeMemoryPermissionsSvcArgs.Arg2 = 0; + ChangeMemoryPermissionsSvcArgs.Arg3 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64; + ChangeMemoryPermissionsSvcArgs.Arg4 = BaseAddress; + ChangeMemoryPermissionsSvcArgs.Arg5 = EFI_SIZE_TO_PAGES (Length); + ChangeMemoryPermissionsSvcArgs.Arg6 = Permissions; + } else { + ChangeMemoryPermissionsSvcArgs.Arg0 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64; + ChangeMemoryPermissionsSvcArgs.Arg1 = BaseAddress; + ChangeMemoryPermissionsSvcArgs.Arg2 = EFI_SIZE_TO_PAGES (Length); + ChangeMemoryPermissionsSvcArgs.Arg3 = Permissions; + } ArmCallSvc (&ChangeMemoryPermissionsSvcArgs); - Status = ChangeMemoryPermissionsSvcArgs.Arg0; + if (FfaEnabled) { + Status = ChangeMemoryPermissionsSvcArgs.Arg3; + + switch (Status) { + case ARM_FFA_SPM_RET_INVALID_PARAMETERS: + return EFI_INVALID_PARAMETER; + + case ARM_FFA_SPM_RET_DENIED: + return EFI_NOT_READY; + + case ARM_FFA_SPM_RET_NOT_SUPPORTED: + return EFI_UNSUPPORTED; + + case ARM_FFA_SPM_RET_BUSY: + return EFI_NOT_READY; - switch (Status) { - case ARM_SVC_SPM_RET_SUCCESS: - Status = EFI_SUCCESS; - break; + case ARM_FFA_SPM_RET_ABORTED: + return EFI_ABORTED; - case ARM_SVC_SPM_RET_NOT_SUPPORTED: - Status = EFI_UNSUPPORTED; - break; + default: + return EFI_SUCCESS; + } + } else { + Status = ChangeMemoryPermissionsSvcArgs.Arg0; + switch (Status) { - case ARM_SVC_SPM_RET_INVALID_PARAMS: - Status = EFI_INVALID_PARAMETER; - break; + case ARM_SVC_SPM_RET_NOT_SUPPORTED: + return EFI_UNSUPPORTED; - case ARM_SVC_SPM_RET_DENIED: - Status = EFI_ACCESS_DENIED; - break; + case ARM_SVC_SPM_RET_INVALID_PARAMS: + return EFI_INVALID_PARAMETER; - case ARM_SVC_SPM_RET_NO_MEMORY: - Status = EFI_BAD_BUFFER_SIZE; - break; + case ARM_SVC_SPM_RET_DENIED: + return EFI_ACCESS_DENIED; - default: - Status = EFI_ACCESS_DENIED; - ASSERT (0); - } + case ARM_SVC_SPM_RET_NO_MEMORY: + return EFI_BAD_BUFFER_SIZE; - return Status; + default: + return EFI_SUCCESS; + } + } } EFI_STATUS -- 2.17.1