Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp8611520rwb; Thu, 24 Nov 2022 01:47:37 -0800 (PST) X-Google-Smtp-Source: AA0mqf4D9rfZaeO4TbKpvwzkncmypZVs4fYtSFgb0Z23DhPulmQd0+vAKlWi7sRsw5GuIGAYP+1f X-Received: by 2002:a17:906:198d:b0:7a5:f8a5:6f84 with SMTP id g13-20020a170906198d00b007a5f8a56f84mr10044714ejd.569.1669283256990; Thu, 24 Nov 2022 01:47:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669283256; cv=none; d=google.com; s=arc-20160816; b=ZjZwt6Yh2YLBn77Ssx/T4fIAc+veZXYKILUxVMhcgRk3C80Sl1Rax3I1Ny35SiszSA JP0ObOE7FKJFk4NolVmH3bNbTLVOCPY+txkPE/tKntBHlPr9iy7Zn79Ki8wCpmE4R5R6 m//m07IabCHXfrN9Za35NI+TFkpXxnBVMb2TnZTfQBNig4LoHNfJS2KSh+sika71i69q MqpwZY5bLqjxUVVvik6Q1nW475VfdDP4Hmf+/LAPXgzfZ7nKVZTtp7TEZ8/Vi3+9o/jE 80iyL6+po8IaD4DAddxDpuibFEvQazU9gBA9MhXzlEv35idguVLODo632ewSVK1ETOVI IhaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:subject:user-agent:mime-version:date:message-id; bh=70owM8NZWGvmXq4MULaWKv6VhXUy9WJomA1ldya+5SY=; b=sLjjsq8H0ZFYzLCzWUU6v3/Cw545mRRIbEj84MAhf5I8R7t/fKs+siy4dzCb+qSb51 toG8LESJ+81gPYKkq79Aw6028pyNe3mg7mVNUTjBTcvjPeD0m/C23nxGyOdgkkvl5XPb SZ/1D6qh0PZMESw9poUcB+/5VuNVrdOz/NYAuLdqxR1dvR7kBOIXRSHrnHfdWtMqqwu0 7/KjJiL/e11CFHTcLezzr6FUbhrPMvXmFJ8n2W8QN+Rp+a/Bg993TbUgbVkAEh941mjE C7AKv22FZC9MDBZC+YD05SNFNA07sOo/KsIMuGn0SagEEEmxQLVYtnCRIiJb0BBej19n hwUw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id xj14-20020a170906db0e00b007a641e472f0si572678ejb.139.2022.11.24.01.47.16; Thu, 24 Nov 2022 01:47:36 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229798AbiKXJhV (ORCPT + 88 others); Thu, 24 Nov 2022 04:37:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229916AbiKXJhM (ORCPT ); Thu, 24 Nov 2022 04:37:12 -0500 Received: from out30-43.freemail.mail.aliyun.com (out30-43.freemail.mail.aliyun.com [115.124.30.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E7ECE125214 for ; Thu, 24 Nov 2022 01:37:09 -0800 (PST) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R101e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046056;MF=zelin.deng@linux.alibaba.com;NM=1;PH=DS;RN=5;SR=0;TI=SMTPD_---0VVaaGVU_1669282625; Received: from 30.97.48.192(mailfrom:zelin.deng@linux.alibaba.com fp:SMTPD_---0VVaaGVU_1669282625) by smtp.aliyun-inc.com; Thu, 24 Nov 2022 17:37:06 +0800 Message-ID: Date: Thu, 24 Nov 2022 17:37:04 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 Subject: Re: [PATCH 2/2] x86/setup: Preserve _ENC flag when initrd is being relocated To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Tom Lendacky , Thomas Gleixner , Borislav Petkov References: <20221124091246.4957-1-zelin.deng@linux.alibaba.com> <20221124091246.4957-3-zelin.deng@linux.alibaba.com> From: Zelin Deng In-Reply-To: <20221124091246.4957-3-zelin.deng@linux.alibaba.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, ENV_AND_HDR_SPF_MATCH,NICE_REPLY_A,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 在 2022/11/24 17:12, Zelin Deng 写道: > Commit 107cd2532181 ("Encrypt the initrd earlier for BSP microcode update") > when SME is enabled, initrd will be encrypted at earlier stage. If > initrd is located at e820 reserved area the initrd will be copied to > direct mapping area in relocate_initrd(). > > In this case source address of initrd should be mapped as encrypted > while copy_from_early_mem() will clear encrypted attribute as the source > address is not in kernel usable area, therefore relocated initrd is > encrypted data and is not able to be unpacked later. > > Add new function copy_early_initrd() to preserve _ENC flag in setup.c > and remove copy_from_early_mem() as it's only used once here by x86. > > Signed-off-by: Zelin Deng > --- > arch/x86/kernel/setup.c | 30 ++++++++++++++++++++++++++++- > include/asm-generic/early_ioremap.h | 6 ------ > mm/early_ioremap.c | 21 -------------------- > 3 files changed, 29 insertions(+), 28 deletions(-) > > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c > index 56deaf37e508..f9996982f026 100644 > --- a/arch/x86/kernel/setup.c > +++ b/arch/x86/kernel/setup.c > @@ -260,6 +260,34 @@ static u64 __init get_ramdisk_size(void) > return ramdisk_size; > } > > +#define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) > + > +static void __init copy_early_initrd(void *dest, phys_addr_t src, > + unsigned long size) > +{ > + unsigned long slop, clen; > + char *p; > + > + while (size) { > + slop = offset_in_page(src); > + clen = size; > + if (clen > MAX_MAP_CHUNK - slop) > + clen = MAX_MAP_CHUNK - slop; > + /* > + * _ENC flag should be preserved so that when SME is enabled initrd > + * can be mapped as encrypted, as it had been encrypted earlier. > + * This flag won't impact on other platforms like TDX/SEV enabled. > + */ > + p = early_memremap_prot(src & PAGE_MASK, clen + slop, > + pgprot_val(FIXMAP_PAGE_NORMAL)); Sorry my mistake, perhaps cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) should be added here to determine if we are in guest to adjust the pgprot. The scenarios in which initrd should not be encrypted are "SME not enabled" and in tdx host? Looks like _ENC flag is not enough. > + memcpy(dest, p + slop, clen); > + early_memunmap(p, clen + slop); > + dest += clen; > + src += clen; > + size -= clen; > + } > +} > + > static void __init relocate_initrd(void) > { > /* Assume only end is not page aligned */ > @@ -279,7 +307,7 @@ static void __init relocate_initrd(void) > printk(KERN_INFO "Allocated new RAMDISK: [mem %#010llx-%#010llx]\n", > relocated_ramdisk, relocated_ramdisk + ramdisk_size - 1); > > - copy_from_early_mem((void *)initrd_start, ramdisk_image, ramdisk_size); > + copy_early_initrd((void *)initrd_start, ramdisk_image, ramdisk_size); > > printk(KERN_INFO "Move RAMDISK from [mem %#010llx-%#010llx] to" > " [mem %#010llx-%#010llx]\n", > diff --git a/include/asm-generic/early_ioremap.h b/include/asm-generic/early_ioremap.h > index 9d0479f50f97..be1ce406f481 100644 > --- a/include/asm-generic/early_ioremap.h > +++ b/include/asm-generic/early_ioremap.h > @@ -32,12 +32,6 @@ extern void early_ioremap_setup(void); > */ > extern void early_ioremap_reset(void); > > -/* > - * Early copy from unmapped memory to kernel mapped memory. > - */ > -extern void copy_from_early_mem(void *dest, phys_addr_t src, > - unsigned long size); > - > #else > static inline void early_ioremap_init(void) { } > static inline void early_ioremap_setup(void) { } > diff --git a/mm/early_ioremap.c b/mm/early_ioremap.c > index 9bc12e526ed0..86b68d63ad35 100644 > --- a/mm/early_ioremap.c > +++ b/mm/early_ioremap.c > @@ -245,27 +245,6 @@ early_memremap_prot(resource_size_t phys_addr, unsigned long size, > } > #endif > > -#define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) > - > -void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) > -{ > - unsigned long slop, clen; > - char *p; > - > - while (size) { > - slop = offset_in_page(src); > - clen = size; > - if (clen > MAX_MAP_CHUNK - slop) > - clen = MAX_MAP_CHUNK - slop; > - p = early_memremap(src & PAGE_MASK, clen + slop); > - memcpy(dest, p + slop, clen); > - early_memunmap(p, clen + slop); > - dest += clen; > - src += clen; > - size -= clen; > - } > -} > - > #else /* CONFIG_MMU */ > > void __init __iomem *