freebsd-skq/sys/amd64/linux
Konstantin Belousov 9ce875d9b5 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
2020-08-23 20:19:04 +00:00
..
linux_dummy.c Add a trivial linux(4) splice(2) implementation, which simply 2020-07-18 11:28:40 +00:00
linux_genassym.c
linux_locore.asm linuxulator: rename linux_locore.s to .asm 2019-07-30 17:18:31 +00:00
linux_machdep.c linux: add sysctl compat.linux.use_emul_path 2020-08-18 22:04:22 +00:00
linux_proto.h Regen after r363304. 2020-07-18 11:31:31 +00:00
linux_ptrace.c Improve debugging output. 2019-09-04 18:00:03 +00:00
linux_support.s Futex support functions in linux.ko and linux32.ko on amd64 should be 2018-08-07 18:29:10 +00:00
linux_syscall.h Regen after r362440. 2020-06-20 18:31:02 +00:00
linux_syscalls.c Regen after r362440. 2020-06-20 18:31:02 +00:00
linux_sysent.c Regen after r363304. 2020-07-18 11:31:31 +00:00
linux_systrace_args.c Regen after r363304. 2020-07-18 11:31:31 +00:00
linux_sysvec.c amd64 pmap: LA57 AKA 5-level paging 2020-08-23 20:19:04 +00:00
linux_vdso.lds.s
linux.h Centralize compatability translation macros. 2020-04-14 20:30:48 +00:00
Makefile sysent targets: further cleanup and deduplication 2020-01-18 20:37:45 +00:00
syscalls.conf
syscalls.master Add a trivial linux(4) splice(2) implementation, which simply 2020-07-18 11:28:40 +00:00