]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
amd64 pmap: LA57 AKA 5-level paging
authorKonstantin Belousov <kib@FreeBSD.org>
Sun, 23 Aug 2020 20:19:04 +0000 (20:19 +0000)
committerKonstantin Belousov <kib@FreeBSD.org>
Sun, 23 Aug 2020 20:19:04 +0000 (20:19 +0000)
commit9ce875d9b59dde81bf116d24e6b8649075674303
tree8f51fc54f9c18becf6cdf42fe0284e9767d9ecfa
parent4ba405dcdbf0abf9e142fc0b9c3c866359bf4c57
amd64 pmap: LA57 AKA 5-level paging

Since LA57 was moved to the main SDM document with revision 072, it
seems that we should have a support for it, and silicons are coming.

This patch makes pmap support both LA48 and LA57 hardware.  The
selection of page table level is done at startup, kernel always
receives control from loader with 4-level paging.  It is not clear how
UEFI spec would adapt LA57, for instance it could hand out control in
LA57 mode sometimes.

To switch from LA48 to LA57 requires turning off long mode, requesting
LA57 in CR4, then re-entering long mode.  This is somewhat delicate
and done in pmap_bootstrap_la57().  AP startup in LA57 mode is much
easier, we only need to toggle a bit in CR4 and load right value in CR3.

I decided to not change kernel map for now.  Single PML5 entry is
created that points to the existing kernel_pml4 (KML4Phys) page, and a
pml5 entry to create our recursive mapping for vtopte()/vtopde().
This decision is motivated by the fact that we cannot overcommit for
KVA, so large space there is unusable until machines start providing
wider physical memory addressing.  Another reason is that I do not
want to break our fragile autotuning, so the KVA expansion is not
included into this first step.  Nice side effect is that minidumps are
compatible.

On the other hand, (very) large address space is definitely
immediately useful for some userspace applications.

For userspace, numbering of pte entries (or page table pages) is
always done for 5-level structures even if we operate in 4-level mode.
The pmap_is_la57() function is added to report the mode of the
specified pmap, this is done not to allow simultaneous 4-/5-levels
(which is not allowed by hw), but to accomodate for EPT which has
separate level control and in principle might not allow 5-leve EPT
despite x86 paging supports it. Anyway, it does not seems critical to
have 5-level EPT support now.

Tested by: pho (LA48 hardware)
Reviewed by: alc
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D25273
15 files changed:
sys/amd64/amd64/elf_machdep.c
sys/amd64/amd64/genassym.c
sys/amd64/amd64/locore.S
sys/amd64/amd64/mp_machdep.c
sys/amd64/amd64/mpboot.S
sys/amd64/amd64/pmap.c
sys/amd64/include/md_var.h
sys/amd64/include/param.h
sys/amd64/include/pmap.h
sys/amd64/include/proc.h
sys/amd64/include/vmparam.h
sys/amd64/linux/linux_sysvec.c
sys/amd64/vmm/amd/svm.c
sys/amd64/vmm/intel/vmx.c
sys/cddl/dev/dtrace/amd64/dtrace_subr.c