Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Nov 2019 18:48:44 +0000 (UTC)
From:      Gordon Tetlow <gordon@FreeBSD.org>
To:        doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org
Subject:   svn commit: r53592 - in head/share/security: advisories patches/EN-19:19 patches/SA-19:25
Message-ID:  <201911121848.xACImiJZ011381@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gordon (src committer)
Date: Tue Nov 12 18:48:44 2019
New Revision: 53592
URL: https://svnweb.freebsd.org/changeset/doc/53592

Log:
  Add the advisories to go with the updates.
  
  Approved by:	so

Added:
  head/share/security/advisories/FreeBSD-EN-19:19.loader.asc   (contents, props changed)
  head/share/security/advisories/FreeBSD-SA-19:25.mcepsc.asc   (contents, props changed)
  head/share/security/advisories/FreeBSD-SA-19:26.mcu.asc   (contents, props changed)
  head/share/security/patches/EN-19:19/
  head/share/security/patches/EN-19:19/loader.patch   (contents, props changed)
  head/share/security/patches/EN-19:19/loader.patch.asc   (contents, props changed)
  head/share/security/patches/SA-19:25/
  head/share/security/patches/SA-19:25/mcepsc.11.patch   (contents, props changed)
  head/share/security/patches/SA-19:25/mcepsc.11.patch.asc   (contents, props changed)
  head/share/security/patches/SA-19:25/mcepsc.12.0.patch   (contents, props changed)
  head/share/security/patches/SA-19:25/mcepsc.12.0.patch.asc   (contents, props changed)
  head/share/security/patches/SA-19:25/mcepsc.12.1.patch   (contents, props changed)
  head/share/security/patches/SA-19:25/mcepsc.12.1.patch.asc   (contents, props changed)

Added: head/share/security/advisories/FreeBSD-EN-19:19.loader.asc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/advisories/FreeBSD-EN-19:19.loader.asc	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,133 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-EN-19:19.loader                                         Errata Notice
+                                                          The FreeBSD Project
+
+Topic:          UEFI Loader Memory Fragmentation
+
+Category:       core
+Module:         loader
+Announced:      2019-11-12
+Credits:        Rebecca Cran
+Affects:        FreeBSD 12.0 and later
+Corrected:      2019-09-27 05:12:28 UTC (stable/12, 12.1-STABLE)
+                2019-11-12 18:10:26 UTC (releng/12.1, 12.1-RELEASE-p1)
+                2019-11-12 18:10:26 UTC (releng/12.0, 12.0-RELEASE-p12)
+
+For general information regarding FreeBSD Errata Notices and Security
+Advisories, including descriptions of the fields above, security
+branches, and the following sections, please visit
+<URL:https://security.FreeBSD.org/>.
+
+I.   Background
+
+Prior to executing the kernel, the UEFI loader must obtain the final memory
+map from the firmware and pass it to the kernel for consumption.
+
+II.  Problem Description
+
+Allocating memory to retrieve the memory map may cause further fragmentation
+in the memory map.  This fragmentation may cause the memory map to grow
+enough for the previously allocated memory to no longer be sufficient to
+hold the memory map.  In this case, the UEFI loader would simply fail to
+boot the kernel instead of reallocating and attempting to fetch the memory
+map again.
+
+III. Impact
+
+Some systems may intermittently fail to boot due to this fragmentation, and
+require a restart.
+
+IV.  Workaround
+
+No workaround is available.  Systems that are not configured to boot via the
+UEFI loader are not affected, and not all systems that are configured to
+boot via the UEFI loader will exhibit this behavior.
+
+V.   Solution
+
+Upgrade your system to a supported FreeBSD stable or release / security
+branch (releng) dated after the correction date.
+
+Perform one of the following:
+
+1) To update your system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the i386 or amd64
+platforms can be updated via the freebsd-update(8) utility:
+
+# freebsd-update fetch
+# freebsd-update install
+
+2) To update your system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+[FreeBSD 12.x]
+# fetch https://security.FreeBSD.org/patches/EN-19:19/loader.patch
+# fetch https://security.FreeBSD.org/patches/EN-19:19/loader.patch.asc
+# gpg --verify loader.patch.asc
+
+b) Apply the patch.  Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile the operating system using buildworld and installworld as
+described in <URL:https://www.FreeBSD.org/handbook/makeworld.html>.
+
+If the system was first installed with FreeBSD 12.0 or later a copy of the
+EFI loader is installed as \EFI\freebsd\loader.efi on the EFI System
+Partition (ESP).  In that case mount the ESP and copy /boot/loader.efi to
+\EFI\freebsd\loader.efi.
+
+VI.  Correction details
+
+The following list contains the correction revision numbers for each
+affected branch.
+
+Branch/path                                                      Revision
+- -------------------------------------------------------------------------
+stable/12/                                                        r352788
+releng/12.1/                                                      r354652
+releng/12.0/                                                      r354652
+- -------------------------------------------------------------------------
+
+To see which files were modified by a particular revision, run the
+following command, replacing NNNNNN with the revision number, on a
+machine with Subversion installed:
+
+# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base
+
+Or visit the following URL, replacing NNNNNN with the revision number:
+
+<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>;
+
+VII. References
+
+The latest revision of this advisory is available at
+<URL:https://security.FreeBSD.org/advisories/FreeBSD-EN-19:19.loader.asc>;
+-----BEGIN PGP SIGNATURE-----
+
+iQKTBAEBCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAl3K+jlfFIAAAAAALgAo
+aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
+MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
+5cKo6hAAlrPVQSTQ+PGu9YtAdLG/0NZlIRdFNyjqKekkQDSEQnh35MKzVrZW4mmu
+12pM2ELRU3e4HZbZEXi0B98HAqGrbSrlXHKAwosMMmhrkNBXU+fUQcjbxHfEiRoE
+oXPhYNTQD+7ph3A2CO0mGi5d5aSdMeZqr6ayJvmlEzg/Btd0v/SnB5XWRw0c3xP2
+bCfXqS8ne2Nc0LCMzAoC69b/HQr/hi45ukbkexON+vUH0wB8N3QzwtjtZYXNMCoD
+T7w5FsW6ZnPqTFVNfQfIT9DUZCE0TJ4HD3D2GNX9rs8tvetgWpE7sXbRbRb87MIR
+zt85nwyriVjovbi24oyMgmjFgIqteRqDBG96XEWWB6YhHrOPoXd76RaOStX2r4yj
+q01i+lNNb5P0mqTvHQWx7XyDlhzVJsZEK6UyeFKT8WWarrFQ5FzLU3Fdr3G9pRAb
+1VZJCW6GgEYlOxMBVHANtUJi3JTCWSG7vw2GNLkpwHfhpPDSV8wSKNVcpTjzHS5K
+9u5iLsfNl3RtA1qD2/PPVyz12au045+WjAzlWzR8ioivRF8KwqKuwFdSUpVGcIDm
++y5YOanAgT2LxpNLf0ZbHmAZaR5kCtBDGuDFW6+z2zPHaea9opIprutgqERzc9Es
+XHh3M29OeO457JiU/yTliLraObpf0rEFUG7d30TDO1wywR/ehlM=
+=ayk8
+-----END PGP SIGNATURE-----

