Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Dec 2006 01:51:59 GMT
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 111761 for review
Message-ID:  <200612160151.kBG1pxWJ009581@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=111761

Change 111761 by marcel@marcel_jnpr on 2006/12/16 01:51:40

	First small steps in supporting SMP:
	o  Make it compile.
	o  Count the number of CPUs and set mp_ncpus & mp_maxid.
	
	Remove nooption SMP and nooption GDB from NOTES. Both
	options can be compiled-in.
	
	Add kernel config files for all my PowerPC boxes (= 2),
	so that I always have them around...

Affected files ...

.. //depot/projects/powerpc/sys/powerpc/conf/IMAC#1 add
.. //depot/projects/powerpc/sys/powerpc/conf/NOTES#2 edit
.. //depot/projects/powerpc/sys/powerpc/conf/XSERVE#1 add
.. //depot/projects/powerpc/sys/powerpc/include/pcpu.h#3 edit
.. //depot/projects/powerpc/sys/powerpc/include/smp.h#3 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/machdep.c#5 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#5 edit

Differences ...

==== //depot/projects/powerpc/sys/powerpc/conf/NOTES#2 (text+ko) ====

@@ -56,8 +56,6 @@
 #####################################################################
 # Options we don't want to deal with
 
-nooption 	SMP
-nooption 	GDB
 nooption	PPC_DEBUG
 nooption	PPC_PROBE_CHIPSET
 nooption 	UKBD_DFLT_KEYMAP

==== //depot/projects/powerpc/sys/powerpc/include/pcpu.h#3 (text+ko) ====

@@ -54,11 +54,11 @@
 #define	CPUSAVE_SRR0	6		/* where SRR0 gets saved */
 #define	CPUSAVE_SRR1	7		/* where SRR1 gets saved */
 
-#define PCPUP	((struct pcpu *) powerpc_get_pcpup())
+#define pcpup	((struct pcpu *) powerpc_get_pcpup())
 
-#define	PCPU_GET(member)	(PCPUP->pc_ ## member)
-#define	PCPU_PTR(member)	(&PCPUP->pc_ ## member)
-#define	PCPU_SET(member,value)	(PCPUP->pc_ ## member = (value))
+#define	PCPU_GET(member)	(pcpup->pc_ ## member)
+#define	PCPU_PTR(member)	(&pcpup->pc_ ## member)
+#define	PCPU_SET(member,value)	(pcpup->pc_ ## member = (value))
 
 #endif	/* _KERNEL */
 

==== //depot/projects/powerpc/sys/powerpc/include/smp.h#3 (text+ko) ====

@@ -1,7 +1,48 @@
-/* $FreeBSD: src/sys/powerpc/include/smp.h,v 1.1 2001/06/16 07:14:04 benno Exp $ */
+/*-
+ * Copyright (c) 2006 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_SMP_H_
+#define _MACHINE_SMP_H_
+
+#ifdef _KERNEL
+
+#define	IPI_AST			0
+#define	IPI_RENDEZVOUS		1
+#define	IPI_STOP		2
+#define	IPI_PREEMPT		3
+
+#ifndef LOCORE
+
+void	ipi_all(int ipi);
+void	ipi_all_but_self(int ipi);
+void	ipi_selected(cpumask_t cpus, int ipi);
+void	ipi_self(int ipi);
 
-/*
- * An empty file now,
- * Although in the times to come,
- * More may be found here.
- */
+#endif /* !LOCORE */
+#endif /* _KERNEL */
+#endif /* !_MACHINE_SMP_H */

==== //depot/projects/powerpc/sys/powerpc/powerpc/machdep.c#5 (text+ko) ====

@@ -237,14 +237,6 @@
 
 	EVENTHANDLER_REGISTER(shutdown_final, powerpc_ofw_shutdown, 0,
 	    SHUTDOWN_PRI_LAST);
-
-#ifdef SMP
-	/*
-	 * OK, enough kmem_alloc/malloc state should be up, lets get on with it!
-	 */
-	mp_start();			/* fire up the secondaries */
-	mp_announce();
-#endif  /* SMP */
 }
 
 extern char	kernel_text[], _end[];

==== //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#5 (text+ko) ====

@@ -1,60 +1,82 @@
 /*-
- * Copyright (c) 2000 Doug Rabson
+ * Copyright (c) 2006 Marcel Moolenaar
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
+ *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	$FreeBSD: src/sys/powerpc/powerpc/mp_machdep.c,v 1.13 2006/05/16 14:32:17 phk Exp $
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/powerpc/powerpc/mp_machdep.c,v 1.13 2006/05/16 14:32:17 phk Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/ktr.h>
-#include <sys/proc.h>
-#include <sys/lock.h>
-#include <sys/malloc.h>
-#include <sys/mutex.h>
 #include <sys/kernel.h>
+#include <sys/pcpu.h>
 #include <sys/smp.h>
 
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <vm/vm_map.h>
+#include <machine/smp.h>
 
-#include <machine/atomic.h>
-#include <machine/pmap.h>
-
-int			boot_cpu_id;
+#include <dev/ofw/openfirm.h>
 
 void
 cpu_mp_setmaxid(void)
 {
+	phandle_t dev, root;
+	int res;
+	char buf[8];
+
+	mp_ncpus = 0;
+
+	/*
+	 * Count the actual number of processors listed in the OFW
+	 * device tree.
+	 */
+	root = OF_peer(0);
+	for (dev = OF_child(root); dev != 0; dev = OF_peer(dev)) {
+		res = OF_getprop(dev, "device_type", buf, sizeof(buf));
+		if (res < 0)
+			continue;
+		if (strcmp(buf, "cpu") == 0)
+			mp_ncpus++;
+	}
+	/* Sanity. */
+	if (mp_ncpus == 0)
+		mp_ncpus = 1;
+
+	/*
+	 * Set the largest cpuid we're going to use. This is necessary
+	 * for * VM initialization.
+	 */
+	mp_maxid = min(mp_ncpus, MAXCPU) - 1;
 }
 
 int
 cpu_mp_probe(void)
 {
-	all_cpus = 1;	/* needed for MB init code */
-	return 0;
+
+	/*
+	 * We're not going to enable SMP if there's only 1 processor.
+	 */
+	return (mp_ncpus > 1);
 }
 
 void
@@ -66,3 +88,52 @@
 cpu_mp_announce(void)
 {
 }
+
+static void
+ipi_send(struct pcpu *pc, int ipi)
+{
+}
+
+/* Send an IPI to a set of cpus. */
+void
+ipi_selected(cpumask_t cpus, int ipi)
+{
+	struct pcpu *pc;
+
+	SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
+		if (cpus & pc->pc_cpumask)
+			ipi_send(pc, ipi);
+	}
+}
+
+/* Send an IPI to all CPUs, including myself. */
+void
+ipi_all(int ipi)
+{
+	struct pcpu *pc;
+
+	SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
+		ipi_send(pc, ipi);
+	}
+}
+
+/* Send an IPI to all CPUs EXCEPT myself. */
+void
+ipi_all_but_self(int ipi)
+{
+	struct pcpu *pc;
+
+	SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
+		if (pc != pcpup)
+			ipi_send(pc, ipi);
+	}
+}
+
+/* Send an IPI to myself. */
+void
+ipi_self(int ipi)
+{
+
+	ipi_send(pcpup, ipi);
+}
+



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