All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Hou Wenlong" <houwenlong.hwl@antgroup.com>
To: linux-kernel@vger.kernel.org
Cc: "Thomas Garnier" <thgarnie@chromium.org>,
	"Lai Jiangshan" <jiangshan.ljs@antgroup.com>,
	"Kees Cook" <keescook@chromium.org>,
	"Hou Wenlong" <houwenlong.hwl@antgroup.com>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Ingo Molnar" <mingo@redhat.com>,
	"Borislav Petkov" <bp@alien8.de>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	"Juergen Gross" <jgross@suse.com>,
	"Srivatsa S. Bhat (VMware)" <srivatsa@csail.mit.edu>,
	"Alexey Makhalov" <amakhalov@vmware.com>,
	"VMware PV-Drivers Reviewers" <pv-drivers@vmware.com>,
	"Boris Ostrovsky" <boris.ostrovsky@oracle.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Mike Rapoport (IBM)" <rppt@kernel.org>,
	"Liam R. Howlett" <Liam.Howlett@Oracle.com>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	virtualization@lists.linux-foundation.org,
	xen-devel@lists.xenproject.org
Subject: [PATCH RFC 36/43] x86/vsyscall: Don't use set_fixmap() to map vsyscall page
Date: Fri, 28 Apr 2023 17:51:16 +0800	[thread overview]
Message-ID: <a77a84cc7fc4bf70bb8ac7fb6e55110e74bde3ca.1682673543.git.houwenlong.hwl@antgroup.com> (raw)
In-Reply-To: <cover.1682673542.git.houwenlong.hwl@antgroup.com>

In order to unify FIXADDR_TOP for x86 and allow fixmap area to be
moveable, vsyscall page should be mapped individually. However, for
XENPV guest, vsyscall page needs to be mapped into user pagetable too.
So introduce a new PVMMU op to help to map vsyscall page.

Suggested-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
Cc: Thomas Garnier <thgarnie@chromium.org>
Cc: Kees Cook <keescook@chromium.org>
---
 arch/x86/entry/vsyscall/vsyscall_64.c |  3 +--
 arch/x86/include/asm/paravirt.h       |  7 +++++++
 arch/x86/include/asm/paravirt_types.h |  4 ++++
 arch/x86/include/asm/vsyscall.h       | 13 +++++++++++++
 arch/x86/kernel/paravirt.c            |  4 ++++
 arch/x86/xen/mmu_pv.c                 | 20 ++++++++++++++------
 6 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c
index e0ca8120aea8..4373460ebbde 100644
--- a/arch/x86/entry/vsyscall/vsyscall_64.c
+++ b/arch/x86/entry/vsyscall/vsyscall_64.c
@@ -385,8 +385,7 @@ void __init map_vsyscall(void)
 	 * page.
 	 */
 	if (vsyscall_mode == EMULATE) {
-		__set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall,
-			     PAGE_KERNEL_VVAR);
+		__set_vsyscall_page(physaddr_vsyscall, PAGE_KERNEL_VVAR);
 		set_vsyscall_pgtable_user_bits(swapper_pg_dir);
 	}
 
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 2350ceb43db0..dcc0706287ee 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -576,6 +576,13 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
 {
 	pv_ops.mmu.set_fixmap(idx, phys, flags);
 }
+
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+static inline void __set_vsyscall_page(phys_addr_t phys, pgprot_t flags)
+{
+	pv_ops.mmu.set_vsyscall_page(phys, flags);
+}
+#endif
 #endif
 
 #if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS)
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 982a234f5a06..e79f38232849 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -224,6 +224,10 @@ struct pv_mmu_ops {
 	   an mfn.  We can tell which is which from the index. */
 	void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
 			   phys_addr_t phys, pgprot_t flags);
+
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+	void (*set_vsyscall_page)(phys_addr_t phys, pgprot_t flags);
+#endif
 #endif
 } __no_randomize_layout;
 
diff --git a/arch/x86/include/asm/vsyscall.h b/arch/x86/include/asm/vsyscall.h
index ab60a71a8dcb..73691fc60924 100644
--- a/arch/x86/include/asm/vsyscall.h
+++ b/arch/x86/include/asm/vsyscall.h
@@ -2,6 +2,7 @@
 #ifndef _ASM_X86_VSYSCALL_H
 #define _ASM_X86_VSYSCALL_H
 
+#include <asm/pgtable.h>
 #include <linux/seqlock.h>
 #include <uapi/asm/vsyscall.h>
 
@@ -15,6 +16,18 @@ extern void set_vsyscall_pgtable_user_bits(pgd_t *root);
  */
 extern bool emulate_vsyscall(unsigned long error_code,
 			     struct pt_regs *regs, unsigned long address);
