summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-01-24 19:49:13 +0000
committerjhb <jhb@FreeBSD.org>2001-01-24 19:49:13 +0000
commit9f8dbccd5690e7781a608a577902eb6238522fc3 (patch)
treebac5bcae1d8dfdc0eee292920a4f526b8ed89e11
parent1acb4466b06b7dde27e22ccf97f77182199cd3b0 (diff)
downloadFreeBSD-src-9f8dbccd5690e7781a608a577902eb6238522fc3.zip
FreeBSD-src-9f8dbccd5690e7781a608a577902eb6238522fc3.tar.gz
- Remove some unused and unneeded atomic operations sitting in mp_machdep.c
that are already implemented in atomic.h. - Fix SMP kernel builds.
-rw-r--r--sys/alpha/alpha/mp_machdep.c70
-rw-r--r--sys/alpha/alpha/pmap.c4
2 files changed, 13 insertions, 61 deletions
diff --git a/sys/alpha/alpha/mp_machdep.c b/sys/alpha/alpha/mp_machdep.c
index af9d943..bf61c11 100644
--- a/sys/alpha/alpha/mp_machdep.c
+++ b/sys/alpha/alpha/mp_machdep.c
@@ -268,7 +268,7 @@ smp_start_secondary(int cpuid)
void
globaldata_register(struct globaldata *globaldata)
{
- cpuid_to_globaldata[globaldata->cpuid] = globaldata;
+ cpuid_to_globaldata[globaldata->gd_cpuid] = globaldata;
}
struct globaldata *
@@ -912,32 +912,13 @@ smp_ipi_self(u_int64_t ipi)
smp_ipi_selected(1 << PCPU_GET(cpuid), ipi);
}
-static u_int64_t
-atomic_readandclear(u_int64_t* p)
-{
- u_int64_t v, temp;
- __asm__ __volatile__ (
- "wmb\n" /* ensure pending writes have drained */
- "1:\tldq_l %0,%3\n\t" /* load current value, asserting lock */
- "ldiq %1,0\n\t" /* value to store */
- "stq_c %1,%2\n\t" /* attempt to store */
- "beq %1,2f\n\t" /* if the store failed, spin */
- "br 3f\n" /* it worked, exit */
- "2:\tbr 1b\n" /* *p not updated, loop */
- "3:\tmb\n" /* it worked */
- : "=&r"(v), "=&r"(temp), "=m" (*p)
- : "m"(*p)
- : "memory");
- return v;
-}
-
/*
* Handle an IPI sent to this processor.
*/
void
smp_handle_ipi(struct trapframe *frame)
{
- u_int64_t ipis = atomic_readandclear(PCPU_PTR(pending_ipis));
+ u_int64_t ipis = atomic_readandclear_64(PCPU_PTR(pending_ipis));
u_int64_t ipi;
int cpumask;
@@ -970,12 +951,15 @@ smp_handle_ipi(struct trapframe *frame)
case IPI_CHECKSTATE:
CTR0(KTR_SMP, "IPI_CHECKSTATE");
if (frame->tf_regs[FRAME_PS] & ALPHA_PSL_USERMODE)
- checkstate_cpustate[cpuid] = CHECKSTATE_USER;
+ checkstate_cpustate[PCPU_GET(cpuid)] =
+ CHECKSTATE_USER;
else if (curproc->p_intr_nesting_level == 1)
- checkstate_cpustate[cpuid] = CHECKSTATE_SYS;
+ checkstate_cpustate[PCPU_GET(cpuid)] =
+ CHECKSTATE_SYS;
else
- checkstate_cpustate[cpuid] = CHECKSTATE_INTR;
- checkstate_curproc[cpuid] = PCPU_GET(curproc);
+ checkstate_cpustate[PCPU_GET(cpuid)] =
+ CHECKSTATE_INTR;
+ checkstate_curproc[PCPU_GET(cpuid)] = curproc;
atomic_set_int(&checkstate_probed_cpus, cpumask);
break;
@@ -999,39 +983,3 @@ smp_handle_ipi(struct trapframe *frame)
alpha_mb();
}
}
-
-#if 0
-
-/*
- * Atomically compare the value stored at *p with cmpval and if the
- * two values are equal, update the value of *p with newval. Returns
- * zero if the compare failed, nonzero otherwise.
- */
-u_int64_t
-atomic_cmpset_64(volatile u_int64_t* p, u_int64_t cmpval, u_int64_t newval)
-{
- u_int64_t ret, temp;
-
-
- printf("atomic_cmpset_64: *p=%lx, cmpval=%lx, newval=%lx\n",
- *p, cmpval, newval);
- __asm __volatile (
- "1:\tldq_l %1, %5\n\t" /* load old value */
- "cmpeq %1, %3, %0\n\t" /* compare */
- "beq %0, 2f\n\t" /* exit if not equal */
- "mov %4, %1\n\t" /* value to store */
- "stq_c %1, %2\n\t" /* attempt to store */
- "beq %1, 3f\n\t" /* if it failed, spin */
- "2:\n" /* done */
- ".section .text3,\"ax\"\n" /* improve branch prediction */
- "3:\tbr 1b\n" /* try again */
- ".previous\n"
- : "=&r" (ret), "=r" (temp), "=m" (*p)
- : "r" (cmpval), "r" (newval), "m" (*p)
- : "memory");
- printf("atomic_cmpset_64: *p=%lx\n", *p);
-
- return ret;
-}
-
-#endif
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c
index 0a8fc4d..cbd44ae 100644
--- a/sys/alpha/alpha/pmap.c
+++ b/sys/alpha/alpha/pmap.c
@@ -359,6 +359,10 @@ static int pmap_release_free_page __P((pmap_t pmap, vm_page_t p));
static vm_page_t _pmap_allocpte __P((pmap_t pmap, unsigned ptepindex));
static vm_page_t pmap_page_lookup __P((vm_object_t object, vm_pindex_t pindex));
static int pmap_unuse_pt __P((pmap_t, vm_offset_t, vm_page_t));
+#ifdef SMP
+static void pmap_invalidate_page_action __P((void *arg));
+static void pmap_invalidate_all_action __P((void *arg));
+#endif
/*
OpenPOWER on IntegriCloud