Added: head/share/security/advisories/FreeBSD-SA-19:25.mcepsc.asc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/advisories/FreeBSD-SA-19:25.mcepsc.asc	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,145 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-SA-19:25.mcepsc                                     Security Advisory
+                                                          The FreeBSD Project
+
+Topic:          Machine Check Exception on Page Size Change
+
+Category:       core
+Module:         kernel
+Announced:      2019-11-12
+Credits:        Intel
+Affects:        All supported versions of FreeBSD.
+Corrected:      2019-11-12 18:03:26 UTC (stable/12, 12.1-STABLE)
+                2019-11-12 18:13:04 UTC (releng/12.1, 12.1-RELEASE-p1)
+                2019-11-12 18:13:04 UTC (releng/12.0, 12.0-RELEASE-p12)
+                2019-11-12 18:04:28 UTC (stable/11, 11.3-STABLE)
+                2019-11-12 18:13:04 UTC (releng/11.3, 11.3-RELEASE-p5)
+CVE Name:       CVE-2018-12207
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit <URL:https://security.FreeBSD.org/>.
+
+I.   Background
+
+The Intel machine check architecture is a mechanism to detect and report
+hardware errors, such as system bus errors, ECC errors, parity errors, and
+others.  This allows the processor to signal the detection of a machine
+check error to the operating system.
+
+II.  Problem Description
+
+Intel discovered a previously published erratum on some Intel platforms can
+be exploited by malicious software to potentially cause a denial of service
+by triggering a machine check that will crash or hang the system.
+
+III. Impact
+
+Malicious guest operating systems may be able to crash the host.
+
+IV.  Workaround
+
+No workaround is available.  Systems not running untrusted guest virtual
+machines are not impacted.
+
+V.   Solution
+
+Upgrade your vulnerable system to a supported FreeBSD stable or
+release / security branch (releng) dated after the correction date,
+and reboot.
+
+Perform one of the following:
+
+1) To update your vulnerable system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the i386 or amd64
+platforms can be updated via the freebsd-update(8) utility:
+
+# freebsd-update fetch
+# freebsd-update install
+# shutdown -r +10min "Rebooting for a security update"
+
+2) To update your vulnerable system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+[FreeBSD 12.1]
+# fetch https://security.FreeBSD.org/patches/SA-19:25/mcepsc.12.1.patch
+# fetch https://security.FreeBSD.org/patches/SA-19:25/mcepsc.12.1.patch.asc
+# gpg --verify mcepsc.12.1.patch.asc
+
+[FreeBSD 12.0]
+# fetch https://security.FreeBSD.org/patches/SA-19:25/mcepsc.12.0.patch
+# fetch https://security.FreeBSD.org/patches/SA-19:25/mcepsc.12.0.patch.asc
+# gpg --verify mcepsc.12.0.patch.asc
+
+[FreeBSD 11.3]
+# fetch https://security.FreeBSD.org/patches/SA-19:25/mcepsc.11.patch
+# fetch https://security.FreeBSD.org/patches/SA-19:25/mcepsc.11.patch.asc
+# gpg --verify mcepsc.11.patch.asc
+
+b) Apply the patch.  Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile your kernel as described in
+<URL:https://www.FreeBSD.org/handbook/kernelconfig.html>; and reboot the
+system.
+
+VI.  Correction details
+
+The following list contains the correction revision numbers for each
+affected branch.
+
+Branch/path                                                      Revision
+- -------------------------------------------------------------------------
+stable/12/                                                        r354650
+releng/12.1/                                                      r354653
+releng/12.0/                                                      r354653
+stable/11/                                                        r354651
+releng/11.3/                                                      r354653
+- -------------------------------------------------------------------------
+
+To see which files were modified by a particular revision, run the
+following command, replacing NNNNNN with the revision number, on a
+machine with Subversion installed:
+
+# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base
+
+Or visit the following URL, replacing NNNNNN with the revision number:
+
+<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>;
+
+VII. References
+
+<URL:https://software.intel.com/security-software-guidance/software-guidance/machine-check-error-avoidance-page-size-change>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12207>;
+
+The latest revision of this advisory is available at
+<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-19:25.mcepsc.asc>;
+-----BEGIN PGP SIGNATURE-----
+
+iQKTBAEBCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAl3K+khfFIAAAAAALgAo
+aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
+MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
+5cIWdA//dTBwRIejd8vkgB/6wCLfXARU2Nw9je69JwfvpC/3BzkV+oD9rwoL7ltk
+NtOIu6otRmGnGHvC19WQ/JdlHUgtoxaxB26ROoU5BCYPJL7dU48T6l6RLbNXdMC4
+MxU3mgbiDrVw9hhh42qKNVQ+ZzpMjgUPN1WRCyKQNlG7jNm5a8BvBaK0mFYkLdEw
+9u+kNpXdaC9Ip45JI4QVS+jyK5JqFYWZw4SlB6AggcMO93QySzWWx4ZjXafw+0EK
+VoS8ByQ5nTlCVqq+hok+yVEz42mZ9AFSE1E1n3pe5TFZZmxF+NcDVMw324eLWUY3
+pVX3S6Y0dCtKKvpyy2WIMrBV4Ro5BX3nQXJINdwCo2IlBRvJgK7u0wK3P0ionsJk
+Hc4x3sjZQm9Rhb8qqOh01wb7MjmGMWX/nlyishF6MAmnIV3dXctMaG00CSsIMbv9
+jtx5v8uSGUHXb8bGYa6QLxaNN1gV6ZLMne1HLunkP7sCX9NYfibjkBXSIfNAkQTn
+MFrz9LLgy1K+8s2D1yFJZeyAZMWZ82yc14FSbux21pZS8MURpFt0OBYymAlzn0/J
+fhFEKg7rjKBuIBKjDycu9K8+s8h5TIGDROmgQojeqHm6wmlqyGVIPsREyBcCEvwM
+16pasZC9s5C7aoSvzDExekR+LQOc8jVZ80KjNGmMga41tSANKTQ=
+=9nRn
+-----END PGP SIGNATURE-----

