diff options
author | Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | 2018-02-16 06:49:46 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2018-02-21 04:19:18 -0500 |
commit | b9952ec78778aa7ae5b8df672668aece6fc93d2a (patch) | |
tree | 5c8682bb93728632b970af2002d6adad5054974c | |
parent | 6657fca06e3ffab8d0b3f9d8b397f5ee498952d7 (diff) |
x86/xen: Allow XEN_PV and XEN_PVH to be enabled with X86_5LEVEL
With boot-time switching between paging modes, XEN_PV and XEN_PVH can be
boot into 4-level paging mode.
Tested-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Borislav Petkov <bp@suse.de>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/20180216114948.68868-2-kirill.shutemov@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/kernel/head_64.S | 12 | ||||
-rw-r--r-- | arch/x86/xen/Kconfig | 5 | ||||
-rw-r--r-- | arch/x86/xen/mmu_pv.c | 21 |
3 files changed, 27 insertions, 11 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 145d7b95ae29..3e9de0fc97de 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
@@ -38,12 +38,12 @@ | |||
38 | * | 38 | * |
39 | */ | 39 | */ |
40 | 40 | ||
41 | #define l4_index(x) (((x) >> 39) & 511) | ||
41 | #define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) | 42 | #define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) |
42 | 43 | ||
43 | #if defined(CONFIG_XEN_PV) || defined(CONFIG_XEN_PVH) | 44 | L4_PAGE_OFFSET = l4_index(__PAGE_OFFSET_BASE_L4) |
44 | PGD_PAGE_OFFSET = pgd_index(__PAGE_OFFSET_BASE_L4) | 45 | L4_START_KERNEL = l4_index(__START_KERNEL_map) |
45 | PGD_START_KERNEL = pgd_index(__START_KERNEL_map) | 46 | |
46 | #endif | ||
47 | L3_START_KERNEL = pud_index(__START_KERNEL_map) | 47 | L3_START_KERNEL = pud_index(__START_KERNEL_map) |
48 | 48 | ||
49 | .text | 49 | .text |
@@ -386,9 +386,9 @@ NEXT_PAGE(early_dynamic_pgts) | |||
386 | #if defined(CONFIG_XEN_PV) || defined(CONFIG_XEN_PVH) | 386 | #if defined(CONFIG_XEN_PV) || defined(CONFIG_XEN_PVH) |
387 | NEXT_PGD_PAGE(init_top_pgt) | 387 | NEXT_PGD_PAGE(init_top_pgt) |
388 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC | 388 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC |
389 | .org init_top_pgt + PGD_PAGE_OFFSET*8, 0 | 389 | .org init_top_pgt + L4_PAGE_OFFSET*8, 0 |
390 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC | 390 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC |
391 | .org init_top_pgt + PGD_START_KERNEL*8, 0 | 391 | .org init_top_pgt + L4_START_KERNEL*8, 0 |
392 | /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */ | 392 | /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */ |
393 | .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC | 393 | .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC |
394 | .fill PTI_USER_PGD_FILL,8,0 | 394 | .fill PTI_USER_PGD_FILL,8,0 |
diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index f605825a04ab..c1f98f32c45f 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig | |||
@@ -18,9 +18,6 @@ config XEN_PV | |||
18 | bool "Xen PV guest support" | 18 | bool "Xen PV guest support" |
19 | default y | 19 | default y |
20 | depends on XEN | 20 | depends on XEN |
21 | # XEN_PV is not ready to work with 5-level paging. | ||
22 | # Changes to hypervisor are also required. | ||
23 | depends on !X86_5LEVEL | ||
24 | select XEN_HAVE_PVMMU | 21 | select XEN_HAVE_PVMMU |
25 | select XEN_HAVE_VPMU | 22 | select XEN_HAVE_VPMU |
26 | help | 23 | help |
@@ -79,6 +76,4 @@ config XEN_DEBUG_FS | |||
79 | config XEN_PVH | 76 | config XEN_PVH |
80 | bool "Support for running as a PVH guest" | 77 | bool "Support for running as a PVH guest" |
81 | depends on XEN && XEN_PVHVM && ACPI | 78 | depends on XEN && XEN_PVHVM && ACPI |
82 | # Pre-built page tables are not ready to handle 5-level paging. | ||
83 | depends on !X86_5LEVEL | ||
84 | def_bool n | 79 | def_bool n |
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c index d85076223a69..3f4fec59af09 100644 --- a/arch/x86/xen/mmu_pv.c +++ b/arch/x86/xen/mmu_pv.c | |||
@@ -538,6 +538,22 @@ static void xen_set_p4d(p4d_t *ptr, p4d_t val) | |||
538 | 538 | ||
539 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 539 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
540 | } | 540 | } |
541 | |||
542 | #if CONFIG_PGTABLE_LEVELS >= 5 | ||
543 | __visible p4dval_t xen_p4d_val(p4d_t p4d) | ||
544 | { | ||
545 | return pte_mfn_to_pfn(p4d.p4d); | ||
546 | } | ||
547 | PV_CALLEE_SAVE_REGS_THUNK(xen_p4d_val); | ||
548 | |||
549 | __visible p4d_t xen_make_p4d(p4dval_t p4d) | ||
550 | { | ||
551 | p4d = pte_pfn_to_mfn(p4d); | ||
552 | |||
553 | return native_make_p4d(p4d); | ||
554 | } | ||
555 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_p4d); | ||
556 | #endif /* CONFIG_PGTABLE_LEVELS >= 5 */ | ||
541 | #endif /* CONFIG_X86_64 */ | 557 | #endif /* CONFIG_X86_64 */ |
542 | 558 | ||
543 | static int xen_pmd_walk(struct mm_struct *mm, pmd_t *pmd, | 559 | static int xen_pmd_walk(struct mm_struct *mm, pmd_t *pmd, |
@@ -2411,6 +2427,11 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = { | |||
2411 | 2427 | ||
2412 | .alloc_pud = xen_alloc_pmd_init, | 2428 | .alloc_pud = xen_alloc_pmd_init, |
2413 | .release_pud = xen_release_pmd_init, | 2429 | .release_pud = xen_release_pmd_init, |
2430 | |||
2431 | #if CONFIG_PGTABLE_LEVELS >= 5 | ||
2432 | .p4d_val = PV_CALLEE_SAVE(xen_p4d_val), | ||
2433 | .make_p4d = PV_CALLEE_SAVE(xen_make_p4d), | ||
2434 | #endif | ||
2414 | #endif /* CONFIG_X86_64 */ | 2435 | #endif /* CONFIG_X86_64 */ |
2415 | 2436 | ||
2416 | .activate_mm = xen_activate_mm, | 2437 | .activate_mm = xen_activate_mm, |