Module Name:    src
Committed By:   matt
Date:           Fri Aug 21 17:48:57 UTC 2009

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: mips_machdep.c

Log Message:
Make prototype locoresw const.
Don't cast l_md.md_regs anymore.
Make FP save/resume ABI agnostic.


To generate a diff of this commit:
cvs rdiff -u -r1.205.4.1.2.1.2.1 -r1.205.4.1.2.1.2.2 \
    src/sys/arch/mips/mips/mips_machdep.c

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/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.1 src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.2
--- src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.1	Thu Aug 20 04:36:05 2009
+++ src/sys/arch/mips/mips/mips_machdep.c	Fri Aug 21 17:48:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.1 2009/08/20 04:36:05 uebayasi Exp $	*/
+/*	$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.2 2009/08/21 17:48:57 matt Exp $	*/
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -112,7 +112,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.1 2009/08/20 04:36:05 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.2 2009/08/21 17:48:57 matt Exp $");
 
 #include "opt_cputype.h"
 
@@ -168,32 +168,32 @@
 
 #if defined(MIPS1)
 static void	mips1_vector_init(void);
-extern long	*mips1_locoresw[];
+extern const struct locoresw mips1_locoresw;
 #endif
 
 #if defined(MIPS3)
 #if defined(MIPS3_5900)
 static void	r5900_vector_init(void);
-extern long	*mips5900_locoresw[];
+extern const struct locoresw mips5900_locoresw;
 #else
 static void	mips3_vector_init(void);
-extern long	*mips3_locoresw[];
+extern const struct locoresw mips3_locoresw;
 #endif
 #endif
 
 #if defined(MIPS32)
 static void	mips32_vector_init(void);
-extern long	*mips32_locoresw[];
+extern const struct locoresw mips32_locoresw;
 #endif
 
 #if defined(MIPS64)
 static void	mips64_vector_init(void);
-extern long	*mips64_locoresw[];
+extern const struct locoresw mips64_locoresw;
 #endif
 
 mips_locore_jumpvec_t mips_locore_jumpvec;
 
-long *mips_locoresw[4];
+struct locoresw mips_locoresw;
 
 int cpu_arch;
 int cpu_mhz;
@@ -443,7 +443,7 @@
  * Company ID's are not sparse (yet), this array is indexed directly
  * by pridtab->cpu_cid.
  */