Added: head/share/security/advisories/FreeBSD-SA-19:26.mcu.asc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/advisories/FreeBSD-SA-19:26.mcu.asc	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,172 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-SA-19:26.mcu                                        Security Advisory
+                                                          The FreeBSD Project
+
+Topic:          Intel CPU Microcode Update
+
+Category:       3rd party
+Module:         Intel CPU microcode
+Announced:      2019-11-12
+Credits:        Intel
+Affects:        All supported versions of FreeBSD running on certain
+		Intel CPUs.
+CVE Name:       CVE-2019-11135, CVE-2019-11139, CVE-2018-12126,
+                CVE-2018-12127, CVE-2018-12130, CVE-2018-11091,
+                CVE-2017-5715
+                
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit <URL:https://security.FreeBSD.org/>.
+
+I.   Background
+
+- From time to time Intel releases new CPU microcode to address functional
+issues and security vulnerabilities.  Such a release is also known as a
+Micro Code Update (MCU), and is a component of a broader Intel Platform
+Update (IPU).  FreeBSD distributes CPU microcode via the devcpu-data port
+and package.
+
+II.  Problem Description
+
+Starting with version 1.26, the devcpu-data port/package includes updates and
+mitigations for the following technical and security advisories (depending
+on CPU model).
+
+Intel TSX Updates (TAA)                 CVE-2019-11135
+Voltage Modulation Vulnerability        CVE-2019-11139
+MD_CLEAR Operations                     CVE-2018-12126
+                                        CVE-2018-12127
+                                        CVE-2018-12130
+                                        CVE-2018-11091
+TA Indirect Sharing                     CVE-2017-5715
+EGETKEY                                 CVE-2018-12126
+                                        CVE-2018-12127
+                                        CVE-2018-12130
+                                        CVE-2018-11091
+JCC                                     SKX102 Erratum
+
+Updated microcode includes mitigations for CPU issues, but may also cause a
+performance regression due to the JCC erratum mitigation.  Please visit
+http://www.intel.com/benchmarks for further information.
+
+Please visit http://www.intel.com/security for detailed information on
+these advisories as well as a list of CPUs that are affected.
+
+III. Impact
+
+Operating a CPU without the latest microcode may result in erratic or
+unpredictable behavior, including system crashes and lock ups.  Certain
+issues listed in this advisory may result in the leakage of privileged
+system information to unprivileged users.  Please refer to the security
+advisories listed above for detailed information.
+
+IV.  Workaround
+
+To determine if TSX is present in your system, run the following:
+
+1. kldload cpuctl
+
+2. cpucontrol -i 7 /dev/cpuctl0
+
+If bits 4 (0x10) and 11 (0x800) are set in the second response word (EBX),
+TSX is present.
+
+In the absence of updated microcode, TAA can be mitigated by enabling the
+MDS mitigation:
+
+3. sysctl hw.mds_disable=1
+
+Systems must be running FreeBSD 11.3, FreeBSD 12.1, or later for this to
+work.
+
+*IMPORTANT*
+If your use case can tolerate leaving the CPU issues unmitigated and cannot
+tolerate a performance regression, ensure that the devcpu-data package is
+not installed or is locked at 1.25 or earlier.
+
+# pkg delete devcpu-data
+
+or
+
+# pkg lock devcpu-data
+
+Later versions of the LLVM and GCC compilers will include changes that
+partially relieve the peformance impact.
+
+V.   Solution
+
+Install the latest Intel Microcode Update via the devcpu-data port/package,
+version 1.26 or later.
+
+Updated microcode adds the ability to disable TSX.  With updated microcode
+the issue can still be mitigated by enabling the MDS mitigation as
+described in the workaround section, or by disabling TSX instead:
+
+1. kldload cpuctl
+
+2. cpucontrol -i 7 /dev/cpuctl0
+
+If bit 29 (0x20000000) is set in the fourth response word (EDX), then the
+0x10a MSR is present.
+
+3. cpucontrol -m 0x10a /dev/cpuctl0
+
+If bit 8 (0x100) of the response word is set, your CPU is not vulnerable to
+TAA and no further action is required.
+
+If bit 7 (0x80) is cleared, then your CPU does not have updated microcode
+that facilitates TSX to be disabled.  The only remedy available is to
+enable the MDS mitigation, as documented above.
+
+4. cpucontrol -m 0x122=3 /dev/cpuctl0
+
+Repeat step 4 for each numbered CPU that is present.
+
+A future kernel change to FreeBSD will provide automatic detection and
+mitigation for TAA.
+
+LLVM 9.0 will be updated in FreeBSD 13-current to address the JCC
+peformance impact.  Updates to prior versions of LLVM are currently being
+evaluated.
+
+VI.  Correction details
+
+There are currently no changes in FreeBSD to address this issue.
+
+VII. References
+
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11135>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11139>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12126>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12127>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12130>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-11091>;
+<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5715>;
+<URL:https://blogs.intel.com/technology/2019/11/ipas-november-2019-intel-platform-update-ipu/
+<URL:https://software.intel.com/security-software-guidance/software-guidance/intel-transactional-synchronization-extensions-intel-tsx-asynchronous-abort>;
+<URL:https://www.intel.com/content/www/us/en/support/articles/000055650.html>;
+
+The latest revision of this advisory is available at
+<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-19:26.mcu.asc>;
+-----BEGIN PGP SIGNATURE-----
+
+iQKTBAEBCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAl3K/DRfFIAAAAAALgAo
+aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
+MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
+5cL4Yg/9Gzuj6w3Gj7oToaaxMWkMHqFgVj45WlLi1zH/Ccz2XsszPXt5+eCGrsuE
+z6EjHb/egPtOZOat3elJLwflfPJ68AMYcEke2IUAt4NpPg9LH9tP+fQshBHFKpvx
+iwjWmXy9cxajS7oVq3n44m5/ac9Z9EdFfGGP7T32PUASV3nk+4IqWGSvCwAOQ+rO
+CAfYB/TEbD6CqXkLiaH5mc+Mrb02jl2NyfX3LcSJptSMV1gtlHt9IOlB6RM/Rtjf
+x0q4L5dBTrpnZTs9a9O4OePxD0EajpfbCtoPRPQM37fcW19J1shooziV1C0fBhcg
+ZHIrxt9x8q4EeBY28BVFKf+j8CM6W+2NXe6ysI4jrE8j21zG5EDVKXU+gmy8Qxuw
+d9gWXLw431RB5XJaTCZtUE8ymxj2G6rxzynUaycJ2CrcuZQSNKMJOblx527TiCFF
+lp8Gat2JpqH1J08EXlGxAVDXnQuiN3lOOZ/NkiU9Qp4cqJgcnVs0nA+CtKbccHIb
+nwdAQJxBPvdWLr4UcFDIs7as0rMTZI02vHbM+a9Z1urm/UgcnXdzAbeISLkhmQ+A
+CjKK+h89Z9h51xG+4Nyu0jGQqTO6U4ihbKTmOqpWj9nocL/uyMiXr0wD0UuOQD/J
+WTR3lPhyQGOJmOR++8WVsmL/h2mdS1rFWocHFoLRRoPcs0zM2c8=
+=kYQh
+-----END PGP SIGNATURE-----