+static inline void native_set_vsyscall_page(phys_addr_t phys, pgprot_t flags)
+{
+	pgprot_val(flags) &= __default_kernel_pte_mask;
+	set_pte_vaddr(VSYSCALL_ADDR, pfn_pte(phys >> PAGE_SHIFT, flags));
+}
+
+#ifndef CONFIG_PARAVIRT_XXL
+#define __set_vsyscall_page	native_set_vsyscall_page
+#else
+#include <asm/paravirt.h>
+#endif
+
 #else
 static inline void map_vsyscall(void) {}
 static inline bool emulate_vsyscall(unsigned long error_code,
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index ac10b46c5832..13c81402f377 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -33,6 +33,7 @@
 #include <asm/tlb.h>
 #include <asm/io_bitmap.h>
 #include <asm/gsseg.h>
+#include <asm/vsyscall.h>
 
 /*
  * nop stub, which must not clobber anything *including the stack* to
@@ -357,6 +358,9 @@ struct paravirt_patch_template pv_ops = {
 	},
 
 	.mmu.set_fixmap		= native_set_fixmap,
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+	.mmu.set_vsyscall_page	= native_set_vsyscall_page,
+#endif
 #endif /* CONFIG_PARAVIRT_XXL */
 
 #if defined(CONFIG_PARAVIRT_SPINLOCKS)
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index fdc91deece7e..a59bc013ee5b 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -59,6 +59,7 @@
 
 #include <asm/tlbflush.h>
 #include <asm/fixmap.h>
+#include <asm/vsyscall.h>
 #include <asm/mmu_context.h>
 #include <asm/setup.h>
 #include <asm/paravirt.h>
@@ -2020,9 +2021,6 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
 
 	switch (idx) {
 	case FIX_BTMAP_END ... FIX_BTMAP_BEGIN:
-#ifdef CONFIG_X86_VSYSCALL_EMULATION
-	case VSYSCALL_PAGE:
-#endif
 		/* All local page mappings */
 		pte = pfn_pte(phys, prot);
 		break;
@@ -2058,14 +2056,21 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
 	vaddr = __fix_to_virt(idx);
 	if (HYPERVISOR_update_va_mapping(vaddr, pte, UVMF_INVLPG))
 		BUG();
+}
 
 #ifdef CONFIG_X86_VSYSCALL_EMULATION
+static void xen_set_vsyscall_page(phys_addr_t phys, pgprot_t prot)
+{
+	pte_t pte = pfn_pte(phys >> PAGE_SHIFT, prot);
+
+	if (HYPERVISOR_update_va_mapping(VSYSCALL_ADDR, pte, UVMF_INVLPG))
+		BUG();
+
 	/* Replicate changes to map the vsyscall page into the user
 	   pagetable vsyscall mapping. */
-	if (idx == VSYSCALL_PAGE)
-		set_pte_vaddr_pud(level3_user_vsyscall, vaddr, pte);
-#endif
+	set_pte_vaddr_pud(level3_user_vsyscall, VSYSCALL_ADDR, pte);
 }
+#endif
 
 static void __init xen_post_allocator_init(void)
 {
@@ -2156,6 +2161,9 @@ static const typeof(pv_ops) xen_mmu_ops __initconst = {
 		},
 
 		.set_fixmap = xen_set_fixmap,
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+		.set_vsyscall_page = xen_set_vsyscall_page,
+#endif
 	},
 };
 
