From: Leif Lindholm <leif.lindholm@linaro.org>
To: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
Cc: edk2-devel@lists.01.org, Achin Gupta <achin.gupta@arm.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: Re: [PATCH 4/6] ArmPkg/ArmMmuLib: Add MMU Library suitable for use in S-EL0.
Date: Tue, 3 Jul 2018 15:28:05 +0100 [thread overview]
Message-ID: <20180703142805.3y7pmeud2m733nkp@bivouac.eciton.net> (raw)
In-Reply-To: <1530611715-9819-5-git-send-email-supreeth.venkatesh@arm.com>
On Tue, Jul 03, 2018 at 03:25:13PM +0530, Supreeth Venkatesh wrote:
> The Standalone MM environment runs in S-EL0 in AArch64 on ARM Standard
> Platforms. Privileged firmware e.g. ARM Trusted Firmware sets up its
> architectural context including the initial translation tables for the
> S-EL1/EL0 translation regime. The MM environment will still request ARM
> TF to change the memory attributes of memory regions during
> initialization.
>
> The Standalone MM image is a FV that encapsulates the MM foundation
> and drivers. These are PE-COFF images with data and text segments.
> To initialise the MM environment, Arm Trusted Firmware has to create
> translation tables with sane default attributes for the memory
> occupied by the FV. This library sends SVCs to ARM Trusted Firmware
> to request memory permissions change for data and text segments.
>
> This patch adds a simple MMU library suitable for execution in S-EL0 and
> requesting memory permissions change operations from Arm Trusted Firmware.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Achin Gupta <achin.gupta@arm.com>
> Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>
> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
> .../ArmMmuLib/AArch64/ArmMmuStandaloneMmCoreLib.c | 195 +++++++++++++++++++++
> 1 file changed, 195 insertions(+)
> create mode 100644 ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuStandaloneMmCoreLib.c
>
> diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuStandaloneMmCoreLib.c b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuStandaloneMmCoreLib.c
> new file mode 100644
> index 0000000..0f5e68d
> --- /dev/null
> +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuStandaloneMmCoreLib.c
> @@ -0,0 +1,195 @@
> +/** @file
> +* File managing the MMU for ARMv8 architecture in S-EL0
> +*
> +* Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> +*
> +* This program and the accompanying materials
> +* are licensed and made available under the terms and conditions of the BSD License
> +* which accompanies this distribution. The full text of the license may be found at
> +* http://opensource.org/licenses/bsd-license.php
> +*
> +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include <Uefi.h>
> +#include <Chipset/AArch64.h>
> +#include <IndustryStandard/ArmMmSvc.h>
> +
> +#include <Library/ArmLib.h>
> +#include <Library/ArmMmuLib.h>
> +#include <Library/ArmSvcLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +
> +EFI_STATUS
> +GetMemoryPermissions (
> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> + OUT UINT32 *MemoryAttributes
> + )
> +{
> + ARM_SVC_ARGS GetMemoryPermissionsSvcArgs = {0};
> +
> + GetMemoryPermissionsSvcArgs.Arg0 = ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64;
> + GetMemoryPermissionsSvcArgs.Arg1 = BaseAddress;
> + GetMemoryPermissionsSvcArgs.Arg2 = 0;
> + GetMemoryPermissionsSvcArgs.Arg3 = 0;
> +
> + ArmCallSvc (&GetMemoryPermissionsSvcArgs);
> + if (GetMemoryPermissionsSvcArgs.Arg0 == ARM_SVC_SPM_RET_INVALID_PARAMS) {
> + *MemoryAttributes = 0;
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + *MemoryAttributes = GetMemoryPermissionsSvcArgs.Arg0;
> + return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +RequestMemoryPermissionChange (
> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> + IN UINT64 Length,
> + IN UINTN Permissions
> + )
> +{
> + EFI_STATUS Status;
> + ARM_SVC_ARGS ChangeMemoryPermissionsSvcArgs = {0};
> +
> + ChangeMemoryPermissionsSvcArgs.Arg0 = ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64;
> + ChangeMemoryPermissionsSvcArgs.Arg1 = BaseAddress;
> + ChangeMemoryPermissionsSvcArgs.Arg2 = (Length >= EFI_PAGE_SIZE) ? \
> + Length >> EFI_PAGE_SHIFT : 1;
Use EFI_SIZE_TO_PAGES?
> + ChangeMemoryPermissionsSvcArgs.Arg3 = Permissions;
> +
> + ArmCallSvc (&ChangeMemoryPermissionsSvcArgs);
> +
> + Status = ChangeMemoryPermissionsSvcArgs.Arg0;
> +
> + switch (Status) {
> + case ARM_SVC_SPM_RET_SUCCESS:
> + Status = EFI_SUCCESS;
> + break;
> +
> + case ARM_SVC_SPM_RET_NOT_SUPPORTED:
> + Status = EFI_UNSUPPORTED;
> + break;
> +
> + case ARM_SVC_SPM_RET_INVALID_PARAMS:
> + Status = EFI_INVALID_PARAMETER;
> + break;
> +
> + case ARM_SVC_SPM_RET_DENIED:
> + Status = EFI_ACCESS_DENIED;
> + break;
> +
> + case ARM_SVC_SPM_RET_NO_MEMORY:
> + Status = EFI_BAD_BUFFER_SIZE;
> + break;
> +
> + default:
> + Status = EFI_ACCESS_DENIED;
> + ASSERT (0);
> + }
> +
> + return Status;
> +}
> +
> +EFI_STATUS
> +ArmSetMemoryRegionNoExec (
> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> + IN UINT64 Length
> + )
> +{
> + EFI_STATUS Status;
> + UINT32 MemoryAttributes;
> +
> + Status = GetMemoryPermissions (BaseAddress, &MemoryAttributes);
> + if (Status != EFI_INVALID_PARAMETER) {
> + return RequestMemoryPermissionChange (BaseAddress,
> + Length,
> + MemoryAttributes |
> + (SET_MEM_ATTR_CODE_PERM_XN << SET_MEM_ATTR_CODE_PERM_SHIFT));
Very long line - please use a temporary variable to shorten.
(Throughout.)
> + }
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +EFI_STATUS
> +ArmClearMemoryRegionNoExec (
> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> + IN UINT64 Length
> + )
> +{
> + EFI_STATUS Status;
> + UINT32 MemoryAttributes;
> +
> + Status = GetMemoryPermissions (BaseAddress, &MemoryAttributes);
> + if (Status != EFI_INVALID_PARAMETER) {
> + return RequestMemoryPermissionChange (BaseAddress,
> + Length,
> + MemoryAttributes &
> + ~(SET_MEM_ATTR_CODE_PERM_XN << SET_MEM_ATTR_CODE_PERM_SHIFT));
> + }
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +EFI_STATUS
> +ArmSetMemoryRegionReadOnly (
> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> + IN UINT64 Length
> + )
> +{
> + EFI_STATUS Status;
> + UINT32 MemoryAttributes;
> +
> + Status = GetMemoryPermissions (BaseAddress, &MemoryAttributes);
> + if (Status != EFI_INVALID_PARAMETER) {
> + return RequestMemoryPermissionChange (BaseAddress,
> + Length,
> + MemoryAttributes |
> + (SET_MEM_ATTR_DATA_PERM_RO << SET_MEM_ATTR_DATA_PERM_SHIFT));
> + }
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +EFI_STATUS
> +ArmClearMemoryRegionReadOnly (
> + IN EFI_PHYSICAL_ADDRESS BaseAddress,
> + IN UINT64 Length
> + )
> +{
> + EFI_STATUS Status;
> + UINT32 MemoryAttributes;
> +
> + Status = GetMemoryPermissions (BaseAddress, &MemoryAttributes);
> + if (Status != EFI_INVALID_PARAMETER) {
> + return RequestMemoryPermissionChange (BaseAddress,
> + Length,
> + SET_MEM_ATTR_MAKE_PERM_REQUEST
> + ( \
> + SET_MEM_ATTR_DATA_PERM_RW, \
> + MemoryAttributes));
Use temporary variable.
/
Leif
> + }
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +ArmConfigureMmu (
> + IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,
> + OUT VOID **TranslationTableBase OPTIONAL,
> + OUT UINTN *TranslationTableSize OPTIONAL
> + )
> +{
> + return EFI_UNSUPPORTED;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +ArmMmuStandaloneMmCoreLibConstructor (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_MM_SYSTEM_TABLE *MmSystemTable
> + )
> +{
> + return EFI_SUCCESS;
> +}
> --
> 2.7.4
>
next prev parent reply other threads:[~2018-07-03 14:28 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-03 9:55 [PATCH 0/6] ArmPkg related changes for StandaloneMM package Supreeth Venkatesh
2018-07-03 9:55 ` [PATCH 1/6] ArmPkg: Add PCDs needed for MM communication driver Supreeth Venkatesh
2018-07-03 12:09 ` Leif Lindholm
2018-07-03 9:55 ` [PATCH 2/6] ArmPkg/Drivers: Add EFI_MM_COMMUNICATION_PROTOCOL DXE driver Supreeth Venkatesh
2018-07-03 14:12 ` Leif Lindholm
2018-07-09 8:35 ` Sughosh Ganu
2018-07-09 9:45 ` Leif Lindholm
2018-07-03 9:55 ` [PATCH 3/6] ArmPkg/Include: Add MM interface SVC return codes Supreeth Venkatesh
2018-07-03 10:44 ` Leif Lindholm
2018-07-03 9:55 ` [PATCH 4/6] ArmPkg/ArmMmuLib: Add MMU Library suitable for use in S-EL0 Supreeth Venkatesh
2018-07-03 14:28 ` Leif Lindholm [this message]
2018-07-03 9:55 ` [PATCH 5/6] ArmPkg/ArmMmuLib: Add MMU library inf file " Supreeth Venkatesh
2018-07-03 9:55 ` [PATCH 6/6] ArmPkg: Extra action to update permissions for S-ELO MM Image Supreeth Venkatesh
2018-07-03 14:35 ` Leif Lindholm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180703142805.3y7pmeud2m733nkp@bivouac.eciton.net \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox