Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 Oct 2002 20:38:12 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 18639 for review
Message-ID:  <200210040338.g943cC3Z043199@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=18639

Change 18639 by peter@peter_daintree on 2002/10/03 20:37:41

	IFC @18638

Affected files ...

.. //depot/projects/ia64/sys/i386/isa/mcd.c#5 integrate
.. //depot/projects/ia64/sys/ia64/ia64/sapic.c#13 integrate
.. //depot/projects/ia64/sys/ia64/include/clock.h#4 integrate
.. //depot/projects/ia64/sys/ia64/include/sapicvar.h#4 integrate
.. //depot/projects/ia64/sys/kern/kern_thread.c#14 integrate
.. //depot/projects/ia64/sys/powerpc/conf/GENERIC#10 integrate
.. //depot/projects/ia64/sys/powerpc/include/db_machdep.h#5 integrate
.. //depot/projects/ia64/sys/powerpc/powerpc/db_disasm.c#2 integrate
.. //depot/projects/ia64/sys/powerpc/powerpc/db_interface.c#2 integrate
.. //depot/projects/ia64/sys/powerpc/powerpc/db_memrw.c#2 integrate
.. //depot/projects/ia64/sys/powerpc/powerpc/db_trace.c#3 integrate
.. //depot/projects/ia64/sys/powerpc/powerpc/pmap.c#18 integrate
.. //depot/projects/ia64/sys/powerpc/powerpc/trap.c#18 integrate

Differences ...

==== //depot/projects/ia64/sys/i386/isa/mcd.c#5 (text+ko) ====

@@ -42,7 +42,7 @@
  * 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/i386/isa/mcd.c,v 1.126 2002/09/30 13:49:17 phk Exp $
+ * $FreeBSD: src/sys/i386/isa/mcd.c,v 1.128 2002/10/04 02:21:26 mdodd Exp $
  */
 static const char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
 
@@ -245,7 +245,8 @@
 #define MIN_DELAY       15
 #define DELAY_GETREPLY  5000000
 
-int mcd_attach(struct isa_device *dev)
+static int
+mcd_attach(struct isa_device *dev)
 {
 	int	unit = dev->id_unit;
 	struct mcd_data *cd = mcd_data + unit;
@@ -262,17 +263,14 @@
 #endif
 	/* name filled in probe */
 	make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, 0),
-	    UID_ROOT, GID_OPERATOR, 0640, "rmcd%da", unit);
-	make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, RAW_PART),
-	    UID_ROOT, GID_OPERATOR, 0640, "rmcd%dc", unit);
-	make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, 0),
 	    UID_ROOT, GID_OPERATOR, 0640, "mcd%da", unit);
 	make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, RAW_PART),
 	    UID_ROOT, GID_OPERATOR, 0640, "mcd%dc", unit);
 	return 1;
 }
 
-int mcdopen(dev_t dev, int flags, int fmt, struct thread *td)
+static int
+mcdopen(dev_t dev, int flags, int fmt, struct thread *td)
 {
 	int unit,part,phys,r,retry;
 	struct mcd_data *cd;
@@ -364,7 +362,8 @@
 	return ENXIO;
 }
 
-int mcdclose(dev_t dev, int flags, int fmt, struct thread *td)
+static int
+mcdclose(dev_t dev, int flags, int fmt, struct thread *td)
 {
 	int unit,part;
 	struct mcd_data *cd;
@@ -388,7 +387,7 @@
 	return 0;
 }
 
-void
+static void
 mcdstrategy(struct bio *bp)
 {
 	struct mcd_data *cd;
@@ -459,7 +458,8 @@
 	return;
 }
 
-static void mcd_start(int unit)
+static void
+mcd_start(int unit)
 {
 	struct mcd_data *cd = mcd_data + unit;
 	struct partition *p;
@@ -506,7 +506,8 @@
 	return;
 }
 
-int mcdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
+static int
+mcdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
 {
 	struct mcd_data *cd;
 	int unit,part,retry,r;
@@ -626,7 +627,8 @@
 /* this could have been taken from scsi/cd.c, but it is not clear
  * whether the scsi cd driver is linked in
  */
-static int mcd_getdisklabel(int unit)
+static int
+mcd_getdisklabel(int unit)
 {
 	struct mcd_data *cd = mcd_data + unit;
 
@@ -662,7 +664,8 @@
 	return 0;
 }
 
-int mcdsize(dev_t dev)
+static int
+mcdsize(dev_t dev)
 {
 	int size;
 	int unit = mcd_unit(dev);
@@ -719,7 +722,7 @@
 
 /* check to see if a Mitsumi CD-ROM is attached to the ISA bus */
 
-int
+static int
 mcd_probe(struct isa_device *dev)
 {
 	int port = dev->id_iobase;

==== //depot/projects/ia64/sys/ia64/ia64/sapic.c#13 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/ia64/ia64/sapic.c,v 1.8 2002/08/10 03:36:42 peter Exp $
+ * $FreeBSD: src/sys/ia64/ia64/sapic.c,v 1.9 2002/10/04 01:33:30 peter Exp $
  */
 
 #include "opt_ddb.h"

==== //depot/projects/ia64/sys/ia64/include/clock.h#4 (text+ko) ====

@@ -3,7 +3,7 @@
  * Garrett Wollman, September 1994.
  * This file is in the public domain.
  *
- * $FreeBSD: src/sys/ia64/include/clock.h,v 1.4 2002/03/20 23:30:31 alfred Exp $
+ * $FreeBSD: src/sys/ia64/include/clock.h,v 1.6 2002/10/04 01:57:46 peter Exp $
  */
 
 #ifndef _MACHINE_CLOCK_H_
@@ -15,8 +15,8 @@
 extern	int	wall_cmos_clock;
 extern	int	adjkerntz;
 
-extern	u_int64_t	itc_frequency;
-extern	u_int64_t	itm_reload;
+extern u_int64_t	itc_frequency;
+extern u_int64_t	itm_reload;
 
 int	sysbeep(int pitch, int period);
 int	acquire_timer2(int mode);

==== //depot/projects/ia64/sys/ia64/include/sapicvar.h#4 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/ia64/include/sapicvar.h,v 1.2 2002/03/14 10:17:07 dfr Exp $
+ * $FreeBSD: src/sys/ia64/include/sapicvar.h,v 1.3 2002/10/04 01:33:30 peter Exp $
  */
 
 #ifndef _MACHINE_SAPICVAR_H_

==== //depot/projects/ia64/sys/kern/kern_thread.c#14 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  * DAMAGE.
  *
- * $FreeBSD: src/sys/kern/kern_thread.c,v 1.35 2002/10/02 07:44:23 scottl Exp $
+ * $FreeBSD: src/sys/kern/kern_thread.c,v 1.36 2002/10/04 01:31:39 peter Exp $
  */
 
 #include <sys/param.h>
@@ -216,12 +216,22 @@
 threadinit(void)
 {
 
+#ifndef __ia64__
+	thread_zone = uma_zcreate("THREAD", sizeof (struct thread),
+	    thread_ctor, thread_dtor, thread_init, thread_fini,
+	    UMA_ALIGN_CACHE, 0);
+#else
+	/*
+	 * XXX the ia64 kstack allocator is really lame and is at the mercy
+	 * of contigmallloc().  This hackery is to pre-construct a whole
+	 * pile of thread structures with associated kernel stacks early
+	 * in the system startup while contigmalloc() still works. Once we
+	 * have them, keep them.  Sigh.
+	 */
 	thread_zone = uma_zcreate("THREAD", sizeof (struct thread),
 	    thread_ctor, thread_dtor, thread_init, thread_fini,
 	    UMA_ALIGN_CACHE, UMA_ZONE_NOFREE);
-#ifdef __ia64__
-	/* grab some kstacks while we have plenty of contiguous ram */
-	uma_prealloc(thread_zone, 512);
+	uma_prealloc(thread_zone, 512);		/* XXX arbitary */
 #endif
 	ksegrp_zone = uma_zcreate("KSEGRP", sizeof (struct ksegrp),
 	    NULL, NULL, NULL, NULL,

==== //depot/projects/ia64/sys/powerpc/conf/GENERIC#10 (text+ko) ====

@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first 
 # in NOTES.
 #
-# $FreeBSD: src/sys/powerpc/conf/GENERIC,v 1.14 2002/09/22 01:18:06 benno Exp $
+# $FreeBSD: src/sys/powerpc/conf/GENERIC,v 1.15 2002/10/04 01:19:18 grehan Exp $
 
 machine		powerpc
 cpu		MPC750
@@ -57,7 +57,7 @@
 #options	_KPOSIX_PRIORITY_SCHEDULING
 
 # Debugging for use in -current
-#options		DDB			#Enable the kernel debugger
+options		DDB			#Enable the kernel debugger
 options		INVARIANTS		#Enable calls of extra sanity checking
 options		INVARIANT_SUPPORT	#Extra sanity checks of internal structures, required by INVARIANTS
 options		WITNESS			#Enable checks to detect deadlocks and cycles

==== //depot/projects/ia64/sys/powerpc/include/db_machdep.h#5 (text+ko) ====

@@ -25,7 +25,7 @@
  *
  *	$OpenBSD: db_machdep.h,v 1.2 1997/03/21 00:48:48 niklas Exp $
  *	$NetBSD: db_machdep.h,v 1.4.22.1 2000/08/05 11:10:43 wiz Exp $
- * $FreeBSD: src/sys/powerpc/include/db_machdep.h,v 1.4 2002/07/10 12:21:50 benno Exp $
+ * $FreeBSD: src/sys/powerpc/include/db_machdep.h,v 1.5 2002/10/04 01:19:18 grehan Exp $
  */
 
 /*
@@ -42,7 +42,7 @@
 #define	DB_ELFSIZE	32
 
 typedef	vm_offset_t	db_addr_t;	/* address - unsigned */
-typedef	long		db_expr_t;	/* expression - signed */
+typedef	int		db_expr_t;	/* expression - signed */
 struct powerpc_saved_state {
 	u_int32_t	r[32];		/* data registers */
 	u_int32_t	iar;

==== //depot/projects/ia64/sys/powerpc/powerpc/db_disasm.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/powerpc/powerpc/db_disasm.c,v 1.1 2002/07/10 12:21:54 benno Exp $	*/
+/*	$FreeBSD: src/sys/powerpc/powerpc/db_disasm.c,v 1.2 2002/10/04 01:19:18 grehan Exp $	*/
 /*	$NetBSD: db_disasm.c,v 1.12 2002/01/05 22:07:26 jhawk Exp $	*/
 /*	$OpenBSD: db_disasm.c,v 1.2 1996/12/28 06:21:48 rahnds Exp $	*/
 
@@ -717,8 +717,7 @@
 		LI = LI << 8;
 		LI = LI >> 6;
 		LI += loc;
-		db_symstr(pstr, LI, DB_STGY_ANY);
-		pstr += strlen(pstr);
+		pstr += sprintf (pstr, "0x%x, ", LI);
 		func &= ~Op_LI;
 	}
 	switch (func & Op_SIMM) {
@@ -739,6 +738,7 @@
 		pstr += sprintf(pstr, "0x%x", IMM);
 		break;
 	default:
+		break;
 	}
 	if (func & Op_BD) {
 		u_int BD;

==== //depot/projects/ia64/sys/powerpc/powerpc/db_interface.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/powerpc/powerpc/db_interface.c,v 1.1 2002/07/10 12:21:54 benno Exp $ */
+/*	$FreeBSD: src/sys/powerpc/powerpc/db_interface.c,v 1.2 2002/10/04 01:19:18 grehan Exp $ */
 /*	$NetBSD: db_interface.c,v 1.20 2002/05/13 20:30:09 matt Exp $ */
 /*	$OpenBSD: db_interface.c,v 1.2 1996/12/28 06:21:50 rahnds Exp $	*/
 
@@ -9,6 +9,7 @@
 #include <sys/param.h>
 #include <sys/proc.h>
 #include <sys/systm.h>
+#include <sys/cons.h>
 
 #include <machine/db_machdep.h>
 #include <machine/frame.h>

==== //depot/projects/ia64/sys/powerpc/powerpc/db_memrw.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/powerpc/powerpc/db_memrw.c,v 1.1 2002/07/10 12:21:54 benno Exp $ */
+/*	$FreeBSD: src/sys/powerpc/powerpc/db_memrw.c,v 1.2 2002/10/04 01:19:18 grehan Exp $ */
 /*	$NetBSD: db_memrw.c,v 1.5 2001/12/27 10:25:41 dbj Exp $	*/
 /*	$OpenBSD: db_memrw.c,v 1.2 1996/12/28 06:21:52 rahnds Exp $	*/
 
@@ -47,7 +47,7 @@
 
 #include <machine/db_machdep.h>
 
-#include <ddb/db_access.h>
+#include <ddb/ddb.h>
 
 /*
  * Read bytes from kernel address space for debugger.

==== //depot/projects/ia64/sys/powerpc/powerpc/db_trace.c#3 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/powerpc/powerpc/db_trace.c,v 1.2 2002/09/19 18:46:29 jhb Exp $ */
+/*	$FreeBSD: src/sys/powerpc/powerpc/db_trace.c,v 1.3 2002/10/04 01:19:18 grehan Exp $ */
 /*	$NetBSD: db_trace.c,v 1.20 2002/05/13 20:30:09 matt Exp $	*/
 /*	$OpenBSD: db_trace.c,v 1.3 1997/03/21 02:10:48 niklas Exp $	*/
 
@@ -29,6 +29,7 @@
  */
 
 #include <sys/param.h>
+#include <sys/systm.h>
 #include <sys/proc.h>
 #include <sys/user.h>
 
@@ -46,48 +47,48 @@
 #include <ddb/db_variables.h>
 
 struct db_variable db_regs[] = {
-	{ "r0",  (long *)&ddb_regs.r[0],  FCN_NULL },
-	{ "r1",  (long *)&ddb_regs.r[1],  FCN_NULL },
-	{ "r2",  (long *)&ddb_regs.r[2],  FCN_NULL },
-	{ "r3",  (long *)&ddb_regs.r[3],  FCN_NULL },
-	{ "r4",  (long *)&ddb_regs.r[4],  FCN_NULL },
-	{ "r5",  (long *)&ddb_regs.r[5],  FCN_NULL },
-	{ "r6",  (long *)&ddb_regs.r[6],  FCN_NULL },
-	{ "r7",  (long *)&ddb_regs.r[7],  FCN_NULL },
-	{ "r8",  (long *)&ddb_regs.r[8],  FCN_NULL },
-	{ "r9",  (long *)&ddb_regs.r[9],  FCN_NULL },
-	{ "r10", (long *)&ddb_regs.r[10], FCN_NULL },
-	{ "r11", (long *)&ddb_regs.r[11], FCN_NULL },
-	{ "r12", (long *)&ddb_regs.r[12], FCN_NULL },
-	{ "r13", (long *)&ddb_regs.r[13], FCN_NULL },
-	{ "r14", (long *)&ddb_regs.r[14], FCN_NULL },
-	{ "r15", (long *)&ddb_regs.r[15], FCN_NULL },
-	{ "r16", (long *)&ddb_regs.r[16], FCN_NULL },
-	{ "r17", (long *)&ddb_regs.r[17], FCN_NULL },
-	{ "r18", (long *)&ddb_regs.r[18], FCN_NULL },
-	{ "r19", (long *)&ddb_regs.r[19], FCN_NULL },
-	{ "r20", (long *)&ddb_regs.r[20], FCN_NULL },
-	{ "r21", (long *)&ddb_regs.r[21], FCN_NULL },
-	{ "r22", (long *)&ddb_regs.r[22], FCN_NULL },
-	{ "r23", (long *)&ddb_regs.r[23], FCN_NULL },
-	{ "r24", (long *)&ddb_regs.r[24], FCN_NULL },
-	{ "r25", (long *)&ddb_regs.r[25], FCN_NULL },
-	{ "r26", (long *)&ddb_regs.r[26], FCN_NULL },
-	{ "r27", (long *)&ddb_regs.r[27], FCN_NULL },
-	{ "r28", (long *)&ddb_regs.r[28], FCN_NULL },
-	{ "r29", (long *)&ddb_regs.r[29], FCN_NULL },
-	{ "r30", (long *)&ddb_regs.r[30], FCN_NULL },
-	{ "r31", (long *)&ddb_regs.r[31], FCN_NULL },
-	{ "iar", (long *)&ddb_regs.iar,   FCN_NULL },
-	{ "msr", (long *)&ddb_regs.msr,   FCN_NULL },
-	{ "lr",  (long *)&ddb_regs.lr,    FCN_NULL },
-	{ "ctr", (long *)&ddb_regs.ctr,   FCN_NULL },
-	{ "cr",  (long *)&ddb_regs.cr,    FCN_NULL },
-	{ "xer", (long *)&ddb_regs.xer,   FCN_NULL },
+	{ "r0",  &ddb_regs.r[0],  FCN_NULL },
+	{ "r1",  &ddb_regs.r[1],  FCN_NULL },
+	{ "r2",  &ddb_regs.r[2],  FCN_NULL },
+	{ "r3",  &ddb_regs.r[3],  FCN_NULL },
+	{ "r4",  &ddb_regs.r[4],  FCN_NULL },
+	{ "r5",  &ddb_regs.r[5],  FCN_NULL },
+	{ "r6",  &ddb_regs.r[6],  FCN_NULL },
+	{ "r7",  &ddb_regs.r[7],  FCN_NULL },
+	{ "r8",  &ddb_regs.r[8],  FCN_NULL },
+	{ "r9",  &ddb_regs.r[9],  FCN_NULL },
+	{ "r10", &ddb_regs.r[10], FCN_NULL },
+	{ "r11", &ddb_regs.r[11], FCN_NULL },
+	{ "r12", &ddb_regs.r[12], FCN_NULL },
+	{ "r13", &ddb_regs.r[13], FCN_NULL },
+	{ "r14", &ddb_regs.r[14], FCN_NULL },
+	{ "r15", &ddb_regs.r[15], FCN_NULL },
+	{ "r16", &ddb_regs.r[16], FCN_NULL },
+	{ "r17", &ddb_regs.r[17], FCN_NULL },
+	{ "r18", &ddb_regs.r[18], FCN_NULL },
+	{ "r19", &ddb_regs.r[19], FCN_NULL },
+	{ "r20", &ddb_regs.r[20], FCN_NULL },
+	{ "r21", &ddb_regs.r[21], FCN_NULL },
+	{ "r22", &ddb_regs.r[22], FCN_NULL },
+	{ "r23", &ddb_regs.r[23], FCN_NULL },
+	{ "r24", &ddb_regs.r[24], FCN_NULL },
+	{ "r25", &ddb_regs.r[25], FCN_NULL },
+	{ "r26", &ddb_regs.r[26], FCN_NULL },
+	{ "r27", &ddb_regs.r[27], FCN_NULL },
+	{ "r28", &ddb_regs.r[28], FCN_NULL },
+	{ "r29", &ddb_regs.r[29], FCN_NULL },
+	{ "r30", &ddb_regs.r[30], FCN_NULL },
+	{ "r31", &ddb_regs.r[31], FCN_NULL },
+	{ "iar", &ddb_regs.iar,   FCN_NULL },
+	{ "msr", &ddb_regs.msr,   FCN_NULL },
+	{ "lr",  &ddb_regs.lr,    FCN_NULL },
+	{ "ctr", &ddb_regs.ctr,   FCN_NULL },
+	{ "cr",  &ddb_regs.cr,    FCN_NULL },
+	{ "xer", &ddb_regs.xer,   FCN_NULL },
 #ifdef PPC_IBM4XX
-	{ "dear", (long *)&ddb_regs.dear, FCN_NULL },
-	{ "esr", (long *)&ddb_regs.esr,   FCN_NULL },
-	{ "pid", (long *)&ddb_regs.pid,   FCN_NULL },
+	{ "dear", &ddb_regs.dear, FCN_NULL },
+	{ "esr", &ddb_regs.esr,   FCN_NULL },
+	{ "pid", &ddb_regs.pid,   FCN_NULL },
 #endif
 };
 struct db_variable *db_eregs = db_regs + sizeof (db_regs)/sizeof (db_regs[0]);
@@ -98,19 +99,15 @@
 /*
  *	Frame tracing.
  */
-void
-db_stack_trace_print(addr, have_addr, count, modif, pr)
-	db_expr_t addr;
-	int have_addr;
-	db_expr_t count;
-	char *modif;
-	void (*pr) __P((const char *, ...));
+static void
+db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, 
+		     char *modif, void (*pr)(const char *, ...))
 {
 	db_addr_t frame, lr, caller, *args;
 	db_addr_t fakeframe[2];
 	db_expr_t diff;
-	db_sym_t sym;
-	char *symname;
+	c_db_sym_t sym;
+	const char *symname;
 	boolean_t kernel_only = TRUE;
 	boolean_t trace_thread = FALSE;
 	boolean_t full = FALSE;

==== //depot/projects/ia64/sys/powerpc/powerpc/pmap.c#18 (text+ko) ====

@@ -92,7 +92,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-   "$FreeBSD: src/sys/powerpc/powerpc/pmap.c,v 1.48 2002/10/02 07:44:27 scottl Exp $";
+   "$FreeBSD: src/sys/powerpc/powerpc/pmap.c,v 1.49 2002/10/04 01:13:34 grehan Exp $";
 #endif /* not lint */
 
 /*
@@ -1544,11 +1544,18 @@
 void
 pmap_new_thread(struct thread *td, int pages)
 {
+	vm_page_t	ma[KSTACK_MAX_PAGES];
 	vm_object_t	ksobj;
 	vm_offset_t	ks;
 	vm_page_t	m;
 	u_int		i;
 
+	/* Bounds check */
+	if (pages <= 1)
+		pages = KSTACK_PAGES; 
+	else if (pages > KSTACK_MAX_PAGES)
+		pages = KSTACK_MAX_PAGES;
+
 	/*
 	 * Allocate object for the kstack.
 	 */
@@ -1578,46 +1585,127 @@
 		 */
 		m = vm_page_grab(ksobj, i,
 		    VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED);
-
-		/*
-		 * Enter the page into the kernel address space.
-		 */
-		pmap_kenter(ks + i * PAGE_SIZE, VM_PAGE_TO_PHYS(m));
+		ma[i] = m;
 
 		vm_page_wakeup(m);
 		vm_page_flag_clear(m, PG_ZERO);
 		m->valid = VM_PAGE_BITS_ALL;
 	}
+
+	/*
+	 * Enter the page into the kernel address space
+	 */
+	pmap_qenter(ks, ma, pages);
 }
 
 void
 pmap_dispose_thread(struct thread *td)
 {
-	TODO;
+	vm_object_t ksobj;
+	vm_offset_t ks;
+	vm_page_t m;
+	int i;
+	int pages;
+
+	pages = td->td_kstack_pages;
+	ksobj = td->td_kstack_obj;
+	ks = td->td_kstack;
+	for (i = 0; i < pages ; i++) {
+		m = vm_page_lookup(ksobj, i);
+		if (m == NULL)
+			panic("pmap_dispose_thread: kstack already missing?");
+		vm_page_lock_queues();
+		vm_page_busy(m);
+		vm_page_unwire(m, 0);
+		vm_page_free(m);
+		vm_page_unlock_queues();
+	}
+	pmap_qremove(ks, pages);
+	kmem_free(kernel_map, ks - (KSTACK_GUARD_PAGES * PAGE_SIZE),
+	   (pages + KSTACK_GUARD_PAGES) * PAGE_SIZE);
+	vm_object_deallocate(ksobj);
 }
 
 void
 pmap_new_altkstack(struct thread *td, int pages)
 {
-	TODO;
+	/* shuffle the original stack */
+	td->td_altkstack_obj = td->td_kstack_obj;
+	td->td_altkstack = td->td_kstack;
+	td->td_altkstack_pages = td->td_kstack_pages;
+
+	pmap_new_thread(td, pages);
 }
 
 void
 pmap_dispose_altkstack(struct thread *td)
 {
-	TODO;
+	pmap_dispose_thread(td);
+
+	/* restore the original kstack */
+	td->td_kstack = td->td_altkstack;
+	td->td_kstack_obj = td->td_altkstack_obj;
+	td->td_kstack_pages = td->td_altkstack_pages;
+	td->td_altkstack = 0;
+	td->td_altkstack_obj = NULL;
+	td->td_altkstack_pages = 0;
 }
 
 void
 pmap_swapin_thread(struct thread *td)
 {
-	TODO;
+	vm_page_t ma[KSTACK_MAX_PAGES];
+	vm_object_t ksobj;
+	vm_offset_t ks;
+	vm_page_t m;
+	int rv;
+	int i;
+	int pages;
+
+	pages = td->td_kstack_pages;
+	ksobj = td->td_kstack_obj;
+	ks = td->td_kstack;
+	for (i = 0; i < pages; i++) {
+		m = vm_page_grab(ksobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+		if (m->valid != VM_PAGE_BITS_ALL) {
+			rv = vm_pager_get_pages(ksobj, &m, 1, 0);
+			if (rv != VM_PAGER_OK)
+				panic("pmap_swapin_thread: cannot get kstack");
+			m = vm_page_lookup(ksobj, i);
+			m->valid = VM_PAGE_BITS_ALL;
+		}
+		ma[i] = m;
+		vm_page_lock_queues();
+		vm_page_wire(m);
+		vm_page_wakeup(m);
+		vm_page_unlock_queues();
+	}
+	pmap_qenter(ks, ma, pages);
 }
 
+
 void
 pmap_swapout_thread(struct thread *td)
 {
-	TODO;
+	vm_object_t ksobj;
+	vm_offset_t ks;
+	vm_page_t m;
+	int i;
+	int pages;
+
+	pages = td->td_kstack_pages;
+	ksobj = td->td_kstack_obj;
+	ks = (vm_offset_t)td->td_kstack;
+	for (i = 0; i < pages; i++) {
+		m = vm_page_lookup(ksobj, i);
+		if (m == NULL)
+			panic("pmap_swapout_thread: kstack already missing?");
+		vm_page_lock_queues();
+		vm_page_dirty(m);
+		vm_page_unwire(m, 0);
+		vm_page_unlock_queues();
+	}
+	pmap_qremove(ks, pages);
 }
 
 /*

==== //depot/projects/ia64/sys/powerpc/powerpc/trap.c#18 (text+ko) ====

@@ -33,7 +33,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-  "$FreeBSD: src/sys/powerpc/powerpc/trap.c,v 1.33 2002/09/19 04:38:35 grehan Exp $";
+  "$FreeBSD: src/sys/powerpc/powerpc/trap.c,v 1.34 2002/10/04 01:19:18 grehan Exp $";
 #endif /* not lint */
 
 #include "opt_ddb.h"
@@ -75,6 +75,8 @@
 #include <machine/spr.h>
 #include <machine/sr.h>
 
+#include <ddb/ddb.h>
+
 #ifndef MULTIPROCESSOR
 extern int intr_depth;
 #endif
@@ -280,7 +282,7 @@
 
 	printtrap(frame->exc, frame, 1, (frame->srr1 & PSL_PR));
 #ifdef DDB
-	if ((debugger_on_panic || db_active) && kdb_trap(frame->exc, 0, frame))
+	if ((debugger_on_panic || db_active) && kdb_trap(frame->exc, frame))
 		return;
 #endif
 	panic("%s trap", trapname(frame->exc));

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




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