Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2938138lqp; Mon, 25 Mar 2024 13:46:07 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWTULY7TvlIEx57X8+DMhUWoKQdu1LkA8ULHiTf2Sc15sk0FXM0/6YxrIcj4aUFioSdFgc0qthZeynKxT0PYkpWAYLpXYiPRmbUGX5QmA== X-Google-Smtp-Source: AGHT+IGjKg7jkWcow0lZRiHz21PX3MPlp09tJYLVHNeQxCqjjK+xu+lDzYln1ezSzo7ETuhmKbGo X-Received: by 2002:a05:6a21:3293:b0:1a3:5fb7:42ab with SMTP id yt19-20020a056a21329300b001a35fb742abmr10101392pzb.59.1711399567034; Mon, 25 Mar 2024 13:46:07 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711399567; cv=pass; d=google.com; s=arc-20160816; b=LG6k7id74mIQzaiNnb2pWNQhPkW0tOiN0pPQ41e6nUkPz7rjxRwTfXQlhw5xexwe9b H0Ypj40B9FnyWT0JTir1ZGeyUXfqwKbjaLJyURgz4ExI4Eflk8ElaPicNmBP940Mm8rI Acdh0unUDFFOdsQAWsAaEWQLgKYoZSBdmgEY6yDYxfhzLfI1i1O6H34NitijtqaCw7qh vY96vHllSayvp3GFhYdchlvWY8dMbGvB0GTLAaZ6e7OuB3S1UhjKwogNRAlrPIb3oI0X 5naXIcsMVbUK6bZOofpTWtneHE2elttKR23enePCZqpJ9kDP6+102fWWS9TqiWWgIacV 7r+w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=IEO2eQEvgDaklAoxcYA+730sOUIJ5bJ55h/a8nOBnCk=; fh=/Ak5C2ws7sfmtivYsSuDzWsPTaU4mDhR0lpxQ6qr3D0=; b=lpveuda+jUvtKeFVtLDpjsSuDvjHYXjypVlzuI7xo7TGjza5X+EX2dXMfMjnuglrla OVtDlBbEA3wcqcZd8g6m8JuDqeKtepAgeLkfReIFQpqTANjys9CgWj5nzYBCOrQyphTV NXIc+O3VyzGF3prDe22lWe8wHVaiXc2yvgZ9Fr6cJujO4O6VgFbNwxlEz5Bz3hcBQt6N AJHvK7XXwLzVMHx2HMIvGXRltkvhJ/j6LIK60jV8s1pOrW79Xu2YgDBG3yXCIDgcGpiq aFuUrfiXfGYUZ/rxmrc2WyNlnyQzg4BOPKEwGUpVyN1J47xgWpFmP0gM8XSorlnxO4cN 033A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=V1fqCxiA; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-116866-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-116866-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id z3-20020aa79903000000b006e70c4de7e5si5795634pff.152.2024.03.25.13.46.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 13:46:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-116866-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=V1fqCxiA; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-116866-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-116866-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id B2BA2BA3508 for ; Mon, 25 Mar 2024 14:29:56 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5A1531C088A; Mon, 25 Mar 2024 11:25:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="V1fqCxiA" Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 61820149C7C for ; Mon, 25 Mar 2024 10:40:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.14 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711363224; cv=none; b=OgBQtnApDvb0Wp7C+5oL6KwwNqNfIsjmsUXILUolHF7NFC9kPczNhfoT4B5AHRogmZKEnbON7v711slfFNDr6eYoChFb5fdng2yX6Vhfl6VC5NZCyUU4Nh00RN9krMdWa8FBPleWvfQ4xo/thmjWxVzmmBvPsFfty1ADC3d2PeI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711363224; c=relaxed/simple; bh=yAqWzbGmFNX9PCf901KN8YCyCCxd1h65J2N/iDwm1h8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aE40TQ/UdRVlAdJhEZ+xiwaC92XWxaXQU95KHk43stMquQs8V329CcHGMtq3wV8R/dVMmANLkE0UBCinPo6+qPZu2WkMpnLpI9Qh42Yt9Ux95hczY4h6+TxSs23z2myn5KHW8X/1oIVttxaFummq+2ri3P6OQr1GB/c5wnbKais= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.helo=mgamail.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=V1fqCxiA; arc=none smtp.client-ip=192.198.163.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.helo=mgamail.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711363222; x=1742899222; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yAqWzbGmFNX9PCf901KN8YCyCCxd1h65J2N/iDwm1h8=; b=V1fqCxiAF4+PsIK20g1l/7lAbl/sGknQdSKcf9pTjQAJ6uLnRrZZ1GvA qeHhIIZJGK+y38R9HFYcwvLuoV6jivl3COdvAyIoeZEhxOQQjOp/zYGJe 2lrahEbdtJcKvTwrIOOSUII2fgtW+qJ4ZWRQ4g0gA0MtG+6r8i7p2r+Hu mtGOhK9/KRihkQ7kYbWq3/rF6T5e6gcZPrkLr2URpcszPg6yNTPp36P+P dlujhbw8EvezbiW5JSw98P9gfzpWvuViV6Lq9LT6X939NkIpCcwsxmBQ6 22LGz7ZkpnZnWSzO+P7FJJrERDZh1+E6rlfjOATDYlHuAGPeaiscmwB9v g==; X-IronPort-AV: E=McAfee;i="6600,9927,11023"; a="6561435" X-IronPort-AV: E=Sophos;i="6.07,152,1708416000"; d="scan'208";a="6561435" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2024 03:40:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,11023"; a="937070165" X-IronPort-AV: E=Sophos;i="6.07,152,1708416000"; d="scan'208";a="937070165" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 25 Mar 2024 03:40:11 -0700 Received: by black.fi.intel.com (Postfix, from userid 1000) id 4C97C233; Mon, 25 Mar 2024 12:40:05 +0200 (EET) From: "Kirill A. Shutemov" To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org Cc: "Rafael J. Wysocki" , Peter Zijlstra , Adrian Hunter , Kuppuswamy Sathyanarayanan , Elena Reshetova , Jun Nakajima , Rick Edgecombe , Tom Lendacky , "Kalra, Ashish" , Sean Christopherson , "Huang, Kai" , Baoquan He , kexec@lists.infradead.org, linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" , Nikolay Borisov Subject: [PATCHv9 09/17] x86/mm: Adding callbacks to prepare encrypted memory for kexec Date: Mon, 25 Mar 2024 12:39:03 +0200 Message-ID: <20240325103911.2651793-10-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240325103911.2651793-1-kirill.shutemov@linux.intel.com> References: <20240325103911.2651793-1-kirill.shutemov@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit AMD SEV and Intel TDX guests allocate shared buffers for performing I/O. This is done by allocating pages normally from the buddy allocator and then converting them to shared using set_memory_decrypted(). On kexec, the second kernel is unaware of which memory has been converted in this manner. It only sees E820_TYPE_RAM. Accessing shared memory as private is fatal. Therefore, the memory state must be reset to its original state before starting the new kernel with kexec. The process of converting shared memory back to private occurs in two steps: - enc_kexec_stop_conversion() stops new conversions. - enc_kexec_unshare_mem() unshares all existing shared memory, reverting it back to private. Signed-off-by: Kirill A. Shutemov Reviewed-by: Nikolay Borisov x --- arch/x86/include/asm/x86_init.h | 2 ++ arch/x86/kernel/crash.c | 6 ++++++ arch/x86/kernel/reboot.c | 12 ++++++++++++ arch/x86/kernel/x86_init.c | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 4770af4d6015..f7c7d692407f 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -154,6 +154,8 @@ struct x86_guest { int (*enc_status_change_finish)(unsigned long vaddr, int npages, bool enc); bool (*enc_tlb_flush_required)(bool enc); bool (*enc_cache_flush_required)(void); + void (*enc_kexec_stop_conversion)(bool crash); + void (*enc_kexec_unshare_mem)(void); }; /** diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index e74d0c4286c1..7a1560d7e62d 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c @@ -128,6 +128,12 @@ void native_machine_crash_shutdown(struct pt_regs *regs) #ifdef CONFIG_HPET_TIMER hpet_disable(); #endif + + if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) { + x86_platform.guest.enc_kexec_stop_conversion(true); + x86_platform.guest.enc_kexec_unshare_mem(); + } + crash_save_cpu(regs, safe_smp_processor_id()); } diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index f3130f762784..1ec478f40963 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -716,6 +717,14 @@ static void native_machine_emergency_restart(void) void native_machine_shutdown(void) { + /* + * Call enc_kexec_stop_conversion() while all CPUs are still active and + * interrupts are enabled. This will allow all in-flight memory + * conversions to finish cleanly. + */ + if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) && kexec_in_progress) + x86_platform.guest.enc_kexec_stop_conversion(false); + /* Stop the cpus and apics */ #ifdef CONFIG_X86_IO_APIC /* @@ -752,6 +761,9 @@ void native_machine_shutdown(void) #ifdef CONFIG_X86_64 x86_platform.iommu_shutdown(); #endif + + if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) && kexec_in_progress) + x86_platform.guest.enc_kexec_unshare_mem(); } static void __machine_emergency_restart(int emergency) diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index 69413ca37bfe..ab97d9b57636 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -136,6 +136,8 @@ static int enc_status_change_prepare_noop(unsigned long vaddr, int npages, bool static int enc_status_change_finish_noop(unsigned long vaddr, int npages, bool enc) { return 0; } static bool enc_tlb_flush_required_noop(bool enc) { return false; } static bool enc_cache_flush_required_noop(void) { return false; } +static void enc_kexec_stop_conversion_noop(bool crash) {} +static void enc_kexec_unshare_mem_noop(void) {} static bool is_private_mmio_noop(u64 addr) {return false; } struct x86_platform_ops x86_platform __ro_after_init = { @@ -159,6 +161,8 @@ struct x86_platform_ops x86_platform __ro_after_init = { .enc_status_change_finish = enc_status_change_finish_noop, .enc_tlb_flush_required = enc_tlb_flush_required_noop, .enc_cache_flush_required = enc_cache_flush_required_noop, + .enc_kexec_stop_conversion = enc_kexec_stop_conversion_noop, + .enc_kexec_unshare_mem = enc_kexec_unshare_mem_noop, }, }; -- 2.43.0