svn commit: r345444 - stable/12/sys/amd64/amd64
Konstantin Belousov
kib at FreeBSD.org
Sat Mar 23 10:38:29 UTC 2019
Author: kib
Date: Sat Mar 23 10:38:28 2019
New Revision: 345444
URL: https://svnweb.freebsd.org/changeset/base/345444
Log:
MFC r345226:
amd64: fix switching to the pmap with pti disabled.
Modified:
stable/12/sys/amd64/amd64/pmap.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/amd64/amd64/pmap.c
==============================================================================
--- stable/12/sys/amd64/amd64/pmap.c Sat Mar 23 10:37:26 2019 (r345443)
+++ stable/12/sys/amd64/amd64/pmap.c Sat Mar 23 10:38:28 2019 (r345444)
@@ -7764,12 +7764,11 @@ pmap_pcid_alloc_checked(pmap_t pmap, u_int cpuid)
}
static void
-pmap_activate_sw_pti_post(pmap_t pmap)
+pmap_activate_sw_pti_post(struct thread *td, pmap_t pmap)
{
- if (pmap->pm_ucr3 != PMAP_NO_CR3)
- PCPU_GET(tssp)->tss_rsp0 = ((vm_offset_t)PCPU_PTR(pti_stack) +
- PC_PTI_STACK_SZ * sizeof(uint64_t)) & ~0xful;
+ PCPU_GET(tssp)->tss_rsp0 = pmap->pm_ucr3 != PMAP_NO_CR3 ?
+ PCPU_GET(pti_rsp0) : (uintptr_t)td->td_pcb;
}
static void inline
@@ -7816,15 +7815,16 @@ pmap_activate_sw_pcid_pti(pmap_t pmap, u_int cpuid, co
}
static void
-pmap_activate_sw_pcid_invpcid_pti(pmap_t pmap, u_int cpuid)
+pmap_activate_sw_pcid_invpcid_pti(struct thread *td, pmap_t pmap, u_int cpuid)
{
pmap_activate_sw_pcid_pti(pmap, cpuid, true);
- pmap_activate_sw_pti_post(pmap);
+ pmap_activate_sw_pti_post(td, pmap);
}
static void
-pmap_activate_sw_pcid_noinvpcid_pti(pmap_t pmap, u_int cpuid)
+pmap_activate_sw_pcid_noinvpcid_pti(struct thread *td, pmap_t pmap,
+ u_int cpuid)
{
register_t rflags;
@@ -7848,11 +7848,12 @@ pmap_activate_sw_pcid_noinvpcid_pti(pmap_t pmap, u_int
rflags = intr_disable();
pmap_activate_sw_pcid_pti(pmap, cpuid, false);
intr_restore(rflags);
- pmap_activate_sw_pti_post(pmap);
+ pmap_activate_sw_pti_post(td, pmap);
}
static void
-pmap_activate_sw_pcid_nopti(pmap_t pmap, u_int cpuid)
+pmap_activate_sw_pcid_nopti(struct thread *td __unused, pmap_t pmap,
+ u_int cpuid)
{
uint64_t cached, cr3;
@@ -7867,17 +7868,19 @@ pmap_activate_sw_pcid_nopti(pmap_t pmap, u_int cpuid)
}
static void
-pmap_activate_sw_pcid_noinvpcid_nopti(pmap_t pmap, u_int cpuid)
+pmap_activate_sw_pcid_noinvpcid_nopti(struct thread *td __unused, pmap_t pmap,
+ u_int cpuid)
{
register_t rflags;
rflags = intr_disable();
- pmap_activate_sw_pcid_nopti(pmap, cpuid);
+ pmap_activate_sw_pcid_nopti(td, pmap, cpuid);
intr_restore(rflags);
}
static void
-pmap_activate_sw_nopcid_nopti(pmap_t pmap, u_int cpuid __unused)
+pmap_activate_sw_nopcid_nopti(struct thread *td __unused, pmap_t pmap,
+ u_int cpuid __unused)
{
load_cr3(pmap->pm_cr3);
@@ -7885,16 +7888,18 @@ pmap_activate_sw_nopcid_nopti(pmap_t pmap, u_int cpuid
}
static void
-pmap_activate_sw_nopcid_pti(pmap_t pmap, u_int cpuid __unused)
+pmap_activate_sw_nopcid_pti(struct thread *td, pmap_t pmap,
+ u_int cpuid __unused)
{
- pmap_activate_sw_nopcid_nopti(pmap, cpuid);
+ pmap_activate_sw_nopcid_nopti(td, pmap, cpuid);
PCPU_SET(kcr3, pmap->pm_cr3);
PCPU_SET(ucr3, pmap->pm_ucr3);
- pmap_activate_sw_pti_post(pmap);
+ pmap_activate_sw_pti_post(td, pmap);
}
-DEFINE_IFUNC(static, void, pmap_activate_sw_mode, (pmap_t, u_int), static)
+DEFINE_IFUNC(static, void, pmap_activate_sw_mode, (struct thread *, pmap_t,
+ u_int), static)
{
if (pmap_pcid_enabled && pti && invpcid_works)
@@ -7927,7 +7932,7 @@ pmap_activate_sw(struct thread *td)
#else
CPU_SET(cpuid, &pmap->pm_active);
#endif
- pmap_activate_sw_mode(pmap, cpuid);
+ pmap_activate_sw_mode(td, pmap, cpuid);
#ifdef SMP
CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
#else
More information about the svn-src-all
mailing list