OPNsense - FreeBSD source
Find a file
Konstantin Belousov bd50262f70 PTI for amd64.
The implementation of the Kernel Page Table Isolation (KPTI) for
amd64, first version. It provides a workaround for the 'meltdown'
vulnerability.  PTI is turned off by default for now, enable with the
loader tunable vm.pmap.pti=1.

The pmap page table is split into kernel-mode table and user-mode
table. Kernel-mode table is identical to the non-PTI table, while
usermode table is obtained from kernel table by leaving userspace
mappings intact, but only leaving the following parts of the kernel
mapped:

    kernel text (but not modules text)
    PCPU
    GDT/IDT/user LDT/task structures
    IST stacks for NMI and doublefault handlers.

Kernel switches to user page table before returning to usermode, and
restores full kernel page table on the entry. Initial kernel-mode
stack for PTI trampoline is allocated in PCPU, it is only 16
qwords.  Kernel entry trampoline switches page tables. then the
hardware trap frame is copied to the normal kstack, and execution
continues.

IST stacks are kept mapped and no trampoline is needed for
NMI/doublefault, but of course page table switch is performed.

On return to usermode, the trampoline is used again, iret frame is
copied to the trampoline stack, page tables are switched and iretq is
executed.  The case of iretq faulting due to the invalid usermode
context is tricky, since the frame for fault is appended to the
trampoline frame.  Besides copying the fault frame and original
(corrupted) frame to kstack, the fault frame must be patched to make
it look as if the fault occured on the kstack, see the comment in
doret_iret detection code in trap().

Currently kernel pages which are mapped during trampoline operation
are identical for all pmaps.  They are registered using
pmap_pti_add_kva().  Besides initial registrations done during boot,
LDT and non-common TSS segments are registered if user requested their
use.  In principle, they can be installed into kernel page table per
pmap with some work.  Similarly, PCPU can be hidden from userspace
mapping using trampoline PCPU page, but again I do not see much
benefits besides complexity.

PDPE pages for the kernel half of the user page tables are
pre-allocated during boot because we need to know pml4 entries which
are copied to the top-level paging structure page, in advance on a new
pmap creation.  I enforce this to avoid iterating over the all
existing pmaps if a new PDPE page is needed for PTI kernel mappings.
The iteration is a known problematic operation on i386.

The need to flush hidden kernel translations on the switch to user
mode make global tables (PG_G) meaningless and even harming, so PG_G
use is disabled for PTI case.  Our existing use of PCID is
incompatible with PTI and is automatically disabled if PTI is
enabled.  PCID can be forced on only for developer's benefit.

MCE is known to be broken, it requires IST stack to operate completely
correctly even for non-PTI case, and absolutely needs dedicated IST
stack because MCE delivery while trampoline did not switched from PTI
stack is fatal.  The fix is pending.

