From owner-p4-projects Thu Oct 3 20:38:30 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id AEFBD37B404; Thu, 3 Oct 2002 20:38:13 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 527B637B401 for ; Thu, 3 Oct 2002 20:38:13 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 9EEBD43E81 for ; Thu, 3 Oct 2002 20:38:12 -0700 (PDT) (envelope-from peter@freebsd.org) Received: from freefall.freebsd.org (perforce@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.6/8.12.6) with ESMTP id g943cCCo043202 for ; Thu, 3 Oct 2002 20:38:12 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by freefall.freebsd.org (8.12.6/8.12.6/Submit) id g943cC3Z043199 for perforce@freebsd.org; Thu, 3 Oct 2002 20:38:12 -0700 (PDT) Date: Thu, 3 Oct 2002 20:38:12 -0700 (PDT) Message-Id: <200210040338.g943cC3Z043199@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm Subject: PERFORCE change 18639 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG 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 @@ -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 #include #include +#include #include #include ==== //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 -#include +#include /* * 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 +#include #include #include @@ -46,48 +47,48 @@ #include 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 #include +#include + #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