From nobody Fri Dec 19 20:15:18 2025 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED9C712F36A; Mon, 26 Feb 2024 14:38:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708958300; cv=none; b=LWfSxdPljejcs5mYH/tuH9aPUDbUM/Tyfoj0+C75QAWaDF7M1AG9SLff3Kukxd4ja/5dojonDP5Kvqk9XN3ciE8pEK7TGfU8MqdoVlRXHbXv4r2fstChYQcp2gyFVlbl0IZW9sntdsNQmQRxfUzeHT4X6Cu7ZJsBkKvmWD5UgMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708958300; c=relaxed/simple; bh=wQWJDRe13cC/lAPr09l+aehtvQPpP+T7S4UcqUaG0oM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kN1KBNUUp58lHx0Xyc8I03vA0luST7lV6BzYhgywUAfhFJ/UeDffwiynTr4cyf8IyA2weCDOb3puqrnHNCXSNeUWHJlyp3T0PKgxUV9R+4naqHLervOw/W4jaYGZxEKz3qpJFvdolmcyKNmNWmv3lyt7UxJoXcX9FDqQV1CTWRk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BVB9AbnQ; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BVB9AbnQ" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-5c6bd3100fcso2387589a12.3; Mon, 26 Feb 2024 06:38:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1708958298; x=1709563098; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+RiTkMvyx33Aqiv75PkY1cAw5jxjHAa5YAVlUH/MwnE=; b=BVB9AbnQhzoWZYiW2pKJcB+Ah+Jgn1j1IluP9iWWRzUZH/UrL6wTMndJtEvJBU0j+w oUO9tN09s9x5MHAYrvgyGKkKa4rJrQVirm1jHhanH83reBlqljxN88DMCGT4CDhPK+WJ qPcdjF4+IFEp+SXhdA5SH6voduX3SAO6G8OYrkiyF2k4XsfbsPoD8hcmyw0M5sq8a0kM clqoYsOE9ZGlcOfRTwwof27AgkCAQ2T4bRWvvUc8XMKB4lCwZImxBfNlSkiT8TmvL3Gy yXRPUKEfhTXByDlSnsZ1MOS+aRnP0CZVulRfnHFp6qORSMFM7K9bwbBKKGVJvRO5VBZ9 RTJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708958298; x=1709563098; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+RiTkMvyx33Aqiv75PkY1cAw5jxjHAa5YAVlUH/MwnE=; b=ElefZ8huafonUv/Bh9GE44aRKeTXva33cN9akYm68Kkq6C5Nf4GlIzo6EQSZQd81L/ NnbTrbwwrZavPYZ/hG5l6dSzBZOoN8+vqV2drG8rq9r1OqCAuE6eBZAKaLrEcq3As2mf yA5gvmOYciA+HcZ1etBIbL8kEPeSDOtgbJ5nCgCtAkgbK0ao0NdrABVqYN3roqcDy1qy DgYX0LXv1IIjz5p4DFxzA+QeZZp6tfLyERux5F9si2SEIN1L8+rCepSpFbUkxnR3xB5m TkCuz/L+IXMvT49sWEvqQ3wcm473Krs3yUgh3bOM43eWN4gGqKSHmSVsGy/504wvvR8c TdJw== X-Forwarded-Encrypted: i=1; AJvYcCXkNPHbNSvNdSgpicPZGVUxcw9mPnCR7zDfsYgf03soHroCLkb38gz1ZNAdpEAp2x3HrihyNEZuo0i+RiqpMNFr3qNe X-Gm-Message-State: AOJu0YzIfuRSolwoiRBk2AOOVf8O/ODjpPrfLRXjBlNu+fd03FjfAvju pPainCMWRg7Z4BZNW5fVYjDPEg8FxkDU9MkolkPEiHpJ5ipKnCl56vfCPuYf X-Google-Smtp-Source: AGHT+IGS7+CQrWPm6z5nP1RqkHXHHk4aPrrGAQAjzn0ILkLtPs+kVghGUmCwm0mOuOTFyjaUkqS3Ww== X-Received: by 2002:a05:6a20:12cb:b0:1a0:e089:e25e with SMTP id v11-20020a056a2012cb00b001a0e089e25emr6228306pzg.46.1708958297873; Mon, 26 Feb 2024 06:38:17 -0800 (PST) Received: from localhost ([198.11.178.15]) by smtp.gmail.com with ESMTPSA id g11-20020a63e60b000000b005dbd0facb4dsm3930417pgh.61.2024.02.26.06.38.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 26 Feb 2024 06:38:17 -0800 (PST) From: Lai Jiangshan To: linux-kernel@vger.kernel.org Cc: Hou Wenlong , Lai Jiangshan , Linus Torvalds , Peter Zijlstra , Sean Christopherson , Thomas Gleixner , Borislav Petkov , Ingo Molnar , kvm@vger.kernel.org, Paolo Bonzini , x86@kernel.org, Kees Cook , Juergen Gross , Dave Hansen , "H. Peter Anvin" , Andy Lutomirski , Jonathan Corbet , Josh Poimboeuf , Yuntao Wang , Wang Jinchao Subject: [RFC PATCH 57/73] x86/pvm: Make cpu entry area and vmalloc area variable Date: Mon, 26 Feb 2024 22:36:14 +0800 Message-Id: <20240226143630.33643-58-jiangshanlai@gmail.com> X-Mailer: git-send-email 2.19.1.6.gb485710b In-Reply-To: <20240226143630.33643-1-jiangshanlai@gmail.com> References: <20240226143630.33643-1-jiangshanlai@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Hou Wenlong For the PVM guest, the entire kernel layout should be within the allowed virtual address range. Therefore, establish CPU_ENTRY_AREA_BASE and VMEMORY_END as a variable for the PVM guest, allowing it to be modified as necessary for the PVM guest. Signed-off-by: Hou Wenlong Signed-off-by: Lai Jiangshan --- arch/x86/include/asm/page_64.h | 3 +++ arch/x86/include/asm/pgtable_64_types.h | 14 ++++++++++++-- arch/x86/kernel/head64.c | 7 +++++++ arch/x86/mm/dump_pagetables.c | 3 ++- arch/x86/mm/kaslr.c | 4 ++-- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h index b8692e6cc939..4f64f049f3d0 100644 --- a/arch/x86/include/asm/page_64.h +++ b/arch/x86/include/asm/page_64.h @@ -18,6 +18,9 @@ extern unsigned long page_offset_base; extern unsigned long vmalloc_base; extern unsigned long vmemmap_base; =20 +extern unsigned long cpu_entry_area_base; +extern unsigned long vmemory_end; + static __always_inline unsigned long __phys_addr_nodebug(unsigned long x) { unsigned long y =3D x - KERNEL_MAP_BASE; diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm= /pgtable_64_types.h index 6780f2e63717..66c8e7325d27 100644 --- a/arch/x86/include/asm/pgtable_64_types.h +++ b/arch/x86/include/asm/pgtable_64_types.h @@ -140,6 +140,7 @@ extern unsigned int ptrs_per_p4d; # define VMEMMAP_START __VMEMMAP_BASE_L4 #endif /* CONFIG_DYNAMIC_MEMORY_LAYOUT */ =20 +#ifndef CONFIG_PVM_GUEST /* * End of the region for which vmalloc page tables are pre-allocated. * For non-KMSAN builds, this is the same as VMALLOC_END. @@ -147,6 +148,10 @@ extern unsigned int ptrs_per_p4d; * VMALLOC_START..VMALLOC_END (see below). */ #define VMEMORY_END (VMALLOC_START + (VMALLOC_SIZE_TB << 40) - 1) +#else +#define RAW_VMEMORY_END (__VMALLOC_BASE_L4 + (VMALLOC_SIZE_TB_L4 << 40) -= 1) +#define VMEMORY_END vmemory_end +#endif /* CONFIG_PVM_GUEST */ =20 #ifndef CONFIG_KMSAN #define VMALLOC_END VMEMORY_END @@ -166,7 +171,7 @@ extern unsigned int ptrs_per_p4d; * KMSAN_MODULES_ORIGIN_START to * KMSAN_MODULES_ORIGIN_START + MODULES_LEN - origins for mod= ules. */ -#define VMALLOC_QUARTER_SIZE ((VMALLOC_SIZE_TB << 40) >> 2) +#define VMALLOC_QUARTER_SIZE ((VMEMORY_END + 1 - VMALLOC_START) >> 2) #define VMALLOC_END (VMALLOC_START + VMALLOC_QUARTER_SIZE - 1) =20 /* @@ -202,7 +207,12 @@ extern unsigned int ptrs_per_p4d; #define ESPFIX_BASE_ADDR (ESPFIX_PGD_ENTRY << P4D_SHIFT) =20 #define CPU_ENTRY_AREA_PGD _AC(-4, UL) -#define CPU_ENTRY_AREA_BASE (CPU_ENTRY_AREA_PGD << P4D_SHIFT) +#define RAW_CPU_ENTRY_AREA_BASE (CPU_ENTRY_AREA_PGD << P4D_SHIFT) +#ifdef CONFIG_PVM_GUEST +#define CPU_ENTRY_AREA_BASE cpu_entry_area_base +#else +#define CPU_ENTRY_AREA_BASE RAW_CPU_ENTRY_AREA_BASE +#endif =20 #define EFI_VA_START ( -4 * (_AC(1, UL) << 30)) #define EFI_VA_END (-68 * (_AC(1, UL) << 30)) diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 0b0e460609e5..d0e8d648bd38 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -72,6 +72,13 @@ unsigned long kernel_map_base __ro_after_init =3D __STAR= T_KERNEL_map; EXPORT_SYMBOL(kernel_map_base); #endif =20 +#ifdef CONFIG_PVM_GUEST +unsigned long cpu_entry_area_base __ro_after_init =3D RAW_CPU_ENTRY_AREA_B= ASE; +EXPORT_SYMBOL(cpu_entry_area_base); +unsigned long vmemory_end __ro_after_init =3D RAW_VMEMORY_END; +EXPORT_SYMBOL(vmemory_end); +#endif + /* Wipe all early page tables except for the kernel symbol map */ static void __init reset_early_page_tables(void) { diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c index d5c6f61242aa..166c7d36d8ff 100644 --- a/arch/x86/mm/dump_pagetables.c +++ b/arch/x86/mm/dump_pagetables.c @@ -95,7 +95,7 @@ static struct addr_marker address_markers[] =3D { #ifdef CONFIG_MODIFY_LDT_SYSCALL [LDT_NR] =3D { 0UL, "LDT remap" }, #endif - [CPU_ENTRY_AREA_NR] =3D { CPU_ENTRY_AREA_BASE,"CPU entry Area" }, + [CPU_ENTRY_AREA_NR] =3D { 0UL, "CPU entry Area" }, #ifdef CONFIG_X86_ESPFIX64 [ESPFIX_START_NR] =3D { ESPFIX_BASE_ADDR, "ESPfix Area", 16 }, #endif @@ -479,6 +479,7 @@ static int __init pt_dump_init(void) address_markers[MODULES_VADDR_NR].start_address =3D MODULES_VADDR; address_markers[MODULES_END_NR].start_address =3D MODULES_END; address_markers[FIXADDR_START_NR].start_address =3D FIXADDR_START; + address_markers[CPU_ENTRY_AREA_NR].start_address =3D CPU_ENTRY_AREA_BASE; #endif #ifdef CONFIG_X86_32 address_markers[VMALLOC_START_NR].start_address =3D VMALLOC_START; diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c index 37db264866b6..e3825c7542a3 100644 --- a/arch/x86/mm/kaslr.c +++ b/arch/x86/mm/kaslr.c @@ -38,7 +38,7 @@ * highest amount of space for randomization available, but that's too hard * to keep straight and caused issues already. */ -static const unsigned long vaddr_end =3D CPU_ENTRY_AREA_BASE; +static const unsigned long vaddr_end =3D RAW_CPU_ENTRY_AREA_BASE; =20 /* * Memory regions randomized by KASLR (except modules that use a separate = logic @@ -79,7 +79,7 @@ void __init kernel_randomize_memory(void) * limited.... */ BUILD_BUG_ON(vaddr_start >=3D vaddr_end); - BUILD_BUG_ON(vaddr_end !=3D CPU_ENTRY_AREA_BASE); + BUILD_BUG_ON(vaddr_end !=3D RAW_CPU_ENTRY_AREA_BASE); BUILD_BUG_ON(vaddr_end > __START_KERNEL_map); =20 if (!kaslr_memory_enabled()) --=20 2.19.1.6.gb485710b