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)();