Module Name:    src
Committed By:   thorpej
Date:           Mon Aug 17 00:57:37 UTC 2020

Modified Files:
        src/sys/arch/alpha/alpha: pmap.c
        src/sys/arch/alpha/include: cpu.h

Log Message:
- Track the currently-activated pmap in struct cpu_info.
- Reserve some space in struct cpu_info for future pmap changes.


To generate a diff of this commit:
cvs rdiff -u -r1.267 -r1.268 src/sys/arch/alpha/alpha/pmap.c
cvs rdiff -u -r1.86 -r1.87 src/sys/arch/alpha/include/cpu.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/alpha/alpha/pmap.c
diff -u src/sys/arch/alpha/alpha/pmap.c:1.267 src/sys/arch/alpha/alpha/pmap.c:1.268
--- src/sys/arch/alpha/alpha/pmap.c:1.267	Sun Aug 16 20:04:36 2020
+++ src/sys/arch/alpha/alpha/pmap.c	Mon Aug 17 00:57:37 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.267 2020/08/16 20:04:36 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.268 2020/08/17 00:57:37 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008 The NetBSD Foundation, Inc.
@@ -140,7 +140,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.267 2020/08/16 20:04:36 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.268 2020/08/17 00:57:37 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2035,9 +2035,8 @@ pmap_extract(pmap_t pmap, vaddr_t va, pa
 void
 pmap_activate(struct lwp *l)
 {
-	struct pmap *pmap = l->l_proc->p_vmspace->vm_map.pmap;
-	struct pcb *pcb = lwp_getpcb(l);
-	long cpu_id = cpu_number();
+	struct pmap * const pmap = l->l_proc->p_vmspace->vm_map.pmap;
+	struct pcb * const pcb = lwp_getpcb(l);
 
 #ifdef DEBUG
 	if (pmapdebug & PDB_FOLLOW)
@@ -2045,21 +2044,24 @@ pmap_activate(struct lwp *l)
 #endif
 
 	KASSERT(kpreempt_disabled());
-	KASSERT(l == curlwp);
+
+	struct cpu_info * const ci = curcpu();
+
+	KASSERT(l == ci->ci_curlwp);
 
 	/* Mark the pmap in use by this processor. */
-	atomic_or_ulong(&pmap->pm_cpus, (1UL << cpu_id));
+	atomic_or_ulong(&pmap->pm_cpus, (1UL << ci->ci_cpuid));
 
 	/* Allocate an ASN. */
-	pmap_asn_alloc(pmap, cpu_id);
-	PMAP_ACTIVATE_ASN_SANITY(pmap, cpu_id);
+	pmap_asn_alloc(pmap, ci->ci_cpuid);
+	PMAP_ACTIVATE_ASN_SANITY(pmap, ci->ci_cpuid);
 
 	u_long const old_ptbr = pcb->pcb_hw.apcb_ptbr;
 	u_int const old_asn = pcb->pcb_hw.apcb_asn;
 
 	pcb->pcb_hw.apcb_ptbr =
 	    ALPHA_K0SEG_TO_PHYS((vaddr_t)pmap->pm_lev1map) >> PGSHIFT;
-	pcb->pcb_hw.apcb_asn = (pmap)->pm_asni[cpu_id].pma_asn;
+	pcb->pcb_hw.apcb_asn = (pmap)->pm_asni[ci->ci_cpuid].pma_asn;
 
 	/*
 	 * Check to see if the ASN or page table base has changed; if
@@ -2072,6 +2074,8 @@ pmap_activate(struct lwp *l)
 	    old_ptbr != pcb->pcb_hw.apcb_ptbr) {
 		(void) alpha_pal_swpctx((u_long)l->l_md.md_pcbpaddr);
 	}
+
+	ci->ci_pmap = pmap;
 }
 
 /*
@@ -2083,7 +2087,7 @@ pmap_activate(struct lwp *l)
 void
 pmap_deactivate(struct lwp *l)
 {
-	struct pmap *pmap = l->l_proc->p_vmspace->vm_map.pmap;
+	struct pmap * const pmap = l->l_proc->p_vmspace->vm_map.pmap;
 
 #ifdef DEBUG
 	if (pmapdebug & PDB_FOLLOW)
@@ -2091,16 +2095,24 @@ pmap_deactivate(struct lwp *l)
 #endif
 
 	KASSERT(kpreempt_disabled());
-	KASSERT(l == curlwp);
 
-	atomic_and_ulong(&pmap->pm_cpus, ~(1UL << cpu_number()));
+	struct cpu_info * const ci = curcpu();
+
+	KASSERT(l == ci->ci_curlwp);
+
+	atomic_and_ulong(&pmap->pm_cpus, ~(1UL << ci->ci_cpuid));
 
 	/*
 	 * There is no need to switch to a different PTBR here,
 	 * because a pmap_activate() or SWPCTX is guaranteed
 	 * before whatever lev1map we're on now is invalidated
 	 * or before user space is accessed again.
+	 *
+	 * Because only kernel mappings will be accessed before the
+	 * next pmap_activate() call, we consider our CPU to be on
+	 * the kernel pmap.
 	 */
+	ci->ci_pmap = pmap_kernel();
 }
 
 /*

Index: src/sys/arch/alpha/include/cpu.h
diff -u src/sys/arch/alpha/include/cpu.h:1.86 src/sys/arch/alpha/include/cpu.h:1.87
--- src/sys/arch/alpha/include/cpu.h:1.86	Sun Dec  1 15:34:44 2019
+++ src/sys/arch/alpha/include/cpu.h	Mon Aug 17 00:57:37 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.86 2019/12/01 15:34:44 ad Exp $ */
+/* $NetBSD: cpu.h,v 1.87 2020/08/17 00:57:37 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -128,6 +128,12 @@ struct cpu_info {
 	struct trapframe *ci_db_regs;	/* registers for debuggers */
 	uint64_t ci_pcc_freq;		/* cpu cycles/second */
 
+#define	CPU_INFO_PMAP_DATA_NQWORDS	16
+
+	struct pmap *ci_pmap;		/* currently-activated pmap */
+					/* data used by pmap module */
+	u_long ci_pmap_data[CPU_INFO_PMAP_DATA_NQWORDS];
+
 #if defined(MULTIPROCESSOR)
 	volatile u_long ci_flags;	/* flags; see below */
 	volatile u_long ci_ipis;	/* interprocessor interrupts pending */

Reply via email to