From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.0.49; helo=eur01-he1-obe.outbound.protection.outlook.com; envelope-from=achin.gupta@arm.com; receiver=edk2-devel@lists.01.org Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0049.outbound.protection.outlook.com [104.47.0.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id CDA6922742A81 for ; Wed, 11 Apr 2018 12:20:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=04AjwWwN+jCx69c9qGBJaqdft/9Gkw4wmFESmYZ/6kw=; b=e2CFdWKY0j6vc/YkmxuVU/ZAYfnpc/WKLHhtVn9MFi0+p8qINGhr6amTCyLexELZYTOQMRbiIAWuVCcNvnOIFL1HYa4STOzfTF5r3jQpoFbY72GujZPJlwIkjs1vuAuHn/vV0jumeMd8jmoWwGBLDDbzBoiNNQb4TG2Pk4a3/Bg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Achin.Gupta@arm.com; Received: from e104320-lin (217.140.96.140) by AM0PR08MB2980.eurprd08.prod.outlook.com (2603:10a6:208:5b::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.675.9; Wed, 11 Apr 2018 19:20:28 +0000 Date: Wed, 11 Apr 2018 20:21:53 +0100 From: Achin Gupta To: Supreeth Venkatesh Cc: edk2-devel@lists.01.org, michael.d.kinney@intel.com, liming.gao@intel.com, jiewen.yao@intel.com, leif.lindholm@linaro.org, ard.biesheuvel@linaro.org, nd@arm.com Message-ID: <20180411192153.GH663@e104320-lin> References: <20180406144223.10931-1-supreeth.venkatesh@arm.com> <20180406144223.10931-5-supreeth.venkatesh@arm.com> MIME-Version: 1.0 In-Reply-To: <20180406144223.10931-5-supreeth.venkatesh@arm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Originating-IP: [217.140.96.140] X-ClientProxiedBy: AM6PR0502CA0024.eurprd05.prod.outlook.com (2603:10a6:209:1::37) To AM0PR08MB2980.eurprd08.prod.outlook.com (2603:10a6:208:5b::25) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(2017052603328)(7153060)(7193020); SRVR:AM0PR08MB2980; X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 3:SqlrcZJ/s7oQfnCQwENHGMn3PZN+22dxMY72PzMaWW+G66gqyff6P+PnxmygqHmTqRR8L2S0rTVKLTET/egd6ZpNRrcxtcWV+PZ4Z9W2zkZ8FE2rR2m6iX09uvrCGHtrnbscp+eerHWWsJ6tvdOfELQLrm0kNzN/ktJfhUk3E1gMTcxzvmx1y4a8p5IFN3UqvMpafdAY4JlAWYNp0q3/KtTlrAN+ZGGpB/vZiboGKTOBNi4TMh2wylPsgcyPndN7; 25:db708ZIHe64fpjubnGrtadlepdjVc/SHdkaQPel8wQCj4cJ6ug5ckvbnznP++mk/gtRkfz+QAKH4sU47iBh9oO9v9ykpEihxWb2ddEw8WRxSQWflnb+84ZygacigZpRVx3JHnE88pAQb/kiPowtWQE1rrA09Fxv5KidGzPgXBBgN/lkbOJHMxGdCJWsomnjA9foSEBWqu803LAeWPxq4t2TVWJwR1/8ssHkCczBhZbRs6W4vX8WuNQxnIJhq+nz4PS+vc4Wsvwi6LSIIN1kV3/lvWT/eYeFxNj7Bnso5T9hC0J2NmOudzVGBD6/L1L+5J3u003ooiMQLu5pZ9LkYiA==; 31:dSahM4cws29W6WAWVK0UkOo/mXXBWQ/O7aN18vlMWCGzIYi0pIJqtkCbkWEpwZIA1ErunT1C+b1Hy4wQPtuM03UQG5WgJfd6iq2uCUyP29zU3bbDWNFIJfNGg1eVwS8rURV8G68w0TX/YV6m5K23eSq9UeqNQIpQO/++JbpgWljXxwZVyvla6TTr5/5fNVuuIOu0ToqAzVtE5H4Chnf2NS9uGrLrEzyy0znIKacDKQE= X-MS-TrafficTypeDiagnostic: AM0PR08MB2980: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 20:atTyre+WE8WHg8Yvck4Ok17S0RtJrRLEcXzj2kUH5ABVoe1pHtNfwDAr/jhBKkZ3erXWE3J3vCbzEVWpcyFoulfpeexjTPxGDpFh6Z++UF2M3qJ0xgKXQUAgmSqTl/iWeK/3VKD/cNbqnqV+KLuKckKhEsiGG1ejJBTJzLK2Ej8=; 4:zdHvRwTw9JQx9GGs6pyQ0z28x6Hzr6I2RvQXKi67WAied+QgjK38TADb9TlZF307+GMWOZyuzERoGnK46hQuP+/GyqKmJ4OYAJF/WstgC50whqhG3o2ClpXGJXS6c8hbjlfdR7Wg1pfstZeFGIYbxegHzVX+YYpadiVnN8JJDlY8otsTkx3xdte9oxmmo2j1aMHdOrkR6yGRA1cjh8YST+CjOPRW78fZEeYxKok2ux0tYxsIKvSvXDYyVqxNntsksbpk8LHytuLVBri38079yagLPVfoO6F7WyMgCFPI0An6lnhmRC/qvb+sGOzNj0QN X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(3231221)(944501327)(52105095)(10201501046)(6055026)(6041310)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:AM0PR08MB2980; BCL:0; PCL:0; RULEID:; SRVR:AM0PR08MB2980; X-Forefront-PRVS: 0639027A9E X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39850400004)(39380400002)(396003)(366004)(346002)(376002)(189003)(199004)(8676002)(81166006)(2906002)(6496006)(1076002)(316002)(33896004)(97736004)(25786009)(966005)(76176011)(7736002)(6862004)(58126008)(52116002)(8936002)(6666003)(16586007)(47776003)(4326008)(446003)(81156014)(53376002)(68736007)(11346002)(86362001)(6246003)(66066001)(6636002)(33716001)(386003)(59450400001)(305945005)(956004)(53936002)(23726003)(9686003)(55016002)(105586002)(5660300001)(106356001)(15188155005)(6306002)(3846002)(229853002)(16799955002)(50466002)(6116002)(26005)(476003)(72206003)(486006)(16526019)(478600001)(33656002)(18370500001)(107986001)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR08MB2980; H:e104320-lin; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM0PR08MB2980; 23:jXDtTy12VcY5rQGo8dPlg87SxKfhsg6XxP+osC+hd?= =?us-ascii?Q?T58ZCYKhIBeXNo4HBj5CmhSMKQlHdmBH9dwO0lcH/1zM8WPF3bivwwkeYmDy?= =?us-ascii?Q?yrqve7K/DtGSjZaaBo7rMJxFn9Vfnj5vXzxXU7nsaskWG7fxp8Tvs62Cs5Cr?= =?us-ascii?Q?kuSyUVh8PGAVhtXevPvTKSQMBMR3CtI0lagQrc0SeaYJaa25g3+zPv/ZkyZl?= =?us-ascii?Q?b8YSY4lrcTSYYSGzCDNB4P/iJk8pVYyVjhnsrSw8q/i28Awz3+SF+Q39S2Xe?= =?us-ascii?Q?koWQRj0lw7pINfzKeEVwK76GEJkJa51H+tF2q64cR4nKaTZoUH071KifZZaO?= =?us-ascii?Q?4tzUqivrj2MU+cnrSNNwANGEDC87z5AX0wgW+PtHr4J4Z/XsXnKmiR6h7eXA?= =?us-ascii?Q?Jjnm5P+tweuv2zwiuE9jnbkaboYadiYq17ID2ptRyYXLhDjat77DOxhmIMfq?= =?us-ascii?Q?TZN5uWjC8VyLvbtNhXxY/l+OYx6dnYzkGoxG9wIVRLkx0o01c7ymWFAkGMTI?= =?us-ascii?Q?5ZOFTEVFZP1sFawzdOSZRaiCabBTPFhNiG0KeVgdxR47cmtfGnSB34ZsiEbV?= =?us-ascii?Q?zlqy192Fbtg2KENWukUBS3U1NVXc/e1i/wzuvlwOlTflqPwrx5qhqKRQCGCP?= =?us-ascii?Q?0jL+r3ccbsZvuih4VapxlEc4p1d2nfbMuWnKGDiC6bhOJo/bOMQTKQxko5cQ?= =?us-ascii?Q?ilNQ44zRb/PGEFqUDIzhHmpt0/p348EUJ2S96C4i2jfGqBBPaG9Cv3EU5q2o?= =?us-ascii?Q?BOg5nLmrhFvhU69ZBPDWEwBYh0IbiPCCaLTceBzg2AIB27qsZxyS6Ut39YvO?= =?us-ascii?Q?mLG4GbanpvssBewhPJPXzcwzpfXVVfROKIQrY2fPvVCPXVOHq1Bz+oFQGpaW?= =?us-ascii?Q?3SokYorHva/XUR69ZhBnolhwI9OzSLFZsmywkLxG217riXrqBMgdiUPrvAno?= =?us-ascii?Q?xqhL+Q44CegV8mqLifrzm6sOsqZTTpeBBOUdgkhfLq1napi+Tds+YWxjpS8m?= =?us-ascii?Q?MikofeFFwiPIKmuOM4YE582BEUlAxd1LmoTq/SvzjKYAe9xZY7cUzAitdxV2?= =?us-ascii?Q?iBfaRbBn6hibc4tPARoDyzOwHlN8h/N94FSpCEyAbA/0BKL+KEVmJxEOqfT1?= =?us-ascii?Q?ApLIQO4aj7pr7Hq/EAChY6i0TKVgmoPjETgRLpft0NBxcKRwu2Yejpw95CzO?= =?us-ascii?Q?Vbq2tv5b3IJs6khnt7C60DLzoNgIbW3KcLHSVMDWAp9fAsx/i1NtMtaTJSX+?= =?us-ascii?Q?ECboVIDImewMIwBVLsDUY5ZyUSZ7HlydETxYnMT9yX3HDUt5KTZ7+jhyCqQm?= =?us-ascii?Q?NfqIDay6QO0GPYTPzIh50cwvqJT8D5y32ts46XhTUE5/8gtsnwJ5F6mLZ4wF?= =?us-ascii?Q?fQSC+yozuZan5xlDlKL6w8vb4po50aWhioUe3XLPWDA0te013PVeFWcNYjTg?= =?us-ascii?Q?s2T15giotmzPtELXfuJtL+0e/XBINpYSzRphvMfbK2SZ7Ev5lvv4izt7L1cv?= =?us-ascii?Q?RtcTU2ichefFg=3D=3D?= X-Microsoft-Antispam-Message-Info: zxQ3ufJif02ksYbPLyOvCJrwl6SqijScAaSwRgLYZQRBi4PyYxU5kGWWQvhKsMaSs/Jh5XfNm+Bg4KRobrI01VrfcSaYHiSB4D8slgq+ZQ99P5rHw/5W7La7hPTtjzoXopGV+s+xAZWWsJpcaReOk4C3gttP3X2qNSz6A9+d0EQfiz7ySA2s9LqVsz8KfsMI X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 6:NVTzQs/YhgyrVpYyIy29pu9nklY1cpsf2+XpSk14PYdTBZkacmb2JIfMiO6A28Zle0+F3kBhOFATZtstOwJKgq0h69csOz6qLYfUC0qJitziVSqvvXizfToR8uFbpu0u9Z54dHvXEBVPzP/mZC++pc96/BtnKUj+ow/VYqyloAYkIthFoFaanwpkOhNpyhBIdw5Rt2/l88a9PY19bzbDy60RsLY4JYD2mY0sjiHVqTBS1n3C+UuqDE+wZYLfmad7CcoL4Me9NBhGRoHULFxgTULxYX9cvCRjUfQAi2cGeLo19AcU+H5LAuEe4c0gUjHwUlDPuYcCv5gODlVNIQouIr5I34JgcYcpTyZ2Rnu9yxxExhtQTdon1GxbSJ3HnemQfHtTL5Rc7Wj1MXtrUh/nAgyKrbv/EDf9ldAyKaVgEShzbt+afcof2IQmOQZ3nitTfRyc4ejYTrFHdpa2EYigkw==; 5:XXaqw2WIt8ID5IiuacS2kBwkNmY/QrOREfDTZ48p36NO717HN0O4Dk5mn+is4ony/fTpTRjRZFounCAjQaajhFT9R762RV+GOGxUkp1rqo7F8RCVXxDbY9lrgE/fB4rEA8axX/pgy9V9ATIt+HGb30gT9c9Szpo52aZImtXoEE0=; 24:vHYjv0NVKMNBYrslMX0Wu9q3YqpH/PuMRmFzKxU2dQu5PXPIRsaEtlrCXiILWIvddNm5fWL+j9IuhJcFi55jjuwjDGJ2att6cFLM7HLSSvA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 7:DCXy+1owGOEz93ElXLXh5/BbU8mguMg0TSE4AhUJioucX4Dorwr3l+xI4oqM6GHyJuNozRXBj+cJ/bzGTrMRIoYNETk6WwJXDC3E7Dbiu/5A6vFTG8YodaWVTS52tzcDnm8p52hWtkAceVg2ImGEx3oc2wLYyGlahQ9r+o1mt2s4EqYjwHQoDxMNtuxNMkbVYcCUt2L8PiZf33ZTj7vCOjdpztPNsfzXAg1rvCcX5hiK8yBLYPFTgo1aApcdll5l X-MS-Office365-Filtering-Correlation-Id: 8d75d565-a036-4ed5-4927-08d59fe14946 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Apr 2018 19:20:28.6719 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8d75d565-a036-4ed5-4927-08d59fe14946 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB2980 Subject: Re: [PATCH v1 04/18] 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: Wed, 11 Apr 2018 19:20:32 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Supreeth, On Fri, Apr 06, 2018 at 03:42:09PM +0100, 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 could still request ARM > TF to change the memory attributes of memory regions during > initialization. The commit message needs more detail to better flesh out why we are doing what we are doing here i.e. the StandaloneMm image is a FV that encapsulates the MM foundation and drivers. These are PE-COFF images with data and text segments. Arm TF does not have visibility of the contents of the FV. Moreover, the driver images are relocated upon dispatch. However, to initialise the MM environment, Arm TF has to create translation tables with sane default attributes for the memory occupied by the FV............ I am hoping you can extrapolate from here and clearly describe what problem this library solves. > > This patch adds a simple MMU library suitable for execution in S-EL0 and > requesting operations from higher exception levels. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Achin Gupta > Signed-off-by: Supreeth Venkatesh > --- > ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuSecLib.c | 146 ++++++++++++++++++++++++ > 1 file changed, 146 insertions(+) > create mode 100644 ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuSecLib.c > > diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuSecLib.c b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuSecLib.c I am not sure about the name of the library. ArmMmuSecLib sounds like an MMU library for the SEC phase in the Normal world. Can we call it ArmMmuSecStandaloneMmLib or similar. > new file mode 100644 > index 0000000000..56969e31d1 > --- /dev/null > +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuSecLib.c > @@ -0,0 +1,146 @@ > +/** @file > +* File managing the MMU for ARMv8 architecture in S-EL0 > +* > +* Copyright (c) 2017, ARM Limited. All rights reserved. Nit: Copyright 2018? For this and other files? > +* > +* 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 > +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; > + 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 > + ) > +{ > + return RequestMemoryPermissionChange(BaseAddress, > + Length, > + SET_MEM_ATTR_MAKE_PERM_REQUEST( \ > + SET_MEM_ATTR_DATA_PERM_RO, \ > + SET_MEM_ATTR_CODE_PERM_XN)); > +} > + > +EFI_STATUS > +ArmClearMemoryRegionNoExec ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + return RequestMemoryPermissionChange(BaseAddress, > + Length, > + SET_MEM_ATTR_MAKE_PERM_REQUEST( \ > + SET_MEM_ATTR_DATA_PERM_RO, \ > + SET_MEM_ATTR_CODE_PERM_X)); > +} > + > +EFI_STATUS > +ArmSetMemoryRegionReadOnly ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + return RequestMemoryPermissionChange(BaseAddress, > + Length, > + SET_MEM_ATTR_MAKE_PERM_REQUEST( \ > + SET_MEM_ATTR_DATA_PERM_RO, \ > + SET_MEM_ATTR_CODE_PERM_XN)); > +} > + > +EFI_STATUS > +ArmClearMemoryRegionReadOnly ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + return RequestMemoryPermissionChange(BaseAddress, > + Length, > + SET_MEM_ATTR_MAKE_PERM_REQUEST( \ > + SET_MEM_ATTR_DATA_PERM_RW, \ > + SET_MEM_ATTR_CODE_PERM_XN)); > +} The above four functions were written as prototypes in the edk2-staging branch. I do not think they are adequate for upstreaming since each function makes assumptions about the current data or instruction access permission of the input memory region instead of only doing what the function's name suggests. For example, ArmSetMemoryRegionNoExec() is supposed to only set the XN bit. However, it also sets the data access permission to RO. If the region was RW then this will lead to incorrect behaviour. Ditto for the other functions. We need a GetMemoryPermission() function that first uses the ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64 call to obtain the memory attributes of the input region. Each of the above functions must use this new function and only change the data or instruction permission attribute as appropriate. cheers, Achin > + > +EFI_STATUS > +EFIAPI > +ArmConfigureMmu ( > + IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable, > + OUT VOID **TranslationTableBase OPTIONAL, > + OUT UINTN *TranslationTableSize OPTIONAL > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +EFI_STATUS > +EFIAPI > +ArmMmuSecLibConstructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_MM_SYSTEM_TABLE *MmSystemTable > + ) > +{ > + return EFI_SUCCESS; > +} > -- > 2.16.2 >