Page MenuHomeFreeBSD

D16618.id46675.diff
No OneTemporary

D16618.id46675.diff

Index: head/sys/amd64/amd64/mp_machdep.c
===================================================================
--- head/sys/amd64/amd64/mp_machdep.c
+++ head/sys/amd64/amd64/mp_machdep.c
@@ -58,6 +58,7 @@
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_kern.h>
+#include <vm/vm_map.h>
#include <vm/vm_extern.h>
#include <x86/apicreg.h>
@@ -297,7 +298,6 @@
pc->pc_gs32p = &gdt[NGDT * cpu + GUGS32_SEL];
pc->pc_ldt = (struct system_segment_descriptor *)&gdt[NGDT * cpu +
GUSERLDT_SEL];
- pc->pc_curpmap = kernel_pmap;
pc->pc_pcid_gen = 1;
pc->pc_pcid_next = PMAP_PCID_KERN + 1;
common_tss[cpu].tss_rsp0 = 0;
@@ -342,6 +342,7 @@
while (atomic_load_acq_int(&aps_ready) == 0)
ia32_pause();
+ pmap_activate_boot(vmspace_pmap(proc0.p_vmspace));
init_secondary_tail();
}
Index: head/sys/amd64/amd64/pmap.c
===================================================================
--- head/sys/amd64/amd64/pmap.c
+++ head/sys/amd64/amd64/pmap.c
@@ -2655,9 +2655,7 @@
__pcpu[i].pc_ucr3 = PMAP_NO_CR3;
}
}
- PCPU_SET(curpmap, kernel_pmap);
- pmap_activate(curthread);
- CPU_FILL(&kernel_pmap->pm_active);
+ pmap_activate_boot(pmap);
}
void
@@ -7529,7 +7527,7 @@
intr_restore(rflags);
if (cached)
PCPU_INC(pm_save_cnt);
- } else if (cr3 != pmap->pm_cr3) {
+ } else {
load_cr3(pmap->pm_cr3);
PCPU_SET(curpmap, pmap);
if (pti) {
@@ -7557,6 +7555,26 @@
critical_enter();
pmap_activate_sw(td);
critical_exit();
+}
+
+void
+pmap_activate_boot(pmap_t pmap)
+{
+ u_int cpuid;
+
+ /*
+ * kernel_pmap must be never deactivated, and we ensure that
+ * by never activating it at all.
+ */
+ MPASS(pmap != kernel_pmap);
+
+ cpuid = PCPU_GET(cpuid);
+#ifdef SMP
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
+#else
+ CPU_SET(cpuid, &pmap->pm_active);
+#endif
+ PCPU_SET(curpmap, pmap);
}
void
Index: head/sys/amd64/include/pmap.h
===================================================================
--- head/sys/amd64/include/pmap.h
+++ head/sys/amd64/include/pmap.h
@@ -407,6 +407,7 @@
struct thread;
+void pmap_activate_boot(pmap_t pmap);
void pmap_activate_sw(struct thread *);
void pmap_bootstrap(vm_paddr_t *);
int pmap_cache_bits(pmap_t pmap, int mode, boolean_t is_pde);

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 28, 9:32 PM (11 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26284987
Default Alt Text
D16618.id46675.diff (2 KB)

Event Timeline