Reviewed by:	markj (partially)
Tested by:	pho (previous version)
Discussed with:	jeff, jhb
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
2018-01-17 11:44:21 +00:00
bin stddef.h is not used by cat.c, remove the include. 2018-01-07 07:08:59 +00:00
cddl Remove tst.zonename.d from the list of expected failures. 2018-01-14 17:56:19 +00:00
contrib Import tzdata 2018a 2018-01-16 18:36:25 +00:00
crypto Merge OpenSSL 1.0.2n. 2017-12-07 18:02:57 +00:00
etc Merge ^/head r327624 through r327885. 2018-01-12 18:23:35 +00:00
gnu build-tools: De-special-case the gcc tools build. 2017-10-31 19:02:05 +00:00
include Use the __result_use_check attribute also for reallocf(3). 2018-01-09 22:48:13 +00:00
kerberos5 various: general adoption of SPDX licensing ID tags. 2017-11-27 15:37:16 +00:00
lib libnetbsd: Make the function declaration of efopen() match the definition 2018-01-16 21:43:21 +00:00
libexec rpc.sprayd: Remove 3rd and 4th clauses in christos' license. 2017-12-28 17:51:53 +00:00
release After removal of loader.ps3, change petitboot configuration in release media 2018-01-01 03:33:01 +00:00
rescue Avoid referencing private lib names directly. 2017-11-10 07:53:02 +00:00
sbin Rename cgget => cglookup to clear name space for new libufs function cgget. 2018-01-17 06:31:21 +00:00
secure Merge OpenSSL 1.0.2n. 2017-12-07 18:02:57 +00:00
share wsp(4): Update to reflect new sysctl from r314467 2018-01-15 21:53:33 +00:00
stand utf8_to_ucs2() should check for malloc failure 2018-01-16 20:35:54 +00:00
sys PTI for amd64. 2018-01-17 11:44:21 +00:00
targets Remove a reference to burncd 2017-12-29 23:56:06 +00:00
tests Add regression tests for r327779. 2018-01-10 19:41:05 +00:00
tools Merge ^/head r327624 through r327885. 2018-01-12 18:23:35 +00:00
usr.bin Add missing assignment to make sure non-first cmsgs are handled as such. 2018-01-17 10:30:49 +00:00
usr.sbin Allow xinstall and makefs to be crossbuilt on Linux and Mac 2018-01-16 21:43:46 +00:00
.arcconfig callsign isn't required anymore 2016-09-29 06:19:45 +00:00
.arclint arc lint: ignore /tests/ in chmod 2017-12-19 03:38:06 +00:00
.gitattributes .git*: add gitattributes and gitignore 2017-12-25 21:07:54 +00:00
.gitignore .git*: add gitattributes and gitignore 2017-12-25 21:07:54 +00:00
COPYRIGHT Happy New Year 2018 my friends! 2017-12-31 16:48:04 +00:00
LOCKS Explicitly require Security Officer's approval for kernel PRNG bits. 2013-09-17 14:19:05 +00:00
MAINTAINERS Move sys/boot to stand. Fix all references to new location 2017-11-14 23:02:19 +00:00
Makefile Import tzdata 2018a 2018-01-16 18:26:11 +00:00
Makefile.inc1 Don't build share/syscons in build-tools stage if MK_SYSCONS == "no" 2018-01-16 21:43:36 +00:00
Makefile.libcompat Check for GCC first rather than clang in the MIPS lib32 rules. 2018-01-16 01:05:04 +00:00
Makefile.sys.inc AUTO_OBJ: For all top-level targets enforce using an OBJDIR. 2017-12-05 21:29:47 +00:00
ObsoleteFiles.inc Upgrade our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 2018-01-14 00:08:34 +00:00
README Import tzdata 2018a 2018-01-16 18:26:11 +00:00
README.md Document the sys/boot -> stand move in hier.7 and the top-level README. 2017-12-03 20:36:36 +00:00
UPDATING Upgrade our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 2018-01-14 00:08:34 +00:00

FreeBSD Source:

This is the top level of the FreeBSD source directory. This file was last revised on: FreeBSD

For copyright information, please see the file COPYRIGHT in this directory (additional copyright information also exists for some sources in this tree - please see the specific source directories for more information).

The Makefile in this directory supports a number of targets for building components (or all) of the FreeBSD source tree. See build(7) and https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html for more information, including setting make(1) variables.

The buildkernel and installkernel targets build and install the kernel and the modules (see below). Please see the top of the Makefile in this directory for more information on the standard build targets and compile-time flags.

Building a kernel is a somewhat more involved process. See build(7), config(8), and https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html for more information.

Note: If you want to build and install the kernel with the buildkernel and installkernel targets, you might need to build world before. More information is available in the handbook.

The kernel configuration files reside in the sys/<arch>/conf sub-directory. GENERIC is the default configuration used in release builds. NOTES contains entries and documentation for all possible devices, not just those commonly used.

Source Roadmap:

bin				System/user commands.

cddl			Various commands and libraries under the Common Development  
				and Distribution License.

contrib			Packages contributed by 3rd parties.

crypto			Cryptography stuff (see crypto/README).

etc				Template files for /etc.

gnu				Various commands and libraries under the GNU Public License.  
				Please see gnu/COPYING* for more information.

include			System include files.

kerberos5		Kerberos5 (Heimdal) package.

lib				System libraries.

libexec			System daemons.

release			Release building Makefile & associated tools.

rescue			Build system for statically linked /rescue utilities.

sbin			System commands.

secure			Cryptographic libraries and commands.

share			Shared resources.

stand			Boot loader sources.

sys				Kernel sources.

tests			Regression tests which can be run by Kyua.  See tests/README
				for additional information.

tools			Utilities for regression testing and miscellaneous tasks.

usr.bin			User commands.

usr.sbin		System administration commands.

For information on synchronizing your source tree with one or more of the FreeBSD Project's development branches, please see:

https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/current-stable.html