-static const char *cidnames[] = {
+static const char * const cidnames[] = {
 	"Prehistoric",
 	"MIPS",		/* or "MIPS Technologies, Inc.	*/
 	"Broadcom",	/* or "Broadcom Corp."		*/
@@ -457,8 +457,7 @@
 /*
  * MIPS-I locore function vector
  */
-static const mips_locore_jumpvec_t mips1_locore_vec =
-{
+static const mips_locore_jumpvec_t mips1_locore_vec = {
 	mips1_SetPID,
 	mips1_TBIAP,
 	mips1_TBIS,
@@ -488,8 +487,7 @@
 	/*
 	 * Copy locore-function vector.
 	 */
-	memcpy(&mips_locore_jumpvec, &mips1_locore_vec,
-		sizeof(mips_locore_jumpvec_t));
+	mips_locore_jumpvec = mips1_locore_vec;
 
 	/*
 	 * Clear out the I and D caches.
@@ -504,8 +502,7 @@
 /*
  * MIPS III locore function vector
  */
-static const mips_locore_jumpvec_t mips3_locore_vec =
-{
+static const mips_locore_jumpvec_t mips3_locore_vec = {
 	mips3_SetPID,
 	mips3_TBIAP,
 	mips3_TBIS,
@@ -553,8 +550,7 @@
 	/*
 	 * Copy locore-function vector.
 	 */
-	memcpy(&mips_locore_jumpvec, &mips3_locore_vec,
-	      sizeof(mips_locore_jumpvec_t));
+	mips_locore_jumpvec = mips3_locore_vec;
 
 	mips_icache_sync_all();
 	mips_dcache_wbinv_all();
@@ -569,8 +565,7 @@
  * MIPS R5900 locore function vector.
  * Same as MIPS32 - all MMU registers are 32bit.
  */
-static const mips_locore_jumpvec_t r5900_locore_vec =
-{
+static const mips_locore_jumpvec_t r5900_locore_vec = {
 	mips5900_SetPID,
 	mips5900_TBIAP,
 	mips5900_TBIS,
@@ -600,8 +595,7 @@
 	memcpy((void *)MIPS3_GEN_EXC_VEC, mips5900_exception, esz);
 	memcpy((void *)MIPS3_INTR_EXC_VEC, mips5900_exception, esz);
 
-	memcpy(&mips_locore_jumpvec, &r5900_locore_vec,
-	    sizeof(mips_locore_jumpvec_t));
+	mips_locore_jumpvec = r5900_locore_vec;
 
 	mips_config_cache();
 
@@ -618,8 +612,7 @@
 /*
  * MIPS32 locore function vector
  */
-static const mips_locore_jumpvec_t mips32_locore_vec =
-{
+static const mips_locore_jumpvec_t mips32_locore_vec = {
 	mips32_SetPID,
 	mips32_TBIAP,
 	mips32_TBIS,
@@ -674,8 +667,7 @@
 	/*
 	 * Copy locore-function vector.
 	 */
-	memcpy(&mips_locore_jumpvec, &mips32_locore_vec,
-		      sizeof(mips_locore_jumpvec_t));
+	mips_locore_jumpvec = mips32_locore_vec;
 
 	mips_icache_sync_all();
 	mips_dcache_wbinv_all();
@@ -689,8 +681,7 @@
 /*
  * MIPS64 locore function vector
  */
-const mips_locore_jumpvec_t mips64_locore_vec =
-{
+const mips_locore_jumpvec_t mips64_locore_vec = {
 	mips64_SetPID,
 	mips64_TBIAP,
 	mips64_TBIS,
@@ -751,8 +742,7 @@
 	/*
 	 * Copy locore-function vector.
 	 */
-	memcpy(&mips_locore_jumpvec, &mips64_locore_vec,
-	      sizeof(mips_locore_jumpvec_t));
+	mips_locore_jumpvec = mips64_locore_vec;
 
 	mips_icache_sync_all();
 	mips_dcache_wbinv_all();
@@ -908,7 +898,7 @@
 	case CPU_ARCH_MIPS1:
 		mips1_TBIA(mips_num_tlb_entries);
 		mips1_vector_init();
-		memcpy(mips_locoresw, mips1_locoresw, sizeof(mips_locoresw));
+		mips_locoresw = mips1_locoresw;
 		break;
 #endif
 #if defined(MIPS3)
@@ -920,7 +910,7 @@
 		mips5900_TBIA(mips_num_tlb_entries);
 		mips3_cp0_wired_write(MIPS3_TLB_WIRED_UPAGES);
 		r5900_vector_init();
-		memcpy(mips_locoresw, mips5900_locoresw, sizeof(mips_locoresw));
+		mips_locoresw = mips5900_locoresw;
 #else /* MIPS3_5900 */
 #if defined(MIPS3_4100)
 		if (MIPS_PRID_IMPL(cpu_id) == MIPS_R4100)
@@ -932,7 +922,7 @@
 		mips3_TBIA(mips_num_tlb_entries);
 		mips3_cp0_wired_write(MIPS3_TLB_WIRED_UPAGES);
 		mips3_vector_init();
-		memcpy(mips_locoresw, mips3_locoresw, sizeof(mips_locoresw));
+		mips_locoresw = mips3_locoresw;
 #endif /* MIPS3_5900 */
 		break;
 #endif
@@ -943,7 +933,7 @@
 		mips32_TBIA(mips_num_tlb_entries);
 		mips3_cp0_wired_write(MIPS3_TLB_WIRED_UPAGES);
 		mips32_vector_init();
-		memcpy(mips_locoresw, mips32_locoresw, sizeof(mips_locoresw));
+		mips_locoresw = mips32_locoresw;
 		break;
 #endif
 #if defined(MIPS64)
@@ -953,7 +943,7 @@
 		mips64_TBIA(mips_num_tlb_entries);
 		mips3_cp0_wired_write(MIPS3_TLB_WIRED_UPAGES);
 		mips64_vector_init();
-		memcpy(mips_locoresw, mips64_locoresw, sizeof(mips_locoresw));
+		mips_locoresw = mips64_locoresw;
 		break;
 #endif
 	default:
@@ -968,7 +958,7 @@
 	 */
 	if ((mips_cpu_flags & CPU_MIPS_USE_WAIT) &&
 	    !(mips_cpu_flags & CPU_MIPS_NO_WAIT))
-		CPU_IDLE = (long *)mips_wait_idle;
+		mips_locoresw.lsw_cpu_idle = mips_wait_idle;
 #endif /* (MIPS3 && !MIPS3_5900) || MIPS32 || MIPS64 */
 }
 
@@ -1120,12 +1110,9 @@
  * code by the MIPS elf abi).
  */
 void
-setregs(l, pack, stack)
-	struct lwp *l;
-	struct exec_package *pack;
-	u_long stack;
+setregs(struct lwp *l, struct exec_package *pack, u_long stack)
 {
-	struct frame *f = (struct frame *)l->l_md.md_regs;
+	struct frame *f = l->l_md.md_regs;
 
 	memset(f, 0, sizeof(struct frame));
 	f->f_regs[_R_SP] = (int)stack;
@@ -1510,7 +1497,8 @@
 	struct lwp *l;
 {
 #ifndef NOFPU
-	u_int32_t status, fpcsr, *fp;
+	u_int32_t status, fpcsr;
+	mips_fpreg_t *fp;
 	struct frame *f;
 
 	if (l == NULL)
@@ -1533,49 +1521,57 @@
 	/*
 	 * this process yielded FPA.
 	 */
-	f = (struct frame *)l->l_md.md_regs;
+	f = l->l_md.md_regs;
 	f->f_regs[_R_SR] &= ~MIPS_SR_COP_1_BIT;
 
 	/*
-	 * save FPCSR and 32bit FP register values.
+	 * save FPCSR and FP register values.
 	 */
-	fp = (int *)l->l_addr->u_pcb.pcb_fpregs.r_regs;
+	fp = l->l_addr->u_pcb.pcb_fpregs.r_regs;
 	fp[32] = fpcsr;
+#if defined(__mips_o32) || defined(__mips_o64)
+#define	LXC1	"lwc1"
+#define	SXC1	"swc1"
+#endif
+#if defined(__mips_n32) || defined(__mips_n64)
+#define	LXC1	"ldc1"
+#define	SXC1	"sdc1"
+#endif
 	__asm volatile (
 		".set noreorder		;"
-		"swc1	$f0, 0(%0)	;"
-		"swc1	$f1, 4(%0)	;"
-		"swc1	$f2, 8(%0)	;"
-		"swc1	$f3, 12(%0)	;"
-		"swc1	$f4, 16(%0)	;"
-		"swc1	$f5, 20(%0)	;"
-		"swc1	$f6, 24(%0)	;"
-		"swc1	$f7, 28(%0)	;"
-		"swc1	$f8, 32(%0)	;"
-		"swc1	$f9, 36(%0)	;"
-		"swc1	$f10, 40(%0)	;"
-		"swc1	$f11, 44(%0)	;"
-		"swc1	$f12, 48(%0)	;"
-		"swc1	$f13, 52(%0)	;"
-		"swc1	$f14, 56(%0)	;"
-		"swc1	$f15, 60(%0)	;"
-		"swc1	$f16, 64(%0)	;"
-		"swc1	$f17, 68(%0)	;"
-		"swc1	$f18, 72(%0)	;"
-		"swc1	$f19, 76(%0)	;"
-		"swc1	$f20, 80(%0)	;"
-		"swc1	$f21, 84(%0)	;"
-		"swc1	$f22, 88(%0)	;"
-		"swc1	$f23, 92(%0)	;"
-		"swc1	$f24, 96(%0)	;"
-		"swc1	$f25, 100(%0)	;"
-		"swc1	$f26, 104(%0)	;"
-		"swc1	$f27, 108(%0)	;"
-		"swc1	$f28, 112(%0)	;"
-		"swc1	$f29, 116(%0)	;"
-		"swc1	$f30, 120(%0)	;"
-		"swc1	$f31, 124(%0)	;"
-		".set reorder" :: "r"(fp));
+		SXC1"	$f0, (0*%d1)(%0)	;"
+		SXC1"	$f1, (1*%d1)(%0)	;"
+		SXC1"	$f2, (2*%d1)(%0)	;"
+		SXC1"	$f3, (3*%d1)(%0)	;"
+		SXC1"	$f4, (4*%d1)(%0)	;"
+		SXC1"	$f5, (5*%d1)(%0)	;"
+		SXC1"	$f6, (6*%d1)(%0)	;"
+		SXC1"	$f7, (7*%d1)(%0)	;"
+		SXC1"	$f8, (8*%d1)(%0)	;"
+		SXC1"	$f9, (9*%d1)(%0)	;"
+		SXC1"	$f10, (10*%d1)(%0)	;"
+		SXC1"	$f11, (11*%d1)(%0)	;"
+		SXC1"	$f12, (12*%d1)(%0)	;"
+		SXC1"	$f13, (13*%d1)(%0)	;"
+		SXC1"	$f14, (14*%d1)(%0)	;"
+		SXC1"	$f15, (15*%d1)(%0)	;"
+		SXC1"	$f16, (16*%d1)(%0)	;"
+		SXC1"	$f17, (17*%d1)(%0)	;"
+		SXC1"	$f18, (18*%d1)(%0)	;"
+		SXC1"	$f19, (19*%d1)(%0)	;"
+		SXC1"	$f20, (20*%d1)(%0)	;"
+		SXC1"	$f21, (21*%d1)(%0)	;"
+		SXC1"	$f22, (22*%d1)(%0)	;"
+		SXC1"	$f23, (23*%d1)(%0)	;"
+		SXC1"	$f24, (24*%d1)(%0)	;"
+		SXC1"	$f25, (25*%d1)(%0)	;"
+		SXC1"	$f26, (26*%d1)(%0)	;"
+		SXC1"	$f27, (27*%d1)(%0)	;"
+		SXC1"	$f28, (28*%d1)(%0)	;"
+		SXC1"	$f29, (29*%d1)(%0)	;"
+		SXC1"	$f30, (30*%d1)(%0)	;"
+		SXC1"	$f31, (31*%d1)(%0)	;"
+		".set reorder" :: "r"(fp), "i"(sizeof(fp[0])));
 	/*
 	 * stop CP1, enable interrupts.
 	 */
@@ -1589,7 +1585,8 @@
 	struct lwp *l;
 {
 #ifndef NOFPU
-	u_int32_t status, *fp;
+	uint32_t status;
+	mips_fpreg_t *fp;
 	struct frame *f;
 
 	if (l == NULL)
@@ -1608,46 +1605,47 @@
 		".set reorder					\n\t"
 		".set at" : "=r"(status) : "i"(MIPS_SR_COP_1_BIT));
 
-	f = (struct frame *)l->l_md.md_regs;
-	fp = (int *)l->l_addr->u_pcb.pcb_fpregs.r_regs;
+	f = l->l_md.md_regs;
+	fp = l->l_addr->u_pcb.pcb_fpregs.r_regs;
 	/*
-	 * load 32bit FP registers and establish processes' FP context.
+	 * load FP registers and establish processes' FP context.
 	 */
-	__asm volatile(
+	__asm volatile (
 		".set noreorder		;"
-		"lwc1	$f0, 0(%0)	;"
-		"lwc1	$f1, 4(%0)	;"
-		"lwc1	$f2, 8(%0)	;"
-		"lwc1	$f3, 12(%0)	;"
-		"lwc1	$f4, 16(%0)	;"
-		"lwc1	$f5, 20(%0)	;"
-		"lwc1	$f6, 24(%0)	;"
-		"lwc1	$f7, 28(%0)	;"
-		"lwc1	$f8, 32(%0)	;"
-		"lwc1	$f9, 36(%0)	;"
-		"lwc1	$f10, 40(%0)	;"
-		"lwc1	$f11, 44(%0)	;"
-		"lwc1	$f12, 48(%0)	;"
-		"lwc1	$f13, 52(%0)	;"
-		"lwc1	$f14, 56(%0)	;"
-		"lwc1	$f15, 60(%0)	;"
-		"lwc1	$f16, 64(%0)	;"
-		"lwc1	$f17, 68(%0)	;"
-		"lwc1	$f18, 72(%0)	;"
-		"lwc1	$f19, 76(%0)	;"
-		"lwc1	$f20, 80(%0)	;"
-		"lwc1	$f21, 84(%0)	;"
-		"lwc1	$f22, 88(%0)	;"
-		"lwc1	$f23, 92(%0)	;"
-		"lwc1	$f24, 96(%0)	;"
-		"lwc1	$f25, 100(%0)	;"
-		"lwc1	$f26, 104(%0)	;"
-		"lwc1	$f27, 108(%0)	;"
-		"lwc1	$f28, 112(%0)	;"
-		"lwc1	$f29, 116(%0)	;"
-		"lwc1	$f30, 120(%0)	;"
-		"lwc1	$f31, 124(%0)	;"
-		".set reorder" :: "r"(fp));
+		LXC1"	$f0, (0*%d1)(%0)	;"
+		LXC1"	$f1, (1*%d1)(%0)	;"
+		LXC1"	$f2, (2*%d1)(%0)	;"
+		LXC1"	$f3, (3*%d1)(%0)	;"
+		LXC1"	$f4, (4*%d1)(%0)	;"
+		LXC1"	$f5, (5*%d1)(%0)	;"
+		LXC1"	$f6, (6*%d1)(%0)	;"
+		LXC1"	$f7, (7*%d1)(%0)	;"
+		LXC1"	$f8, (8*%d1)(%0)	;"
+		LXC1"	$f9, (9*%d1)(%0)	;"
+		LXC1"	$f10, (10*%d1)(%0)	;"
+		LXC1"	$f11, (11*%d1)(%0)	;"
+		LXC1"	$f12, (12*%d1)(%0)	;"
+		LXC1"	$f13, (13*%d1)(%0)	;"
+		LXC1"	$f14, (14*%d1)(%0)	;"
+		LXC1"	$f15, (15*%d1)(%0)	;"
+		LXC1"	$f16, (16*%d1)(%0)	;"
+		LXC1"	$f17, (17*%d1)(%0)	;"
+		LXC1"	$f18, (18*%d1)(%0)	;"
+		LXC1"	$f19, (19*%d1)(%0)	;"
+		LXC1"	$f20, (20*%d1)(%0)	;"
+		LXC1"	$f21, (21*%d1)(%0)	;"
+		LXC1"	$f22, (22*%d1)(%0)	;"
+		LXC1"	$f23, (23*%d1)(%0)	;"
+		LXC1"	$f24, (24*%d1)(%0)	;"
+		LXC1"	$f25, (25*%d1)(%0)	;"
+		LXC1"	$f26, (26*%d1)(%0)	;"
+		LXC1"	$f27, (27*%d1)(%0)	;"
+		LXC1"	$f28, (28*%d1)(%0)	;"
+		LXC1"	$f29, (29*%d1)(%0)	;"
+		LXC1"	$f30, (30*%d1)(%0)	;"
+		LXC1"	$f31, (31*%d1)(%0)	;"
+		".set reorder" :: "r"(fp), "i"(sizeof(fp[0])));
+
 	/*
 	 * load FPCSR and stop CP1 again while enabling interrupts.
 	 */
@@ -1698,9 +1696,7 @@
     void *sas, void *ap, void *sp, sa_upcall_t upcall)
 {
 	struct saframe *sf, frame;
-	struct frame *f;
-
-	f = (struct frame *)l->l_md.md_regs;
+	struct frame *f = l->l_md.md_regs;
 
 #if 0 /* First 4 args in regs (see below). */
 	frame.sa_type = type;
@@ -1737,7 +1733,7 @@
 	mcontext_t *mcp;
 	unsigned int *flags;
 {
-	const struct frame *f = (struct frame *)l->l_md.md_regs;
+	const struct frame *f = l->l_md.md_regs;
 	__greg_t *gr = mcp->__gregs;
 	__greg_t ras_pc;
 
@@ -1750,8 +1746,8 @@
 	gr[_REG_EPC]   = f->f_regs[_R_PC];
 	gr[_REG_SR]    = f->f_regs[_R_SR];
 
-	if ((ras_pc = (__greg_t)(intptr_t)ras_lookup(l->l_proc,
-	    (void *)(intptr_t)gr[_REG_EPC])) != -1)
+	if ((ras_pc = (intptr_t)ras_lookup(l->l_proc,
+	    (void *) (intptr_t)gr[_REG_EPC])) != -1)
 		gr[_REG_EPC] = ras_pc;
 
 	*flags |= _UC_CPU;
@@ -1783,7 +1779,7 @@
 	const mcontext_t *mcp;
 	unsigned int flags;
 {
-	struct frame *f = (struct frame *)l->l_md.md_regs;
+	struct frame *f = l->l_md.md_regs;
 	const __greg_t *gr = mcp->__gregs;
 	struct proc *p = l->l_proc;
 
@@ -1838,7 +1834,7 @@
 void
 cpu_idle(void)
 {
-	void (*mach_idle)(void) = (void (*)(void))CPU_IDLE;
+	void (*mach_idle)(void) = mips_locoresw.lsw_cpu_idle;
 
 	while (!curcpu()->ci_want_resched)
 		(*mach_idle)();

Reply via email to