Added: head/share/security/patches/EN-19:19/loader.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/patches/EN-19:19/loader.patch	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,219 @@
+--- stand/efi/loader/bootinfo.c.orig
++++ stand/efi/loader/bootinfo.c
+@@ -287,12 +287,12 @@
+ bi_load_efi_data(struct preloaded_file *kfp)
+ {
+ 	EFI_MEMORY_DESCRIPTOR *mm;
+-	EFI_PHYSICAL_ADDRESS addr;
++	EFI_PHYSICAL_ADDRESS addr = 0;
+ 	EFI_STATUS status;
+ 	const char *efi_novmap;
+ 	size_t efisz;
+ 	UINTN efi_mapkey;
+-	UINTN mmsz, pages, retry, sz;
++	UINTN dsz, pages, retry, sz;
+ 	UINT32 mmver;
+ 	struct efi_map_header *efihdr;
+ 	bool do_vmap;
+@@ -323,76 +323,94 @@
+ 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
+ 
+ 	/*
+-	 * Assgin size of EFI_MEMORY_DESCRIPTOR to keep compatible with
++	 * Assign size of EFI_MEMORY_DESCRIPTOR to keep compatible with
+ 	 * u-boot which doesn't fill this value when buffer for memory
+ 	 * descriptors is too small (eg. 0 to obtain memory map size)
+ 	 */
+-	mmsz = sizeof(EFI_MEMORY_DESCRIPTOR);
++	dsz = sizeof(EFI_MEMORY_DESCRIPTOR);
+ 
+ 	/*
+-	 * It is possible that the first call to ExitBootServices may change
+-	 * the map key. Fetch a new map key and retry ExitBootServices in that
+-	 * case.
++	 * Allocate enough pages to hold the bootinfo block and the
++	 * memory map EFI will return to us. The memory map has an
++	 * unknown size, so we have to determine that first. Note that
++	 * the AllocatePages call can itself modify the memory map, so
++	 * we have to take that into account as well. The changes to
++	 * the memory map are caused by splitting a range of free
++	 * memory into two, so that one is marked as being loader
++	 * data.
++	 */
++
++	sz = 0;
++
++	/*
++	 * Matthew Garrett has observed at least one system changing the
++	 * memory map when calling ExitBootServices, causing it to return an
++	 * error, probably because callbacks are allocating memory.
++	 * So we need to retry calling it at least once.
+ 	 */
+ 	for (retry = 2; retry > 0; retry--) {
+-		/*
+-		 * Allocate enough pages to hold the bootinfo block and the
+-		 * memory map EFI will return to us. The memory map has an
+-		 * unknown size, so we have to determine that first. Note that
+-		 * the AllocatePages call can itself modify the memory map, so
+-		 * we have to take that into account as well. The changes to
+-		 * the memory map are caused by splitting a range of free
+-		 * memory into two (AFAICT), so that one is marked as being
+-		 * loader data.
+-		 */
+-		sz = 0;
+-		BS->GetMemoryMap(&sz, NULL, &efi_mapkey, &mmsz, &mmver);
+-		sz += mmsz;
+-		sz = (sz + 0xf) & ~0xf;
+-		pages = EFI_SIZE_TO_PAGES(sz + efisz);
+-		status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
+-		     pages, &addr);
+-		if (EFI_ERROR(status)) {
+-			printf("%s: AllocatePages error %lu\n", __func__,
+-			    EFI_ERROR_CODE(status));
+-			return (ENOMEM);
+-		}
++		for (;;) {
++			status = BS->GetMemoryMap(&sz, mm, &efi_mapkey, &dsz, &mmver);
++			if (!EFI_ERROR(status))
++				break;
++
++			if (status != EFI_BUFFER_TOO_SMALL) {
++				printf("%s: GetMemoryMap error %lu\n", __func__,
++	                           EFI_ERROR_CODE(status));
++				return (EINVAL);
++			}
++
++			if (addr != 0)
++				BS->FreePages(addr, pages);
++
++			/* Add 10 descriptors to the size to allow for
++			 * fragmentation caused by calling AllocatePages */
++			sz += (10 * dsz);
++			pages = EFI_SIZE_TO_PAGES(sz + efisz);
++			status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
++					pages, &addr);
++			if (EFI_ERROR(status)) {
++				printf("%s: AllocatePages error %lu\n", __func__,
++				    EFI_ERROR_CODE(status));
++				return (ENOMEM);
++			}
+ 
+-		/*
+-		 * Read the memory map and stash it after bootinfo. Align the
+-		 * memory map on a 16-byte boundary (the bootinfo block is page
+-		 * aligned).
+-		 */
+-		efihdr = (struct efi_map_header *)(uintptr_t)addr;
+-		mm = (void *)((uint8_t *)efihdr + efisz);
+-		sz = (EFI_PAGE_SIZE * pages) - efisz;
+-
+-		status = BS->GetMemoryMap(&sz, mm, &efi_mapkey, &mmsz, &mmver);
+-		if (EFI_ERROR(status)) {
+-			printf("%s: GetMemoryMap error %lu\n", __func__,
+-			    EFI_ERROR_CODE(status));
+-			return (EINVAL);
+-		}
+-		status = BS->ExitBootServices(IH, efi_mapkey);
+-		if (EFI_ERROR(status) == 0) {
+ 			/*
+-			 * This may be disabled by setting efi_disable_vmap in
+-			 * loader.conf(5). By default we will setup the virtual
+-			 * map entries.
++			 * Read the memory map and stash it after bootinfo. Align the
++			 * memory map on a 16-byte boundary (the bootinfo block is page
++			 * aligned).
+ 			 */
+-			if (do_vmap)
+-				efi_do_vmap(mm, sz, mmsz, mmver);
+-			efihdr->memory_size = sz;
+-			efihdr->descriptor_size = mmsz;
+-			efihdr->descriptor_version = mmver;
+-			file_addmetadata(kfp, MODINFOMD_EFI_MAP, efisz + sz,
+-			    efihdr);
+-			return (0);
++			efihdr = (struct efi_map_header *)(uintptr_t)addr;
++			mm = (void *)((uint8_t *)efihdr + efisz);
++			sz = (EFI_PAGE_SIZE * pages) - efisz;
+ 		}
++
++		status = BS->ExitBootServices(IH, efi_mapkey);
++		if (!EFI_ERROR(status))
++			break;
++	}
++
++	if (retry == 0) {
+ 		BS->FreePages(addr, pages);
++		printf("ExitBootServices error %lu\n", EFI_ERROR_CODE(status));
++		return (EINVAL);
+ 	}
+-	printf("ExitBootServices error %lu\n", EFI_ERROR_CODE(status));
+-	return (EINVAL);
++
++	/*
++	 * This may be disabled by setting efi_disable_vmap in
++	 * loader.conf(5). By default we will setup the virtual
++	 * map entries.
++	 */
++
++	if (do_vmap)
++		efi_do_vmap(mm, sz, dsz, mmver);
++	efihdr->memory_size = sz;
++	efihdr->descriptor_size = dsz;
++	efihdr->descriptor_version = mmver;
++	file_addmetadata(kfp, MODINFOMD_EFI_MAP, efisz + sz,
++	    efihdr);
++
++	return (0);
+ }
+ 
+ /*
+--- stand/efi/loader/copy.c.orig
++++ stand/efi/loader/copy.c
+@@ -95,7 +95,7 @@
+ efi_verify_staging_size(unsigned long *nr_pages)
+ {
+ 	UINTN sz;
+-	EFI_MEMORY_DESCRIPTOR *map, *p;
++	EFI_MEMORY_DESCRIPTOR *map = NULL, *p;
+ 	EFI_PHYSICAL_ADDRESS start, end;
+ 	UINTN key, dsz;
+ 	UINT32 dver;
+@@ -104,17 +104,28 @@
+ 	unsigned long available_pages = 0;
+ 
+ 	sz = 0;
+-	status = BS->GetMemoryMap(&sz, 0, &key, &dsz, &dver);
+-	if (status != EFI_BUFFER_TOO_SMALL) {
+-		printf("Can't determine memory map size\n");
+-		return;
+-	}
+ 
+-	map = malloc(sz);
+-	status = BS->GetMemoryMap(&sz, map, &key, &dsz, &dver);
+-	if (EFI_ERROR(status)) {
+-		printf("Can't read memory map\n");
+-		goto out;
++	for (;;) {
++		status = BS->GetMemoryMap(&sz, map, &key, &dsz, &dver);
++		if (!EFI_ERROR(status))
++			break;
++
++		if (status != EFI_BUFFER_TOO_SMALL) {
++			printf("Can't read memory map: %lu\n",
++			    EFI_ERROR_CODE(status));
++			goto out;
++		}
++
++		free(map);
++
++		/* Allocate 10 descriptors more than the size reported,
++		 * to allow for any fragmentation caused by calling
++		 * malloc */
++		map = malloc(sz + (10 * dsz));
++		if (map == NULL) {
++			printf("Unable to allocate memory\n");
++			goto out;
++		}
+ 	}
+ 
+ 	ndesc = sz / dsz;

