Module Name: src
Committed By: matt
Date: Wed Dec 22 06:13:36 UTC 2010
Modified Files:
src/sys/arch/mips/conf [matt-nb5-mips64]: kern.ldscript
src/sys/arch/mips/include [matt-nb5-mips64]: locore.h
src/sys/arch/mips/mips [matt-nb5-mips64]: locore.S mips_fixup.c
mips_machdep.c spl_stubs.c
Log Message:
Rework how fixups are processed. Inside of generating a table, we just
scan kernel text for jumps to locations between (__stub_start, __stub_end]
and if found, we actually decode the instructions in the stub to find out
where the stub would eventually jump to and then patch the original jump
to jump directly to it bypassing the stub. This is slightly slower than
the previous method but it's a simplier and new stubs get automagically
handled.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.5.78.1 src/sys/arch/mips/conf/kern.ldscript
cvs rdiff -u -r1.78.36.1.2.25 -r1.78.36.1.2.26 \
src/sys/arch/mips/include/locore.h
cvs rdiff -u -r1.167.38.20 -r1.167.38.21 src/sys/arch/mips/mips/locore.S
cvs rdiff -u -r1.1.2.5 -r1.1.2.6 src/sys/arch/mips/mips/mips_fixup.c
cvs rdiff -u -r1.205.4.1.2.1.2.48 -r1.205.4.1.2.1.2.49 \
src/sys/arch/mips/mips/mips_machdep.c
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/arch/mips/mips/spl_stubs.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/conf/kern.ldscript
diff -u src/sys/arch/mips/conf/kern.ldscript:1.5 src/sys/arch/mips/conf/kern.ldscript:1.5.78.1
--- src/sys/arch/mips/conf/kern.ldscript:1.5 Sun Aug 27 04:48:44 2006
+++ src/sys/arch/mips/conf/kern.ldscript Wed Dec 22 06:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: kern.ldscript,v 1.5 2006/08/27 04:48:44 tsutsui Exp $ */
+/* $NetBSD: kern.ldscript,v 1.5.78.1 2010/12/22 06:13:36 matt Exp $ */
/* ldscript for NetBSD/mips kernels and LKMs */
OUTPUT_ARCH(mips)
@@ -15,6 +15,9 @@
{
_ftext = . ;
*(.text)
+ __stub_start = . ;
+ *(.stub*)
+ __stub_end = . ;
*(.gnu.warning)
} =0
_etext = .;
Index: src/sys/arch/mips/include/locore.h
diff -u src/sys/arch/mips/include/locore.h:1.78.36.1.2.25 src/sys/arch/mips/include/locore.h:1.78.36.1.2.26
--- src/sys/arch/mips/include/locore.h:1.78.36.1.2.25 Thu Jun 10 00:32:11 2010
+++ src/sys/arch/mips/include/locore.h Wed Dec 22 06:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.h,v 1.78.36.1.2.25 2010/06/10 00:32:11 cliff Exp $ */
+/* $NetBSD: locore.h,v 1.78.36.1.2.26 2010/12/22 06:13:36 matt Exp $ */
/*
* This file should not be included by MI code!!!
@@ -63,98 +63,55 @@
void fixup_splcalls(void); /* splstubs.c */
bool mips_fixup_exceptions(mips_fixup_callback_t);
bool mips_fixup_zero_relative(int32_t, uint32_t [2]);
-void mips_fixup_stubs(uint32_t *, uint32_t *,
- const struct mips_jump_fixup_info *, size_t);
-void fixup_mips_cpu_switch_resume(void);
+void mips_fixup_stubs(uint32_t *, uint32_t *);
+/*
+ * Define these stubs...
+ */
void mips_cpu_switch_resume(struct lwp *);
+void tlb_set_asid(uint32_t);
+void tlb_invalidate_all(void);
+void tlb_invalidate_globals(void);
+void tlb_invalidate_asids(uint32_t, uint32_t);
+void tlb_invalidate_addr(vaddr_t);
+u_int tlb_record_asids(u_long *, uint32_t);
+int tlb_update(vaddr_t, uint32_t);
+void tlb_enter(size_t, vaddr_t, uint32_t);
+void tlb_read_indexed(size_t, struct tlbmask *);
+void wbflush(void);
#ifdef MIPS1
-void mips1_tlb_set_asid(uint32_t);
void mips1_tlb_invalidate_all(void);
-void mips1_tlb_invalidate_globals(void);
-void mips1_tlb_invalidate_asids(uint32_t, uint32_t);
-void mips1_tlb_invalidate_addr(vaddr_t);
-u_int mips1_tlb_record_asids(u_long *, uint32_t);
-int mips1_tlb_update(vaddr_t, uint32_t);
-void mips1_tlb_enter(size_t, vaddr_t, uint32_t);
-void mips1_tlb_read_indexed(size_t, struct tlbmask *);
-void mips1_wbflush(void);
void mips1_lwp_trampoline(void);
void mips1_setfunc_trampoline(void);
-void mips1_cpu_switch_resume(struct lwp *);
uint32_t tx3900_cp0_config_read(void);
#endif
#if defined(MIPS3) || defined(MIPS4)
-void mips3_tlb_set_asid(uint32_t);
void mips3_tlb_invalidate_all(void);
-void mips3_tlb_invalidate_globals(void);
-void mips3_tlb_invalidate_asids(uint32_t, uint32_t);
-void mips3_tlb_invalidate_addr(vaddr_t);
-u_int mips3_tlb_record_asids(u_long *, uint32_t);
-int mips3_tlb_update(vaddr_t, uint32_t);
-void mips3_tlb_enter(size_t, vaddr_t, uint32_t);
-void mips3_tlb_read_indexed(size_t, struct tlbmask *);
-void mips3_tlb_write_indexed_VPS(size_t, struct tlbmask *);
-void mips3_wbflush(void);
void mips3_lwp_trampoline(void);
void mips3_setfunc_trampoline(void);
-void mips3_cpu_switch_resume(struct lwp *);
void mips3_pagezero(void *dst);
#ifdef MIPS3_5900
-void mips5900_tlb_set_asid(uint32_t);
void mips5900_tlb_invalidate_all(void);
-void mips5900_tlb_invalidate_globals(void);
-void mips5900_tlb_invalidate_asids(uint32_t, uint32_t);
-void mips5900_tlb_invalidate_addr(vaddr_t);
-u_int mips5900_tlb_record_asids(u_long *, uint32_t);
-int mips5900_tlb_update(vaddr_t, uint32_t);
-void mips5900_tlb_enter(size_t, vaddr_t, uint32_t);
-void mips5900_tlb_read_indexed(size_t, struct tlbmask *);
-void mips5900_tlb_write_indexed_VPS(size_t, struct tlbmask *);
-void mips5900_wbflush(void);
void mips5900_lwp_trampoline(void);
void mips5900_setfunc_trampoline(void);
-void mips5900_cpu_switch_resume(struct lwp *);
void mips5900_pagezero(void *dst);
#endif
-#endif
+#endif /* MIPS3 || MIPS4 */
#ifdef MIPS32
-void mips32_tlb_set_asid(uint32_t);
void mips32_tlb_invalidate_all(void);
-void mips32_tlb_invalidate_globals(void);
-void mips32_tlb_invalidate_asids(uint32_t, uint32_t);
-void mips32_tlb_invalidate_addr(vaddr_t);
-u_int mips32_tlb_record_asids(u_long *, uint32_t);
-int mips32_tlb_update(vaddr_t, uint32_t);
-void mips32_tlb_enter(size_t, vaddr_t, uint32_t);
-void mips32_tlb_read_indexed(size_t, struct tlbmask *);
-void mips32_tlb_write_indexed_VPS(size_t, struct tlbmask *);
-void mips32_wbflush(void);
void mips32_lwp_trampoline(void);
void mips32_setfunc_trampoline(void);
-void mips32_cpu_switch_resume(struct lwp *);
#endif
#ifdef MIPS64
-void mips64_tlb_set_asid(uint32_t);
void mips64_tlb_invalidate_all(void);
-void mips64_tlb_invalidate_globals(void);
-void mips64_tlb_invalidate_asids(uint32_t, uint32_t);
-void mips64_tlb_invalidate_addr(vaddr_t);
-u_int mips64_tlb_record_asids(u_long *, uint32_t);
-int mips64_tlb_update(vaddr_t, uint32_t);
-void mips64_tlb_enter(size_t, vaddr_t, uint32_t);
-void mips64_tlb_read_indexed(size_t, struct tlbmask *);
-void mips64_tlb_write_indexed_VPS(size_t, struct tlbmask *);
-void mips64_wbflush(void);
void mips64_lwp_trampoline(void);
void mips64_setfunc_trampoline(void);
-void mips64_cpu_switch_resume(struct lwp *);
void mips64_pagezero(void *dst);
#endif
@@ -376,87 +333,23 @@
extern struct locoresw mips_locoresw;
extern void mips_vector_init(const struct splsw *);
-#if defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64)
-#define tlb_set_asid mips1_tlb_set_asid
-#define tlb_invalidate_asids mips1_tlb_invalidate_asids
-#define tlb_invalidate_addr mips1_tlb_invalidate_addr
-#define tlb_invalidate_globals mips1_tlb_invalidate_globals
-#define tlb_invalidate_all mips1_tlb_invalidate_all
-#define tlb_record_asids mips1_tlb_record_asids
-#define tlb_update mips1_tlb_update
-#define tlb_enter mips1_tlb_enter
-#define tlb_read_indexed mips1_tlb_read_indexed
-#define wbflush mips1_wbflush
+#if defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64)
#define lwp_trampoline mips1_lwp_trampoline
#define setfunc_trampoline mips1_setfunc_trampoline
#elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && !defined(MIPS3_5900)
-#define tlb_set_asid mips3_tlb_set_asid
-#define tlb_invalidate_asids mips3_tlb_invalidate_asids
-#define tlb_invalidate_addr mips3_tlb_invalidate_addr
-#define tlb_invalidate_globals mips3_tlb_invalidate_globals
-#define tlb_invalidate_all mips3_tlb_invalidate_all
-#define tlb_record_asids mips3_tlb_record_asids
-#define tlb_update mips3_tlb_update
-#define tlb_enter mips3_tlb_enter
-#define tlb_read_indexed mips3_tlb_read_indexed
-#define tlb_write_indexed_VPS mips3_tlb_write_indexed_VPS
#define lwp_trampoline mips3_lwp_trampoline
#define setfunc_trampoline mips3_setfunc_trampoline
-#define wbflush mips3_wbflush
#elif !defined(MIPS1) && !defined(MIPS3) && defined(MIPS32) && !defined(MIPS64)
-#define tlb_set_asid mips32_tlb_set_asid
-#define tlb_invalidate_asids mips32_tlb_invalidate_asids
-#define tlb_invalidate_addr mips32_tlb_invalidate_addr
-#define tlb_invalidate_globals mips32_tlb_invalidate_globals
-#define tlb_invalidate_all mips32_tlb_invalidate_all
-#define tlb_record_asids mips32_tlb_record_asids
-#define tlb_update mips32_tlb_update
-#define tlb_enter mips32_tlb_enter
-#define tlb_read_indexed mips32_tlb_read_indexed
-#define tlb_write_indexed_VPS mips32_tlb_write_indexed_VPS
#define lwp_trampoline mips32_lwp_trampoline
#define setfunc_trampoline mips32_setfunc_trampoline
-#define wbflush mips32_wbflush
#elif !defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && defined(MIPS64)
/* all common with mips3 */
-#define tlb_set_asid mips64_tlb_set_asid
-#define tlb_invalidate_asids mips64_tlb_invalidate_asids
-#define tlb_invalidate_addr mips64_tlb_invalidate_addr
-#define tlb_invalidate_globals mips64_tlb_invalidate_globals
-#define tlb_invalidate_all mips64_tlb_invalidate_all
-#define tlb_record_asids mips64_tlb_record_asids
-#define tlb_update mips64_tlb_update
-#define tlb_enter mips64_tlb_enter
-#define tlb_read_indexed mips64_tlb_read_indexed
-#define tlb_write_indexed_VPS mips64_tlb_write_indexed_VPS
#define lwp_trampoline mips64_lwp_trampoline
#define setfunc_trampoline mips64_setfunc_trampoline
-#define wbflush mips64_wbflush
#elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && defined(MIPS3_5900)
-#define tlb_set_asid mips5900_tlb_set_asid
-#define tlb_invalidate_asids mips5900_tlb_invalidate_asids
-#define tlb_invalidate_addr mips5900_tlb_invalidate_addr
-#define tlb_invalidate_globals mips5900_tlb_invalidate_globals
-#define tlb_invalidate_all mips5900_tlb_invalidate_all
-#define tlb_record_asids mips5900_tlb_record_asids
-#define tlb_update mips5900_tlb_update
-#define tlb_enter mips5900_tlb_enter
-#define tlb_read_indexed mips5900_tlb_read_indexed
-#define tlb_write_indexed_VPS mips5900_tlb_write_indexed_VPS
#define lwp_trampoline mips5900_lwp_trampoline
#define setfunc_trampoline mips5900_setfunc_trampoline
-#define wbflush mips5900_wbflush
#else
-#define tlb_set_asid (*mips_locore_jumpvec.ljv_tlb_set_asid)
-#define tlb_invalidate_asids (*mips_locore_jumpvec.ljv_tlb_invalidate_asids)
-#define tlb_invalidate_addr (*mips_locore_jumpvec.ljv_tlb_invalidate_addr)
-#define tlb_invalidate_globals (*mips_locore_jumpvec.ljv_tlb_invalidate_globals)
-#define tlb_invalidate_all (*mips_locore_jumpvec.ljv_tlb_invalidate_all)
-#define tlb_record_asids (*mips_locore_jumpvec.ljv_tlb_record_asids)
-#define tlb_update (*mips_locore_jumpvec.ljv_tlb_update)
-#define tlb_enter (*mips_locore_jumpvec.ljv_tlb_enter)
-#define tlb_read_indexed (*mips_locore_jumpvec.ljv_tlb_read_indexed)
-#define wbflush (*mips_locore_jumpvec.ljv_wbflush)
#define lwp_trampoline mips_locoresw.lsw_lwp_trampoline
#define setfunc_trampoline mips_locoresw.lsw_setfunc_trampoline
#endif
Index: src/sys/arch/mips/mips/locore.S
diff -u src/sys/arch/mips/mips/locore.S:1.167.38.20 src/sys/arch/mips/mips/locore.S:1.167.38.21
--- src/sys/arch/mips/mips/locore.S:1.167.38.20 Wed Aug 18 06:35:01 2010
+++ src/sys/arch/mips/mips/locore.S Wed Dec 22 06:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.167.38.20 2010/08/18 06:35:01 matt Exp $ */
+/* $NetBSD: locore.S,v 1.167.38.21 2010/12/22 06:13:36 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -223,8 +223,7 @@
/*
* Verify interrupt configuration matches IPL_SCHED
*/
- PTR_L t9, _C_LABEL(mips_splsw) + SPLSW_SPLCHECK
- jalr t9
+ jal _C_LABEL(splcheck)
nop
#endif /* PARANOIA */
@@ -236,8 +235,6 @@
/*
* Switch to new context.
*/
- .globl _C_LABEL(__cpu_switchto_fixup)
-_C_LABEL(__cpu_switchto_fixup):
jal _C_LABEL(mips_cpu_switch_resume)
move a0, MIPS_CURLWP
@@ -291,8 +288,7 @@
/*
* Verify interrupt configuration still matches IPL_SCHED
*/
- PTR_L t9, _C_LABEL(mips_splsw) + SPLSW_SPLCHECK
- j t9
+ j _C_LABEL(splcheck)
#else
j ra
#endif /* PARANOIA */
Index: src/sys/arch/mips/mips/mips_fixup.c
diff -u src/sys/arch/mips/mips/mips_fixup.c:1.1.2.5 src/sys/arch/mips/mips/mips_fixup.c:1.1.2.6
--- src/sys/arch/mips/mips/mips_fixup.c:1.1.2.5 Mon Mar 1 19:26:01 2010
+++ src/sys/arch/mips/mips/mips_fixup.c Wed Dec 22 06:13:36 2010
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mips_fixup.c,v 1.1.2.5 2010/03/01 19:26:01 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_fixup.c,v 1.1.2.6 2010/12/22 06:13:36 matt Exp $");
#include <sys/param.h>
@@ -38,6 +38,7 @@
#include <mips/locore.h>
#include <mips/cache.h>
#include <mips/mips3_pte.h>
+#include <mips/regnum.h>
#define INSN_LUI_P(insn) (((insn) >> 26) == 017)
#define INSN_LW_P(insn) (((insn) >> 26) == 043)
@@ -202,67 +203,86 @@
}
void
-mips_fixup_stubs(uint32_t *start, uint32_t *end,
- const struct mips_jump_fixup_info *fixups,
- size_t nfixups)
+mips_fixup_stubs(uint32_t *start, uint32_t *end)
{
- const uint32_t min_offset = fixups[0].jfi_stub;
- const uint32_t max_offset = fixups[nfixups-1].jfi_stub;
#ifdef DEBUG
size_t fixups_done = 0;
uint32_t cycles = (CPUISMIPS3 ? mips3_cp0_count_read() : 0);
#endif
+ extern uint32_t __stub_start[], __stub_end[];
-#ifdef DIAGNOGSTIC
- /*
- * Verify the fixup list is sorted from low stub to high stub.
- */
- for (const struct mips_jump_fixup_info *jfi = fixups + 1;
- jfi < fixups + nfixups; jfi++) {
- KASSERT(jfi[-1].jfi_stub < jfi[0].jfi_stub);
- }
-#endif
+ KASSERT(MIPS_KSEG0_P(start));
+ KASSERT(MIPS_KSEG0_P(end));
+ KASSERT(MIPS_KSEG0_START == (((intptr_t)start >> 28) << 28));
+
+ if (end > __stub_start)
+ end = __stub_start;
for (uint32_t *insnp = start; insnp < end; insnp++) {
uint32_t insn = *insnp;
uint32_t offset = insn & 0x03ffffff;
uint32_t opcode = insn >> 26;
+ const uint32_t * const stubp =
+ &((uint32_t *)(((intptr_t)insnp >> 28) << 28))[offset];
/*
* First we check to see if this is a jump and whether it is
* within the range we are interested in.
*/
if ((opcode != OPCODE_J && opcode != OPCODE_JAL)
- || offset < min_offset || max_offset < offset)
+ || stubp < __stub_start || __stub_end <= stubp)
continue;
/*
- * We know it's a jump, but does it match one we want to
- * fixup?
+ * Stubs typically look like:
+ * lui v0, %hi(sym)
+ * lX t9, %lo(sym)(v0)
+ * jr t9
+ * nop
+ */
+ const uint32_t lui_insn = stubp[0];
+ const uint32_t load_insn = stubp[1];
+ KASSERT(stubp[2] == 0x03200008); /* jr t9 */
+ KASSERT(stubp[3] == 0); /* nop */
+
+ KASSERT(INSN_LUI_P(lui_insn));
+#ifdef _LP64
+ KASSERT(INSN_LD_P(load_insn));
+#else
+ KASSERT(INSN_LW_P(load_insn));
+#endif
+#ifdef DIAGNOSTIC
+ const u_int lui_reg = (lui_insn >> 16) & 31;
+ const u_int load_reg = (load_insn >> 16) & 31;
+#endif
+ KASSERT(((load_insn >> 21) & 31) == lui_reg);
+ KASSERT(load_reg == _R_T9);
+
+ intptr_t load_addr = ((int16_t)lui_insn << 16) + (int16_t) load_insn;
+#ifdef _LP64
+ const intptr_t real_addr = *(int64_t *)load_addr;
+#else
+ const intptr_t real_addr = *(int32_t *)load_addr;
+#endif
+ /*
+ * Verify the real destination is in the same 256MB
+ * as the location of the jump instruction.
+ */
+ KASSERT((real_addr >> 28) == ((intptr_t)insnp >> 28));
+
+ /*
+ * Now fix it up. Replace the old displacement to the stub
+ * with the real displacement.
*/
- for (const struct mips_jump_fixup_info *jfi = fixups;
- jfi < fixups + nfixups; jfi++) {
- /*
- * The caller has sorted the fixup list from lowest
- * stub to highest stub so if the current offset is
- * less than the this fixup's stub offset, we know
- * can't match anything else in the fixup list.
- */
- if (jfi->jfi_stub > offset)
- break;
-
- if (jfi->jfi_stub == offset) {
- /*
- * Yes, we need to fix it up. Replace the old
- * displacement with the real displacement.
- */
- fixup_mips_jump(insnp, jfi);
+ struct mips_jump_fixup_info fixup = {
+ .jfi_stub = fixup_addr2offset(stubp),
+ .jfi_real = fixup_addr2offset(real_addr),
+ };
+
+ fixup_mips_jump(insnp, &fixup);
#ifdef DEBUG
- fixups_done++;
+ fixups_done++;
#endif
- break;
- }
- }
}
if (sizeof(uint32_t [end - start]) > mips_cache_info.mci_picache_size)
@@ -280,7 +300,19 @@
#endif
}
-void mips_cpu_switch_resume(struct lwp *l) __section(".stub");
+#define __stub __section(".stub")
+
+void mips_cpu_switch_resume(struct lwp *) __stub;
+void tlb_set_asid(uint32_t) __stub;
+void tlb_invalidate_all(void) __stub;
+void tlb_invalidate_globals(void) __stub;
+void tlb_invalidate_asids(uint32_t, uint32_t) __stub;
+void tlb_invalidate_addr(vaddr_t) __stub;
+u_int tlb_record_asids(u_long *, uint32_t) __stub;
+int tlb_update(vaddr_t, uint32_t) __stub;
+void tlb_enter(size_t, vaddr_t, uint32_t) __stub;
+void tlb_read_indexed(size_t, struct tlbmask *) __stub;
+void wbflush(void) __stub;
void
mips_cpu_switch_resume(struct lwp *l)
@@ -289,14 +321,62 @@
}
void
-fixup_mips_cpu_switch_resume(void)
+tlb_set_asid(uint32_t asid)
+{
+ (*mips_locore_jumpvec.ljv_tlb_set_asid)(asid);
+}
+
+void
+tlb_invalidate_all(void)
+{
+ (*mips_locore_jumpvec.ljv_tlb_invalidate_all)();
+}
+
+void
+tlb_invalidate_addr(vaddr_t va)
+{
+ (*mips_locore_jumpvec.ljv_tlb_invalidate_addr)(va);
+}
+
+void
+tlb_invalidate_globals(void)
+{
+ (*mips_locore_jumpvec.ljv_tlb_invalidate_globals)();
+}
+
+void
+tlb_invalidate_asids(uint32_t asid_lo, uint32_t asid_hi)
+{
+ (*mips_locore_jumpvec.ljv_tlb_invalidate_asids)(asid_lo, asid_hi);
+}
+
+u_int
+tlb_record_asids(u_long *bitmap, uint32_t asid_max)
+{
+ return (*mips_locore_jumpvec.ljv_tlb_record_asids)(bitmap, asid_max);
+}
+
+int
+tlb_update(vaddr_t va, uint32_t pte)
+{
+ return (*mips_locore_jumpvec.ljv_tlb_update)(va, pte);
+}
+
+void
+tlb_enter(size_t tlbno, vaddr_t va, uint32_t pte)
{
- extern uint32_t __cpu_switchto_fixup[];
+ (*mips_locore_jumpvec.ljv_tlb_enter)(tlbno, va, pte);
+}
- struct mips_jump_fixup_info fixup = {
- fixup_addr2offset(mips_cpu_switch_resume),
- fixup_addr2offset(mips_locoresw.lsw_cpu_switch_resume)
- };
+void
+tlb_read_indexed(size_t tlbno, struct tlbmask *tlb)
+{
+ (*mips_locore_jumpvec.ljv_tlb_read_indexed)(tlbno, tlb);
+}
- fixup_mips_jump(__cpu_switchto_fixup, &fixup);
+void
+wbflush(void)
+{
+ (*mips_locore_jumpvec.ljv_wbflush)();
}
+
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.48 src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.49
--- src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.48 Wed Aug 18 07:12:57 2010
+++ src/sys/arch/mips/mips/mips_machdep.c Wed Dec 22 06:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.48 2010/08/18 07:12:57 matt Exp $ */
+/* $NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.49 2010/12/22 06:13:36 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.48 2010/08/18 07:12:57 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.49 2010/12/22 06:13:36 matt Exp $");
#define __INTR_PRIVATE
@@ -1011,10 +1011,11 @@
/*
* Now that the splsw and locoresw have been filled in, fixup the
- * jumps to their stubs to instead jump to the real routines.
+ * jumps to any stubs to actually jump to the real routines.
*/
- fixup_mips_cpu_switch_resume();
- fixup_splcalls();
+ extern uint32_t _ftext[];
+ extern uint32_t _etext[];
+ mips_fixup_stubs(_ftext, _etext);
/* XXX simonb: ugg, another ugly #ifdef check... */
#if (defined(MIPS3) && !defined(MIPS3_5900)) || defined(MIPS32) || defined(MIPS64)
Index: src/sys/arch/mips/mips/spl_stubs.c
diff -u src/sys/arch/mips/mips/spl_stubs.c:1.1.2.2 src/sys/arch/mips/mips/spl_stubs.c:1.1.2.3
--- src/sys/arch/mips/mips/spl_stubs.c:1.1.2.2 Mon Mar 1 19:26:01 2010
+++ src/sys/arch/mips/mips/spl_stubs.c Wed Dec 22 06:13:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: spl_stubs.c,v 1.1.2.2 2010/03/01 19:26:01 matt Exp $ */
+/* $NetBSD: spl_stubs.c,v 1.1.2.3 2010/12/22 06:13:36 matt Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -30,7 +30,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spl_stubs.c,v 1.1.2.2 2010/03/01 19:26:01 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spl_stubs.c,v 1.1.2.3 2010/12/22 06:13:36 matt Exp $");
#define __INTR_PRIVATE
@@ -152,46 +152,3 @@
{
(*mips_splsw.splsw_splcheck)();
}
-
-void
-fixup_splcalls(void)
-{
- extern uint32_t _ftext[];
- extern uint32_t _etext[];
-
-#define splfixupinfo(x) { fixup_addr2offset(x), \
- fixup_addr2offset(mips_splsw.splsw_##x) }
- struct mips_jump_fixup_info fixups[] = {
- splfixupinfo(splhigh),
- splfixupinfo(splhigh_noprof),
- splfixupinfo(splsched),
- splfixupinfo(splvm),
- splfixupinfo(splsoftserial),
- splfixupinfo(splsoftnet),
- splfixupinfo(splsoftbio),
- splfixupinfo(splsoftclock),
- splfixupinfo(spl0),
- splfixupinfo(splx),
- splfixupinfo(splx_noprof),
- splfixupinfo(splraise),
- splfixupinfo(splintr),
- splfixupinfo(_setsoftintr),
- splfixupinfo(_clrsoftintr),
- splfixupinfo(splcheck),
- };
-
- /*
- * [bubble] sort fixups from lowest stub to highest stub.
- */
- for (size_t i = 0; i < __arraycount(fixups) - 1; i++) {
- for (size_t j = i + 1; j < __arraycount(fixups); j++) {
- if (fixups[i].jfi_stub > fixups[j].jfi_stub) {
- struct mips_jump_fixup_info tmp = fixups[i];
- fixups[i] = fixups[j];
- fixups[j] = tmp;
- }
- }
- }
-
- mips_fixup_stubs(_ftext, _etext, fixups, __arraycount(fixups));
-}