-- 
2.31.1


  parent reply	other threads:[~2023-04-28  9:56 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-28  9:50 [PATCH RFC 00/43] x86/pie: Make kernel image's virtual address flexible Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 01/43] x86/crypto: Adapt assembly for PIE support Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 02/43] x86: Add macro to get symbol address " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 03/43] x86: relocate_kernel - Adapt assembly " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 04/43] x86/entry/64: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 05/43] x86: pm-trace: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 06/43] x86/CPU: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 07/43] x86/acpi: " Hou Wenlong
2023-04-28 11:32   ` Rafael J. Wysocki
2023-04-28  9:50 ` [PATCH RFC 08/43] x86/boot/64: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 09/43] x86/power/64: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 10/43] x86/alternatives: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 11/43] x86/irq: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 12/43] x86,rethook: " Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 13/43] x86/paravirt: Use relative reference for original instruction Hou Wenlong
2023-06-01  9:29   ` Juergen Gross
2023-06-01  9:29     ` Juergen Gross via Virtualization
2023-06-05  6:40     ` Nadav Amit
2023-06-05  6:40       ` Nadav Amit via Virtualization
2023-06-06 11:35       ` Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 14/43] x86/Kconfig: Introduce new Kconfig for PIE kernel building Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 15/43] x86/PVH: Use fixed_percpu_data to set up GS base Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 16/43] x86-64: Use per-cpu stack canary if supported by compiler Hou Wenlong
2023-05-01 17:27   ` Nick Desaulniers
2023-05-05  6:14     ` Hou Wenlong
2023-05-05 18:02       ` Nick Desaulniers
2023-05-05 19:06         ` Fangrui Song
2023-05-08  8:06         ` Hou Wenlong
2023-05-04 10:31   ` Juergen Gross
2023-05-05  3:09     ` Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 17/43] x86/pie: Enable stack protector only if per-cpu stack canary is supported Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 18/43] x86/percpu: Use PC-relative addressing for percpu variable references Hou Wenlong
2023-04-28  9:50 ` [PATCH RFC 19/43] x86/tools: Explicitly include autoconf.h for hostprogs Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 20/43] x86/percpu: Adapt percpu references relocation for PIE support Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 21/43] x86/ftrace: Adapt assembly " Hou Wenlong
2023-04-28 13:37   ` Steven Rostedt
2023-04-29  3:43     ` Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 22/43] x86/ftrace: Adapt ftrace nop patching " Hou Wenlong
2023-04-28 13:44   ` Steven Rostedt
2023-04-29  3:38     ` Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 23/43] x86/pie: Force hidden visibility for all symbol references Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 24/43] x86/boot/compressed: Adapt sed command to generate voffset.h when PIE is enabled Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 25/43] x86/mm: Make the x86 GOT read-only Hou Wenlong
2023-04-30 14:23   ` Ard Biesheuvel
2023-05-08 11:40     ` Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 26/43] x86/pie: Add .data.rel.* sections into link script Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 27/43] x86/relocs: Handle PIE relocations Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 28/43] KVM: x86: Adapt assembly for PIE support Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 29/43] x86/PVH: Adapt PVH booting " Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 30/43] x86/bpf: Adapt BPF_CALL JIT codegen " Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 31/43] x86/modules: Adapt module loading " Hou Wenlong
2023-04-28 19:29   ` Ard Biesheuvel
2023-05-08  8:32     ` Hou Wenlong
2023-05-08  9:16       ` Ard Biesheuvel
2023-05-08 11:40         ` Hou Wenlong
2023-05-08 17:47           ` Ard Biesheuvel
2023-05-09  9:42             ` Hou Wenlong
2023-05-09  9:52               ` Ard Biesheuvel
2023-05-09 12:35                 ` Hou Wenlong
2023-05-10  7:09         ` Hou Wenlong
2023-05-10  8:15           ` Ard Biesheuvel
2023-04-28  9:51 ` [PATCH RFC 32/43] x86/boot/64: Use data relocation to get absloute address when PIE is enabled Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 33/43] objtool: Add validation for x86 PIE support Hou Wenlong
2023-04-28 10:28   ` Christophe Leroy
2023-04-28 11:43     ` Peter Zijlstra
2023-04-29  4:04       ` Hou Wenlong
2023-04-29  3:52     ` Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 34/43] objtool: Adapt indirect call of __fentry__() for " Hou Wenlong
2023-04-28 15:18   ` Peter Zijlstra
2023-04-28  9:51 ` [PATCH RFC 35/43] x86/pie: Build the kernel as PIE Hou Wenlong
2023-04-28  9:51 ` Hou Wenlong [this message]
2023-04-28  9:51 ` [PATCH RFC 37/43] x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap area Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 38/43] x86/fixmap: Move vsyscall page " Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 39/43] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 40/43] x86/boot: Fill kernel image puds dynamically Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 41/43] x86/mm: Sort address_markers array when X86 PIE is enabled Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 42/43] x86/pie: Allow kernel image to be relocated in top 512G Hou Wenlong
2023-04-28  9:51 ` [PATCH RFC 43/43] x86/boot: Extend relocate range for PIE kernel image Hou Wenlong
2023-04-28 15:22 ` [PATCH RFC 00/43] x86/pie: Make kernel image's virtual address flexible Peter Zijlstra
2023-05-06  7:19   ` Hou Wenlong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a77a84cc7fc4bf70bb8ac7fb6e55110e74bde3ca.1682673543.git.houwenlong.hwl@antgroup.com \
    --to=houwenlong.hwl@antgroup.com \
    --cc=Liam.Howlett@Oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=amakhalov@vmware.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=jiangshan.ljs@antgroup.com \
    --cc=keescook@chromium.org \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=pv-drivers@vmware.com \
    --cc=rppt@kernel.org \
    --cc=srivatsa@csail.mit.edu \
    --cc=surenb@google.com \
    --cc=tglx@linutronix.de \
    --cc=thgarnie@chromium.org \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.