Added: head/share/security/patches/EN-19:19/loader.patch.asc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/patches/EN-19:19/loader.patch.asc	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,18 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQKTBAABCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAl3K+llfFIAAAAAALgAo
+aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
+MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
+5cKQDA//UrHA7uTNrdGlLotWJQfCnFyeso3/jgOV/9eouJ4x0Ci81ubXqjFGs8co
+/lx2PVkFJoJpPHrQOeReYAKiHhvygCilh/04wA9fiVVsrt7Clb4hAY1v4qr4hu32
+lBVZCBLBsWBsWppoN88Xmm6QbQrF1IuVLPxEw55gR/4G9cHUi13WcHrIB68YiBNI
+S3cHqWpPawoLAZcfaEbiMYtEFpnhaVXxPgzNUsmu16pzlZRSof44x9cOP0d5j70c
+3UUqsoO0fT3PQBSoU4xIGg7c6ZAg+iLQEnLnC2PWFMKSov8OFcVF7XbygaLniOc5
+fYXPZWyDw+4T3GDfiftj9j6pXkTcYUJhFz+Ukb0CEJZtV2Pzb6PLS0U4W0+4fyUA
+7vT7WBdkcN5GrMXilu3se6/F/BEGUMC3WvSxpGZv81LyAOZ1j+Sta3uGoBJycJw5
+gX61kDwc2BpzAPrPbIQs0TRxfKaAjDaMYMUmAqXaZWLQDegatqIJ/VMXKiTUSznA
+9lIgQCXaviHXTuBEOCe1NmFmCuYFzVqgzcxq4KrgRbFzTBK0KYcjOoWsTGzjzwdi
+TnQPFsnITZvRqybSMxQDGOcOp3m5WW2jpXzKIsc4E7o4UBEgrPVJFvadhSjnTEAC
+KmzFYMBMKxjdTK0c/B92vADoqOInQD8h5f99cUsu5qT8xM98A3c=
+=U6/A
+-----END PGP SIGNATURE-----

