From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::241; helo=mail-wr0-x241.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A41B7210F2019 for ; Tue, 3 Jul 2018 07:28:09 -0700 (PDT) Received: by mail-wr0-x241.google.com with SMTP id p1-v6so2196511wrs.9 for ; Tue, 03 Jul 2018 07:28:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=myse8cEsfA5YOzkG11CKVY3xcwwTIr5yGss2nF3+Phg=; b=XptVFwGCKJ0G+nUb3216K/SwOntHA2yUQrfSBfGW/59iqXbIs17S9iFE83lVzXLhKr +VXqXlDqYfP6fCE61KXCAN7AIFAAwUfi8ryFamg0NAaXickEF2k+M7aKOuv8GA2QsZJG q/MMfYUmGar1cMy6dQTBdiNETsUFsMaYtPKDg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=myse8cEsfA5YOzkG11CKVY3xcwwTIr5yGss2nF3+Phg=; b=Kyjl5SeQrgRL/UDstaJiOESGvVMIirQBXd3k2bFuhaIiU9ZTaqGCDEO1OxtH494dOO i6WD6xFPoZd64lZgKKaifJ7HFU3aYCA5uGomWcGQm+gdH19y7ZJtmh52qYIMRidhKD4g HTUjmVMuIs+wBgwpwSpHM3o9e5QaTy1faCTnYIDnk2VzLo6mGYImpxtW8A8KkTgayzae DPXwwAeTNa2MDR+6opdoTzlEzXm2Lqbx3KfBrrYFmwZy683tSBccnetCFrImsm/fiAQO ATM6wYnErUfjryiDspXfuSCOFhgucz4uBm/h3J5okz92eDr3vekwJ3vUHU8JBsSz5QPs pttA== X-Gm-Message-State: APt69E1SiI3GDybX0QEqgLVGs0o1mLWQ7gHa2y4m5P+3Lf3bbw2PoKz9 F+JiT+6eoq+9vFswKScg3Ko7Ig== X-Google-Smtp-Source: AAOMgpflXDqp7DQNeT0Oo3dIZH3uoGJvn42uQ+HEPR7ZKicyzsK5GKSUSIDhrhKRuPrK+9z6si+uRQ== X-Received: by 2002:adf:b726:: with SMTP id l38-v6mr18450697wre.115.1530628087782; Tue, 03 Jul 2018 07:28:07 -0700 (PDT) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id h12-v6sm12480008wmb.3.2018.07.03.07.28.06 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Jul 2018 07:28:06 -0700 (PDT) Date: Tue, 3 Jul 2018 15:28:05 +0100 From: Leif Lindholm To: Supreeth Venkatesh Cc: edk2-devel@lists.01.org, Achin Gupta , Ard Biesheuvel Message-ID: <20180703142805.3y7pmeud2m733nkp@bivouac.eciton.net> References: <1530611715-9819-1-git-send-email-supreeth.venkatesh@arm.com> <1530611715-9819-5-git-send-email-supreeth.venkatesh@arm.com> MIME-Version: 1.0 In-Reply-To: <1530611715-9819-5-git-send-email-supreeth.venkatesh@arm.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH 4/6] ArmPkg/ArmMmuLib: Add MMU Library suitable for use in S-EL0. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Jul 2018 14:28:10 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 > Signed-off-by: Supreeth Venkatesh > Cc: Leif Lindholm > Cc: Ard Biesheuvel > --- > .../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 > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > + > +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 >