Received: by 2002:a05:7208:9594:b0:7e:5202:c8b4 with SMTP id gs20csp1356368rbb; Mon, 26 Feb 2024 06:57:45 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCXWFW8kDc1tIXVgH8sME2Kr2w5+OpaZfwLTSipG8U4CuG/4JWfaqFkYXSTXQGK3Aqh0eUUfOk09jKR0prDJVyc7h54Mkm/ZZmGCl0+EKg== X-Google-Smtp-Source: AGHT+IGiYbxIGgDLmughENC0Mbv27QruJmkB5PvNaAmadqNdvC6oiqgiT4gcROKCkKoK6SHNk358 X-Received: by 2002:a05:620a:4594:b0:787:86ab:1595 with SMTP id bp20-20020a05620a459400b0078786ab1595mr13354864qkb.31.1708959465440; Mon, 26 Feb 2024 06:57:45 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708959465; cv=pass; d=google.com; s=arc-20160816; b=mjmxNamcF4aqd/0Lk9lWHDVQRSN71TsHqhNkhwlB0tnLp5caytqU4Q748RxMaag+tf cc110xwLUBKiV2uYhsR7CTAVUHARj9UNbNhOX59NA/hS2UOPgfEC/5nFzifwHZKtH5T0 smKlOeK71BzBr+1WDwl71nDrS0/EaHE4dsdoW0XEcfmzyUkdQnhfIFikyBpzIQtng2iO Uv5ysnbmGORC4XRiATqmkmX3Wv+MdzAzCq0Z9zLRPuCSyuRJpc7ZtU0Vqza2j73sxfTD YddpYJ3eqfiWQE43pfsVSr+O1vRLnYeg1TUCzPZKKSfHBcDSHTlsOtVUBB/PXEK4JJ+L q6rg== 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=wF5I3QGcDe499zvzwDfAHdHqAxG40+9SQfq6UFOiBbY=; fh=WQsshRfLwVdJiyCNYISdaTh0cRmKHRa99oUanZJXU2U=; b=On/MTmQhxdf0ixebpgRw6pIwFj3pJ9AGn65AzhN0UBOZLq3LI7Ga9oiKCzxgn33MHU BY0fIaHruU++1K2faBPKjFuE3udwWKaB2za6+eGPe05bVHQ0K2ZyVdq6qkwuPJhfd3Aa 16y4QSxDJBcRHQyJ1hB+6TCC7WYre+aOXTEaiokpO9qoPFsMDGR0b0l4e4zBY5oXRCnZ TwgwRLCKmntcBs93MCX8fpwKqj/s/hBrJYDkkmgkJJ3Ied6bQFTxVvdcz2r5cKi9+GnT UF5F8UruqydujZH56hPI9C+kt/PKHigRmw8oldFLH93ET1FT3JpNfwGy/CwUogRl4d09 Fh7A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=WSaROuhD; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-81703-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-81703-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id b14-20020a05620a04ee00b007859e867c1asi5027395qkh.557.2024.02.26.06.57.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Feb 2024 06:57:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-81703-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=WSaROuhD; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-81703-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-81703-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.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 ny.mirrors.kernel.org (Postfix) with ESMTPS id 267BD1C222EC for ; Mon, 26 Feb 2024 14:57:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3B1ED12AAEE; Mon, 26 Feb 2024 14:38:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WSaROuhD" Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 D656712AAFF; Mon, 26 Feb 2024 14:38:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708958285; cv=none; b=gpbry4X6FuzNjq2DM2VVBMaP4JRzVEGTNVo5fUOzuhGMC8cgk3x8fKroffXy/0r201Ov7yR4k5Xvhy4EK5DXO6+IiKpaADDpsNCV5kD66FoY7jEopjoNW7u0r+3ZW+EUOXlGMNdu9XemXfj8DWtWfy2G6cFX+pKf508ZytPo/3I= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708958285; c=relaxed/simple; bh=kcNZ0lhM9kk5ZqiWC7oiKK6STog5OGE3f4B2GekF4Ys=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=laVEKoVkM/M6HaFJd3rLs2Ch566I9c7JWWkAmSSkq4G0mbzDS798ps9dHnKpsLSqyupgAjNF2jU+1kF4UwGBKQsj+25B/DrgFncraUjRrh49/+kV5NiogCM4smxtg8ZSj2Ol3rXmst5RoE7esou/nXcKyXo9FkMdWBlCTs71id8= 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=WSaROuhD; arc=none smtp.client-ip=209.85.214.178 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 Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1dc3b4b9b62so26756195ad.1; Mon, 26 Feb 2024 06:38:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1708958283; x=1709563083; 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=wF5I3QGcDe499zvzwDfAHdHqAxG40+9SQfq6UFOiBbY=; b=WSaROuhD9PpSiFeIhsaXzJ4U2q7+OoEyKLiw/VpecKjuf+6Hy2fPROGGc6nahG1Dc2 xjNZrkCd4wTSOoO7Ak9c94KR3sAkpwu6/avT8e5M+i1r4Ij7nRymqn6xdLgaaml/rfq7 BCohSMGUT2mG1XeEsIcnpL+RHxzU1nAc/q9jxKNT/2RaDqiz7FfGAxomRP7rlXrMzqcs sObS/4vX8gNzzwdD7q5cX3Otrsn4NxNKChWlt7dJ0IxudnSgndrHj3XRPndaygfllkXk y1JMxUdHPJk7K06rB69zvHc0oWygJ2aGjEhscwXaCKmso6QL3Bhx7lWbKAZ3jPHUxNfn VJ5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708958283; x=1709563083; 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=wF5I3QGcDe499zvzwDfAHdHqAxG40+9SQfq6UFOiBbY=; b=HC5urZi5V2vmO1Y1igWOSdoQcqmcTeLIlgw2Tn94ZUCmLkuaEB2rho8fUllzhpE9FA 0c8NT0tvQ8jxP0IZCVmh/UOBUg1QZHkROHtqPfkHF0D1c+sDXesWcGKKqo7R0OcT86T9 ETNl/7DNtCbVXaby4qps/if8ADkPbCDby3SoUcwx98T8miKXXNkhQQeW1iHXxJk+lIZv Cc5hJLZYZTZBU5rxFw7lHB7McYnoHS6G3JRVx5YDY8KP+ASktkoAcolbOjPSH4n/trcq GIXMC5Hsl4xQKTXTjro3hcuAWodGmtOrfUuz+twBN6WXjP2Q0WWJvC8D7dnKAhJFc0il uONQ== X-Forwarded-Encrypted: i=1; AJvYcCVkkeLVEYBWI4ia/swGVVVR56dQ3Vqe2gYXfUXDe9tb+ZqaNulhh2VUYuuUVau+6aYM/dfhcB7Hsdh71bv4snlx3++X X-Gm-Message-State: AOJu0YwKFr+YczyNt3kDD3eQHeDOJ4FbC38JNy3AWtJ05kDPhwfSQRTA l9GFLA9MXn+xKJIta+WzQOdRrBB8sxk8gPzScHZv7wb8QlI4HV5oTKPJkoti X-Received: by 2002:a17:902:c404:b0:1d7:836d:7b3f with SMTP id k4-20020a170902c40400b001d7836d7b3fmr9974536plk.9.1708958283008; Mon, 26 Feb 2024 06:38:03 -0800 (PST) Received: from localhost ([47.88.5.130]) by smtp.gmail.com with ESMTPSA id ks14-20020a170903084e00b001dc30f13e6asm4018049plb.137.2024.02.26.06.38.02 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 26 Feb 2024 06:38:02 -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" , David Woodhouse , Brian Gerst , Josh Poimboeuf , Thomas Garnier , Ard Biesheuvel , Tom Lendacky Subject: [RFC PATCH 55/73] x86/pvm: Relocate kernel image to specific virtual address range Date: Mon, 26 Feb 2024 22:36:12 +0800 Message-Id: <20240226143630.33643-56-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: 8bit From: Hou Wenlong For a PVM guest, it is only allowed to run in the specific virtual address range provided by the hypervisor. Therefore, the PVM guest needs to be a PIE kernel and perform relocation during the booting process. Additionally, for a compressed kernel image, kaslr needs to be disabled; otherwise, it will fail to boot. Signed-off-by: Hou Wenlong Signed-off-by: Lai Jiangshan --- arch/x86/Kconfig | 3 ++- arch/x86/kernel/head64_identity.c | 27 +++++++++++++++++++++++++++ arch/x86/kernel/head_64.S | 13 +++++++++++++ arch/x86/kernel/pvm.c | 5 ++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2ccc8a27e081..1b4bea3db53d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -853,7 +853,8 @@ config KVM_GUEST config PVM_GUEST bool "PVM Guest support" - depends on X86_64 && KVM_GUEST + depends on X86_64 && KVM_GUEST && X86_PIE + select RELOCATABLE_UNCOMPRESSED_KERNEL default n help This option enables the kernel to run as a PVM guest under the PVM diff --git a/arch/x86/kernel/head64_identity.c b/arch/x86/kernel/head64_identity.c index 4548ad615ecf..4e6a073d9e6c 100644 --- a/arch/x86/kernel/head64_identity.c +++ b/arch/x86/kernel/head64_identity.c @@ -20,6 +20,7 @@ #include #include #include +#include extern pmd_t early_dynamic_pgts[EARLY_DYNAMIC_PAGE_TABLES][PTRS_PER_PMD]; extern unsigned int next_early_pgt; @@ -385,3 +386,29 @@ void __head __relocate_kernel(unsigned long physbase, unsigned long virtbase) } } #endif + +#ifdef CONFIG_PVM_GUEST +extern unsigned long pvm_range_start; +extern unsigned long pvm_range_end; + +static void __head detect_pvm_range(void) +{ + unsigned long msr_val; + unsigned long pml4_index_start, pml4_index_end; + + msr_val = __rdmsr(MSR_PVM_LINEAR_ADDRESS_RANGE); + pml4_index_start = msr_val & 0x1ff; + pml4_index_end = (msr_val >> 16) & 0x1ff; + pvm_range_start = (0x1fffe00 | pml4_index_start) * P4D_SIZE; + pvm_range_end = (0x1fffe00 | pml4_index_end) * P4D_SIZE; +} + +void __head pvm_relocate_kernel(unsigned long physbase) +{ + if (!pvm_detect()) + return; + + detect_pvm_range(); + __relocate_kernel(physbase, pvm_range_end - (2UL << 30)); +} +#endif diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index b8278f05bbd0..1d931bab4393 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -91,6 +91,19 @@ SYM_CODE_START_NOALIGN(startup_64) movq %rdx, PER_CPU_VAR(this_cpu_off) #endif +#ifdef CONFIG_PVM_GUEST + leaq _text(%rip), %rdi + call pvm_relocate_kernel +#ifdef CONFIG_SMP + /* Fill __per_cpu_offset[0] again, because it got relocated. */ + movabs $__per_cpu_load, %rdx + movabs $__per_cpu_start, %rax + subq %rax, %rdx + movq %rdx, __per_cpu_offset(%rip) + movq %rdx, PER_CPU_VAR(this_cpu_off) +#endif +#endif + call startup_64_setup_env /* Now switch to __KERNEL_CS so IRET works reliably */ diff --git a/arch/x86/kernel/pvm.c b/arch/x86/kernel/pvm.c index 2d27044eaf25..fc82c71b305b 100644 --- a/arch/x86/kernel/pvm.c +++ b/arch/x86/kernel/pvm.c @@ -13,9 +13,12 @@ #include #include +unsigned long pvm_range_start __initdata; +unsigned long pvm_range_end __initdata; + void __init pvm_early_setup(void) { - if (!pvm_detect()) + if (!pvm_range_end) return; setup_force_cpu_cap(X86_FEATURE_KVM_PVM_GUEST); -- 2.19.1.6.gb485710b