Added: head/share/security/patches/SA-19:25/mcepsc.11.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/patches/SA-19:25/mcepsc.11.patch	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,155 @@
+--- sys/amd64/amd64/pmap.c.orig
++++ sys/amd64/amd64/pmap.c
+@@ -1226,6 +1226,51 @@
+ 	m->md.pat_mode = PAT_WRITE_BACK;
+ }
+ 
++static int pmap_allow_2m_x_ept;
++SYSCTL_INT(_vm_pmap, OID_AUTO, allow_2m_x_ept, CTLFLAG_RWTUN | CTLFLAG_NOFETCH,
++    &pmap_allow_2m_x_ept, 0,
++    "Allow executable superpage mappings in EPT");
++
++void
++pmap_allow_2m_x_ept_recalculate(void)
++{
++	/*
++	 * SKL002, SKL012S.  Since the EPT format is only used by
++	 * Intel CPUs, the vendor check is merely a formality.
++	 */
++	if (!(cpu_vendor_id != CPU_VENDOR_INTEL ||
++	    (cpu_ia32_arch_caps & IA32_ARCH_CAP_IF_PSCHANGE_MC_NO) != 0 ||
++	    (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
++	    (CPUID_TO_MODEL(cpu_id) == 0x26 ||	/* Atoms */
++	    CPUID_TO_MODEL(cpu_id) == 0x27 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x35 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x36 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x37 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x86 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x1c ||
++	    CPUID_TO_MODEL(cpu_id) == 0x4a ||
++	    CPUID_TO_MODEL(cpu_id) == 0x4c ||
++	    CPUID_TO_MODEL(cpu_id) == 0x4d ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5a ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5c ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5d ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5f ||
++	    CPUID_TO_MODEL(cpu_id) == 0x6e ||
++	    CPUID_TO_MODEL(cpu_id) == 0x7a ||
++	    CPUID_TO_MODEL(cpu_id) == 0x57 ||	/* Knights */
++	    CPUID_TO_MODEL(cpu_id) == 0x85))))
++		pmap_allow_2m_x_ept = 1;
++	TUNABLE_INT_FETCH("hw.allow_2m_x_ept", &pmap_allow_2m_x_ept);
++}
++
++static bool
++pmap_allow_2m_x_page(pmap_t pmap, bool executable)
++{
++
++	return (pmap->pm_type != PT_EPT || !executable ||
++	    !pmap_allow_2m_x_ept);
++}
++
+ /*
+  *	Initialize the pmap module.
+  *	Called by vm_init, to initialize any structures that the pmap
+@@ -1270,6 +1315,9 @@
+ 		}
+ 	}
+ 
++	/* IFU */
++	pmap_allow_2m_x_ept_recalculate();
++
+ 	/*
+ 	 * Initialize the vm page array entries for the kernel pmap's
+ 	 * page table pages.
+@@ -4550,6 +4598,15 @@
+ }
+ 
+ #if VM_NRESERVLEVEL > 0
++static bool
++pmap_pde_ept_executable(pmap_t pmap, pd_entry_t pde)
++{
++
++	if (pmap->pm_type != PT_EPT)
++		return (false);
++	return ((pde & EPT_PG_EXECUTE) != 0);
++}
++
+ /*
+  * Tries to promote the 512, contiguous 4KB page mappings that are within a
+  * single page table page (PTP) to a single 2MB page mapping.  For promotion
+@@ -4584,7 +4641,9 @@
+ 	firstpte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
+ setpde:
+ 	newpde = *firstpte;
+-	if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V)) {
++	if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V) ||
++	    !pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
++	    newpde))) {
+ 		atomic_add_long(&pmap_pde_p_failures, 1);
+ 		CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
+ 		    " in pmap %p", va, pmap);
+@@ -5010,6 +5069,12 @@
+ 	PG_V = pmap_valid_bit(pmap);
+ 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ 
++	if (!pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
++	    newpde))) {
++		CTR2(KTR_PMAP, "pmap_enter_pde: 2m x blocked for va %#lx"
++		    " in pmap %p", va, pmap);
++		return (KERN_FAILURE);
++	}
+ 	if ((pdpg = pmap_allocpde(pmap, va, (flags & PMAP_ENTER_NOSLEEP) != 0 ?
+ 	    NULL : lockp)) == NULL) {
+ 		CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
+@@ -5139,6 +5204,7 @@
+ 		va = start + ptoa(diff);
+ 		if ((va & PDRMASK) == 0 && va + NBPDR <= end &&
+ 		    m->psind == 1 && pmap_ps_enabled(pmap) &&
++		    pmap_allow_2m_x_page(pmap, (prot & VM_PROT_EXECUTE) != 0) &&
+ 		    pmap_enter_2mpage(pmap, va, m, prot, &lock))
+ 			m = &m[NBPDR / PAGE_SIZE - 1];
+ 		else
+--- sys/amd64/include/pmap.h.orig
++++ sys/amd64/include/pmap.h
+@@ -407,6 +407,7 @@
+ 
+ void	pmap_activate_boot(pmap_t pmap);
+ void	pmap_activate_sw(struct thread *);
++void	pmap_allow_2m_x_ept_recalculate(void);
+ void	pmap_bootstrap(vm_paddr_t *);
+ int	pmap_cache_bits(pmap_t pmap, int mode, boolean_t is_pde);
+ int	pmap_change_attr(vm_offset_t, vm_size_t, int);
+--- sys/dev/cpuctl/cpuctl.c.orig
++++ sys/dev/cpuctl/cpuctl.c
+@@ -48,6 +48,10 @@
+ #include <sys/pmckern.h>
+ #include <sys/cpuctl.h>
+ 
++#include <vm/vm.h>
++#include <vm/vm_param.h>
++#include <vm/pmap.h>
++
+ #include <machine/cpufunc.h>
+ #include <machine/md_var.h>
+ #include <machine/specialreg.h>
+@@ -535,6 +539,9 @@
+ 	hw_ibrs_recalculate();
+ 	restore_cpu(oldcpu, is_bound, td);
+ 	hw_ssb_recalculate(true);
++#ifdef __amd64__
++	pmap_allow_2m_x_ept_recalculate();
++#endif
+ 	hw_mds_recalculate();
+ 	printcpuinfo();
+ 	return (0);
+--- sys/x86/include/specialreg.h.orig
++++ sys/x86/include/specialreg.h
+@@ -406,6 +406,7 @@
+ #define	IA32_ARCH_CAP_SKIP_L1DFL_VMENTRY	0x00000008
+ #define	IA32_ARCH_CAP_SSB_NO	0x00000010
+ #define	IA32_ARCH_CAP_MDS_NO	0x00000020
++#define	IA32_ARCH_CAP_IF_PSCHANGE_MC_NO	0x00000040
+ 
+ /*
+  * CPUID manufacturers identifiers

Added: head/share/security/patches/SA-19:25/mcepsc.11.patch.asc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/patches/SA-19:25/mcepsc.11.patch.asc	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,18 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQKTBAABCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAl3K+mJfFIAAAAAALgAo
+aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
+MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
+5cJLsg/7BAKmJMh9yd59hixizqFtK2yCPybFOiYau1gsO9FyELIb0PG6Ofb+OnaT
+72tiextc4NIOhsKqayi0+AaIM2nmJfX/AvzrjT/jn7kVvEK5VZuRcXloISvtqwhG
+aIT6OuMdJcCEEorGC3lhK0jjvtakb/OxIqqYuQ45F99lh0I9EtZ0SCP/7d7thIkh
+saXvSXTr93ShDXQPLb25nz5Q9/fGh6TZRLhrwiWi7E1leZlnk8sLMrJMh+7g/ZlQ
+DwjS/E7JRQ+UJ4BSfqDeRppCVs6lT7tCKZbqiptO/KPSx/yoO/fxq+N0wzWB9+I0
+fqoppNNzo8ulmqQ/kclIRxadBDALWB2R9cvQU99nkorkQJ8xvOJLgHBw5o38ZvKO
+E93Fbv0okrO6Pa4FHQlHxVqjmr2ayDILHGN+bLsQL08k86FhpE2Z7YB8IWEtrsuh
+2mHEgzn3IoUg0iPEHUNN5gjv8X8loUeHppLDvIibpVlKfsiqXS0OfbEly9EJz358
+JEr2lc8+IXm2incrsGCZj+To49Gt/6voD6IsPrE01gpevhWmYXL/tXF/QLTPTVSE
+LbAcyddsIXx8Nc++LIUvHiwyk3wNA+coz6wi0DXXluM8l/idwKIWWU8vnWTA0o/L
+D6+G+92yyhp0bNq8okLe1W+UlBZvWJybwKpbetkq23KveqLOUmk=
+=ru3c
+-----END PGP SIGNATURE-----

Added: head/share/security/patches/SA-19:25/mcepsc.12.0.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/security/patches/SA-19:25/mcepsc.12.0.patch	Tue Nov 12 18:48:44 2019	(r53592)
@@ -0,0 +1,155 @@
+--- sys/amd64/amd64/pmap.c.orig
++++ sys/amd64/amd64/pmap.c
+@@ -1309,6 +1309,51 @@
+ 	m->md.pat_mode = PAT_WRITE_BACK;
+ }
+ 
++static int pmap_allow_2m_x_ept;
++SYSCTL_INT(_vm_pmap, OID_AUTO, allow_2m_x_ept, CTLFLAG_RWTUN | CTLFLAG_NOFETCH,
++    &pmap_allow_2m_x_ept, 0,
++    "Allow executable superpage mappings in EPT");
++
++void
++pmap_allow_2m_x_ept_recalculate(void)
++{
++	/*
++	 * SKL002, SKL012S.  Since the EPT format is only used by
++	 * Intel CPUs, the vendor check is merely a formality.
++	 */
++	if (!(cpu_vendor_id != CPU_VENDOR_INTEL ||
++	    (cpu_ia32_arch_caps & IA32_ARCH_CAP_IF_PSCHANGE_MC_NO) != 0 ||
++	    (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
++	    (CPUID_TO_MODEL(cpu_id) == 0x26 ||	/* Atoms */
++	    CPUID_TO_MODEL(cpu_id) == 0x27 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x35 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x36 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x37 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x86 ||
++	    CPUID_TO_MODEL(cpu_id) == 0x1c ||
++	    CPUID_TO_MODEL(cpu_id) == 0x4a ||
++	    CPUID_TO_MODEL(cpu_id) == 0x4c ||
++	    CPUID_TO_MODEL(cpu_id) == 0x4d ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5a ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5c ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5d ||
++	    CPUID_TO_MODEL(cpu_id) == 0x5f ||
++	    CPUID_TO_MODEL(cpu_id) == 0x6e ||
++	    CPUID_TO_MODEL(cpu_id) == 0x7a ||
++	    CPUID_TO_MODEL(cpu_id) == 0x57 ||	/* Knights */
++	    CPUID_TO_MODEL(cpu_id) == 0x85))))
++		pmap_allow_2m_x_ept = 1;
++	TUNABLE_INT_FETCH("hw.allow_2m_x_ept", &pmap_allow_2m_x_ept);
++}
++
++static bool
++pmap_allow_2m_x_page(pmap_t pmap, bool executable)
++{
++
++	return (pmap->pm_type != PT_EPT || !executable ||
++	    !pmap_allow_2m_x_ept);
++}
++
+ /*
+  *	Initialize the pmap module.
+  *	Called by vm_init, to initialize any structures that the pmap
+@@ -1353,6 +1398,9 @@
+ 		}
+ 	}
+ 
++	/* IFU */
++	pmap_allow_2m_x_ept_recalculate();
++
+ 	/*
+ 	 * Initialize the vm page array entries for the kernel pmap's
+ 	 * page table pages.
+@@ -4823,6 +4871,15 @@
+ }
+ 
+ #if VM_NRESERVLEVEL > 0
++static bool
++pmap_pde_ept_executable(pmap_t pmap, pd_entry_t pde)
++{
++
++	if (pmap->pm_type != PT_EPT)
++		return (false);
++	return ((pde & EPT_PG_EXECUTE) != 0);
++}
++
+ /*
+  * Tries to promote the 512, contiguous 4KB page mappings that are within a
+  * single page table page (PTP) to a single 2MB page mapping.  For promotion
+@@ -4857,7 +4914,9 @@
+ 	firstpte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
+ setpde:
+ 	newpde = *firstpte;
+-	if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V)) {
++	if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V) ||
++	    !pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
++	    newpde))) {
+ 		atomic_add_long(&pmap_pde_p_failures, 1);
+ 		CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
+ 		    " in pmap %p", va, pmap);
+@@ -5283,6 +5342,12 @@
+ 	PG_V = pmap_valid_bit(pmap);
+ 	PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ 
++	if (!pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
++	    newpde))) {
++		CTR2(KTR_PMAP, "pmap_enter_pde: 2m x blocked for va %#lx"
++		    " in pmap %p", va, pmap);
++		return (KERN_FAILURE);
++	}
+ 	if ((pdpg = pmap_allocpde(pmap, va, (flags & PMAP_ENTER_NOSLEEP) != 0 ?
+ 	    NULL : lockp)) == NULL) {
+ 		CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
+@@ -5412,6 +5477,7 @@
+ 		va = start + ptoa(diff);
+ 		if ((va & PDRMASK) == 0 && va + NBPDR <= end &&
+ 		    m->psind == 1 && pmap_ps_enabled(pmap) &&
++		    pmap_allow_2m_x_page(pmap, (prot & VM_PROT_EXECUTE) != 0) &&
+ 		    pmap_enter_2mpage(pmap, va, m, prot, &lock))
+ 			m = &m[NBPDR / PAGE_SIZE - 1];
+ 		else
+--- sys/amd64/include/pmap.h.orig
++++ sys/amd64/include/pmap.h
+@@ -413,6 +413,7 @@
+ 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911121848.xACImiJZ011381>