From patchwork Fri Jan 4 11:03:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154763 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp495840ljp; Fri, 4 Jan 2019 03:03:53 -0800 (PST) X-Google-Smtp-Source: AFSGD/VyrR23Gr5h4q8JqSqj3n++Ig3gO4EenaHlulAXCFhg8m3F1tM8/8UOyQS/tsSqcqLt46Fu X-Received: by 2002:a62:1709:: with SMTP id 9mr51392854pfx.249.1546599833844; Fri, 04 Jan 2019 03:03:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546599833; cv=none; d=google.com; s=arc-20160816; b=o6mcGL8Z4gxK8Y5/JeYQUICLoeNOH4tiEjYhDsdCXtfwVf868I5Oq73q4vrCcQWFKe 1WTEhCrEsPaPYd1hI444VnX23TQaWOVe5PbnpoJlczDVmVMO5MDHCtVIic4zEJMoIHmI h2e7exBcO4vYY6PN7pV7dRtI/QiCL4Un4W7qY8fdKO6deGGFDyFqhUlRCVhzuZd6ccCR /pJ1gZDk+WWlHdlpR4xT33zHzZ8Js3xcgDHc6+1WXgO6Q0ZatC5N/QMmKzh/nWadmGSF TdTw1rCb8FZA6aylQZB53ZVeUYt8Lhz269ju3fmn944FXHeJ3d4xgnc/t0SKcaTE3Aoj yffQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=tLfNZpDCeNZLyd+WXsPiZ5lKeAdjeNat/1/zqj4aDfE=; b=tQegU4710/oGBuKkxBgogGaA93EP4n64+aPF+XidiaUPGnEgsocQBwEjcB+C4TD8vT 94WAcOxVPGE/6QrNlmdlQV6ikTlPBGpCjdxXTnzJs/cl/eCJoooStaH8AYDykXDe3kHV pl4RehxrDCmszMqCeDm8ZJ9YzQEZWntXH3fnCz3toPlGwbf4sEOlTbdEXKlnrinfpOS+ 7FDvZPOSB3kxQejqQQ6/6OXv6KwWmtOQZseNFrYiQfZdtJJcPg0tMMFly8VS8AOZF544 WNR4YDwZv08+dA0HjLAXlJMTqdZv20PCdm4BYAaMgoO4L8pwqkT5HZhubICGXbR+g9AH cvHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=GcpZEL0o; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id 31si18441153plh.274.2019.01.04.03.03.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 04 Jan 2019 03:03:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=GcpZEL0o; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 9BFEB211AE8CC; Fri, 4 Jan 2019 03:03:37 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::541; helo=mail-ed1-x541.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) (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 6B3972194D3B3 for ; Fri, 4 Jan 2019 03:03:36 -0800 (PST) Received: by mail-ed1-x541.google.com with SMTP id p6so31528440eds.0 for ; Fri, 04 Jan 2019 03:03:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ad37yiUnIdvmQ2MIoF2Y5MrPv5IM3gX5MH7CXAHxH84=; b=GcpZEL0ooNStMPVrfpg5IFvnhqYD8AJkKUbsTclPup1E/tlDBzJb/5y58BZiR3Zbc2 hVV7/z0rWpcz0+uLy+w7c+BQPxRh4IP+8rcVgu1gvPS3c5OSztwuGb9YC833TOrgdWgD 7PN+tRJ/7j7xuRvrhMNtadWgNVvjdhuFU/wGQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ad37yiUnIdvmQ2MIoF2Y5MrPv5IM3gX5MH7CXAHxH84=; b=Mg2xauw1pBkqEo9eP+03qDr5x+X9QJZU7zoDRfD9VLp4WleDakM8ZQdh592bhMZxrC izN7UmQ7tWzfMHUCJB8caEe9LL3hNE2Ti8DJDyZDL8lc+vLusPSwkpSFa6rXQXYNOTOm KLXVELf0XTb3XNdLJ5+WCS08PW0XOx4iWwRNGcqy786OaeP0CAcTM1Fh6BVhBsvBT6e8 hwZCMXgcG4So32eo4eSxyOjHPrLI0Yub1ye92rwh07iECZHEGRZJZIbwgMtQDb77r+/5 4/nPsUKcoeBqaQPtOH/VtAgYRTtKH1tGvFGMcoeQ37fDBTlVRYCB+MWhGXU8d0A19Hsb Nw1g== X-Gm-Message-State: AA+aEWYMSVOWQVFiiT6Qiw/y47c3VuwUi+Tb2BKqlyZvc/9H6XLr5A45 LYglATRN158YVH/M8HViHhAO+7QdT9DjAw== X-Received: by 2002:a50:cdd0:: with SMTP id h16mr46899151edj.151.1546599814765; Fri, 04 Jan 2019 03:03:34 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id n11sm26650578edn.14.2019.01.04.03.03.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 04 Jan 2019 03:03:34 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Fri, 4 Jan 2019 12:03:15 +0100 Message-Id: <20190104110315.18339-9-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190104110315.18339-1-ard.biesheuvel@linaro.org> References: <20190104110315.18339-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 8/8] StandaloneMmPkg/Core: permit encapsulated firmware volumes X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jiewen Yao MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Standalone MM requires 4 KB section alignment for all images, so that strict permissions can be applied. Unfortunately, this results in a lot of wasted space, which is usually costly in the secure world environment that standalone MM is expected to operate in. So let's permit the standalone MM drivers (but not the core) to be delivered in a compressed firmware volume. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- StandaloneMmPkg/Core/FwVol.c | 99 ++++++++++++++++++-- StandaloneMmPkg/Core/StandaloneMmCore.inf | 1 + StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c | 5 + StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf | 3 + 4 files changed, 99 insertions(+), 9 deletions(-) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c index 5abf98c24797..d95491f252f9 100644 --- a/StandaloneMmPkg/Core/FwVol.c +++ b/StandaloneMmPkg/Core/FwVol.c @@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "StandaloneMmCore.h" #include +#include // // List of file types supported by dispatcher @@ -65,15 +66,25 @@ Returns: --*/ { - EFI_STATUS Status; - EFI_STATUS DepexStatus; - EFI_FFS_FILE_HEADER *FileHeader; - EFI_FV_FILETYPE FileType; - VOID *Pe32Data; - UINTN Pe32DataSize; - VOID *Depex; - UINTN DepexSize; - UINTN Index; + EFI_STATUS Status; + EFI_STATUS DepexStatus; + EFI_FFS_FILE_HEADER *FileHeader; + EFI_FV_FILETYPE FileType; + VOID *Pe32Data; + UINTN Pe32DataSize; + VOID *Depex; + UINTN DepexSize; + UINTN Index; + EFI_COMMON_SECTION_HEADER *Section; + VOID *SectionData; + UINTN SectionDataSize; + UINT32 DstBufferSize; + VOID *ScratchBuffer; + UINT32 ScratchBufferSize; + VOID *DstBuffer; + UINT16 SectionAttribute; + UINT32 AuthenticationStatus; + EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader; DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader)); @@ -83,6 +94,71 @@ Returns: FvIsBeingProcesssed (FwVolHeader); + // + // First check for encapsulated compressed firmware volumes + // + FileHeader = NULL; + do { + Status = FfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, + FwVolHeader, &FileHeader); + if (EFI_ERROR (Status)) { + break; + } + Status = FfsFindSectionData (EFI_SECTION_GUID_DEFINED, FileHeader, + &SectionData, &SectionDataSize); + if (EFI_ERROR (Status)) { + break; + } + Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1); + Status = ExtractGuidedSectionGetInfo (Section, &DstBufferSize, + &ScratchBufferSize, &SectionAttribute); + if (EFI_ERROR (Status)) { + break; + } + + // + // Allocate scratch buffer + // + ScratchBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize)); + if (ScratchBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Allocate destination buffer, extra one page for adjustment + // + DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize)); + if (DstBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Call decompress function + // + Status = ExtractGuidedSectionDecode (Section, &DstBuffer, ScratchBuffer, + &AuthenticationStatus); + FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize)); + if (EFI_ERROR (Status)) { + goto FreeDstBuffer; + } + + DEBUG ((DEBUG_INFO, + "Processing compressed firmware volume (AuthenticationStatus == %x)\n", + AuthenticationStatus)); + + Status = FindFfsSectionInSections (DstBuffer, DstBufferSize, + EFI_SECTION_FIRMWARE_VOLUME_IMAGE, &Section); + if (EFI_ERROR (Status)) { + goto FreeDstBuffer; + } + + InnerFvHeader = (VOID *)(Section + 1); + Status = MmCoreFfsFindMmDriver (InnerFvHeader); + if (EFI_ERROR (Status)) { + goto FreeDstBuffer; + } + } while (TRUE); + for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); Index++) { DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", mMmFileTypes[Index])); FileType = mMmFileTypes[Index]; @@ -100,5 +176,10 @@ Returns: } while (!EFI_ERROR (Status)); } + return EFI_SUCCESS; + +FreeDstBuffer: + FreePages (DstBuffer, EFI_SIZE_TO_PAGES (DstBufferSize)); + return Status; } diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.inf b/StandaloneMmPkg/Core/StandaloneMmCore.inf index ff2b8b9cef03..83d31e2d92c5 100644 --- a/StandaloneMmPkg/Core/StandaloneMmCore.inf +++ b/StandaloneMmPkg/Core/StandaloneMmCore.inf @@ -49,6 +49,7 @@ [LibraryClasses] BaseMemoryLib CacheMaintenanceLib DebugLib + ExtractGuidedSectionLib FvLib HobLib MemoryAllocationLib diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c index 5cca532456fd..67ff9112d5c0 100644 --- a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c +++ b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c @@ -205,6 +205,8 @@ GetSpmVersion (VOID) return Status; } +STATIC UINT64 mExtractGuidedSectionHandlerInfo[64]; + /** The entry point of Standalone MM Foundation. @@ -285,6 +287,9 @@ _ModuleEntryPoint ( goto finish; } + PcdSet64 (PcdGuidedExtractHandlerTableAddress, + (UINT64)mExtractGuidedSectionHandlerInfo); + // // Create Hoblist based upon boot information passed by privileged software // diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf index 769eaeeefbea..55d769fa77e4 100644 --- a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf +++ b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf @@ -54,3 +54,6 @@ [Guids] gEfiMmPeiMmramMemoryReserveGuid gEfiStandaloneMmNonSecureBufferGuid gEfiArmTfCpuDriverEpDescriptorGuid + +[PatchPcd] + gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress