Add MI mips3 wired map functions based on patch in port-mips/31915
from Garrett D'Amore of Tadpole Computer Inc. Please refer discussion filed in the PR for details.
This commit is contained in:
parent
2ae48df4fc
commit
74f4d162fb
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: files.mips,v 1.51 2005/01/24 10:03:57 drochner Exp $
|
||||
# $NetBSD: files.mips,v 1.52 2005/11/05 09:46:07 tsutsui Exp $
|
||||
#
|
||||
|
||||
defflag opt_cputype.h NOFPU
|
||||
|
@ -13,6 +13,7 @@ defflag opt_cputype.h NOFPU
|
|||
# ENABLE_MIPS_R3NKK
|
||||
defflag opt_mips_cache.h MIPS3_NO_PV_UNCACHED
|
||||
ENABLE_MIPS4_CACHE_R10K
|
||||
defflag opt_mips3_wired.h ENABLE_MIPS3_WIRED_MAP
|
||||
|
||||
file arch/mips/mips/locore_mips1.S mips1
|
||||
file arch/mips/mips/locore_mips3.S mips3 | mips4 | mips32 | mips64
|
||||
|
@ -37,6 +38,7 @@ file arch/mips/mips/sys_machdep.c
|
|||
file arch/mips/mips/vm_machdep.c
|
||||
file arch/mips/mips/process_machdep.c
|
||||
file arch/mips/mips/cpu_exec.c
|
||||
file arch/mips/mips/wired_map.c (mips3|mips4|mips32|mips64) & enable_mips3_wired_map
|
||||
|
||||
file arch/mips/mips/cache.c
|
||||
file arch/mips/mips/cache_r3k.c mips1
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: locore.h,v 1.70 2005/10/30 04:40:43 tsutsui Exp $ */
|
||||
/* $NetBSD: locore.h,v 1.71 2005/11/05 09:46:07 tsutsui Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 1996 The Board of Trustees of The Leland Stanford
|
||||
|
@ -57,6 +57,7 @@ void mips3_TBIAP(int);
|
|||
void mips3_TBIS(vaddr_t);
|
||||
int mips3_TLBUpdate(u_int, u_int);
|
||||
void mips3_TLBRead(int, struct tlb *);
|
||||
void mips3_TLBWriteIndexedVPS(int, struct tlb *);
|
||||
void mips3_wbflush(void);
|
||||
void mips3_proc_trampoline(void);
|
||||
void mips3_cpu_switch_resume(void);
|
||||
|
@ -69,6 +70,7 @@ void mips5900_TBIAP(int);
|
|||
void mips5900_TBIS(vaddr_t);
|
||||
int mips5900_TLBUpdate(u_int, u_int);
|
||||
void mips5900_TLBRead(int, struct tlb *);
|
||||
void mips5900_TLBWriteIndexedVPS(int, struct tlb *);
|
||||
void mips5900_wbflush(void);
|
||||
void mips5900_proc_trampoline(void);
|
||||
void mips5900_cpu_switch_resume(void);
|
||||
|
@ -83,6 +85,7 @@ void mips32_TBIAP(int);
|
|||
void mips32_TBIS(vaddr_t);
|
||||
int mips32_TLBUpdate(u_int, u_int);
|
||||
void mips32_TLBRead(int, struct tlb *);
|
||||
void mips32_TLBWriteIndexedVPS(int, struct tlb *);
|
||||
void mips32_wbflush(void);
|
||||
void mips32_proc_trampoline(void);
|
||||
void mips32_cpu_switch_resume(void);
|
||||
|
@ -95,6 +98,7 @@ void mips64_TBIAP(int);
|
|||
void mips64_TBIS(vaddr_t);
|
||||
int mips64_TLBUpdate(u_int, u_int);
|
||||
void mips64_TLBRead(int, struct tlb *);
|
||||
void mips64_TLBWriteIndexedVPS(int, struct tlb *);
|
||||
void mips64_wbflush(void);
|
||||
void mips64_proc_trampoline(void);
|
||||
void mips64_cpu_switch_resume(void);
|
||||
|
@ -228,6 +232,7 @@ extern long *mips_locoresw[];
|
|||
#define MIPS_TBIAP() mips3_TBIAP(mips_num_tlb_entries)
|
||||
#define MIPS_TBIS mips3_TBIS
|
||||
#define MachTLBUpdate mips3_TLBUpdate
|
||||
#define MachTLBWriteIndexedVPS mips3_TLBWriteIndexedVPS
|
||||
#define proc_trampoline mips3_proc_trampoline
|
||||
#define wbflush() mips3_wbflush()
|
||||
#elif !defined(MIPS1) && !defined(MIPS3) && defined(MIPS32) && !defined(MIPS64)
|
||||
|
@ -235,6 +240,7 @@ extern long *mips_locoresw[];
|
|||
#define MIPS_TBIAP() mips32_TBIAP(mips_num_tlb_entries)
|
||||
#define MIPS_TBIS mips32_TBIS
|
||||
#define MachTLBUpdate mips32_TLBUpdate
|
||||
#define MachTLBWriteIndexedVPS mips32_TLBWriteIndexedVPS
|
||||
#define proc_trampoline mips32_proc_trampoline
|
||||
#define wbflush() mips32_wbflush()
|
||||
#elif !defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && defined(MIPS64)
|
||||
|
@ -243,6 +249,7 @@ extern long *mips_locoresw[];
|
|||
#define MIPS_TBIAP() mips64_TBIAP(mips_num_tlb_entries)
|
||||
#define MIPS_TBIS mips64_TBIS
|
||||
#define MachTLBUpdate mips64_TLBUpdate
|
||||
#define MachTLBWriteIndexedVPS mips64_TLBWriteIndexedVPS
|
||||
#define proc_trampoline mips64_proc_trampoline
|
||||
#define wbflush() mips64_wbflush()
|
||||
#elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && defined(MIPS3_5900)
|
||||
|
@ -250,6 +257,7 @@ extern long *mips_locoresw[];
|
|||
#define MIPS_TBIAP() mips5900_TBIAP(mips_num_tlb_entries)
|
||||
#define MIPS_TBIS mips5900_TBIS
|
||||
#define MachTLBUpdate mips5900_TLBUpdate
|
||||
#define MachTLBWriteIndexedVPS mips5900_TLBWriteIndexedVPS
|
||||
#define proc_trampoline mips5900_proc_trampoline
|
||||
#define wbflush() mips5900_wbflush()
|
||||
#else
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: mips3_pte.h,v 1.18 2005/10/10 02:14:43 tsutsui Exp $ */
|
||||
/* $NetBSD: mips3_pte.h,v 1.19 2005/11/05 09:46:07 tsutsui Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
|
@ -181,6 +181,9 @@ struct tlb {
|
|||
#define MIPS3_PG_SIZE_MASK_TO_SIZE(pg_mask) \
|
||||
((((pg_mask) | 0x00001fff) + 1) / 2)
|
||||
|
||||
#define MIPS3_PG_SIZE_TO_MASK(pg_size) \
|
||||
((((pg_size) * 2) - 1) & ~0x00001fff)
|
||||
|
||||
/* NEC Vr41xx uses different pagemask values. */
|
||||
#define MIPS4100_PG_SIZE_1K 0x00000000
|
||||
#define MIPS4100_PG_SIZE_4K 0x00001800
|
||||
|
@ -190,3 +193,7 @@ struct tlb {
|
|||
|
||||
#define MIPS4100_PG_SIZE_MASK_TO_SIZE(pg_mask) \
|
||||
((((pg_mask) | 0x000007ff) + 1) / 2)
|
||||
|
||||
#define MIPS4100_PG_SIZE_TO_MASK(pg_size) \
|
||||
((((pg_size) * 2) - 1) & ~0x000007ff)
|
||||
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
/* $NetBSD: wired_map.h,v 1.1 2005/11/05 09:46:07 tsutsui Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2005 Tadpole Computer Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Written by Garrett D'Amore for Tadpole Computer Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of Tadpole Computer Inc. may not be used to endorse
|
||||
* or promote products derived from this software without specific
|
||||
* prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY TADPOLE COMPUTER INC. ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TADPOLE COMPUTER INC.
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _MIPS_WIRED_MAP_H
|
||||
#define _MIPS_WIRED_MAP_H
|
||||
|
||||
/*
|
||||
* Certain machines have peripheral busses which are only accessible
|
||||
* using the TLB.
|
||||
*
|
||||
* For example, certain Alchemy parts place PCI and PCMCIA busses at
|
||||
* physical address spaces which are beyond the normal 32-bit range.
|
||||
* In order to access these spaces TLB entries mapping 36-bit physical
|
||||
* addresses to 32-bit logical addresses must be used.
|
||||
*
|
||||
* Note that all wired mappings are must be 32 MB aligned. This is
|
||||
* because we use 32 MB mappings in the TLB. Changing this might get
|
||||
* us more effficent use of the address space, but it would greatly
|
||||
* complicate the code, and would also probably consume additional TLB
|
||||
* entries.
|
||||
*
|
||||
* Note that within a single 32 MB region, you can have multiple
|
||||
* decoders, but they must decode uniquely within the same 32MB of
|
||||
* physical address space.
|
||||
*
|
||||
* BEWARE: The start of KSEG2 (0xC0000000) is used by the NetBSD kernel
|
||||
* for context switching and is associated with wired entry 0. So you
|
||||
* cannot use that, as I discovered the hard way.
|
||||
*
|
||||
* Note also that at the moment this is not supported on the MIPS-I
|
||||
* ISA (but it shouldn't need it anyway.)
|
||||
*/
|
||||
|
||||
#ifndef MIPS3_WIRED_SIZE
|
||||
#define MIPS3_WIRED_SIZE MIPS3_PG_SIZE_MASK_TO_SIZE(MIPS3_PG_SIZE_16M)
|
||||
#endif
|
||||
#define MIPS3_WIRED_OFFMASK (MIPS3_WIRED_SIZE - 1)
|
||||
|
||||
#define MIPS3_WIRED_ENTRY_SIZE(pgsize) ((pgsize) * 2)
|
||||
#define MIPS3_WIRED_ENTRY_OFFMASK(pgsize) (MIPS3_WIRED_ENTRY_SIZE(pgsize) - 1)
|
||||
|
||||
/*
|
||||
* This defines the maximum number of wired TLB entries that the wired
|
||||
* map will be allowed to consume. It can (and probably will!)
|
||||
* consume fewer, but it will not consume more. Note that NetBSD also
|
||||
* uses one wired entry for context switching (see TLB_WIRED_UPAGES),
|
||||
* and that is not included in this number.
|
||||
*/
|
||||
#ifndef MIPS3_NWIRED_ENTRY
|
||||
#define MIPS3_NWIRED_ENTRY 8 /* upper limit */
|
||||
#endif
|
||||
|
||||
struct wired_map_entry {
|
||||
paddr_t pa0;
|
||||
paddr_t pa1;
|
||||
vaddr_t va;
|
||||
vsize_t pgmask;
|
||||
};
|
||||
|
||||
extern struct wired_map_entry mips3_wired_map[];
|
||||
extern int mips3_nwired_page;
|
||||
|
||||
/*
|
||||
* Wire down a region of the specified size.
|
||||
*/
|
||||
boolean_t mips3_wired_enter_region(vaddr_t, paddr_t, vsize_t);
|
||||
|
||||
/*
|
||||
* Wire down a single page using specified page size.
|
||||
*/
|
||||
boolean_t mips3_wired_enter_page(vaddr_t, paddr_t, vsize_t);
|
||||
|
||||
#endif /* _MIPS_WIRED_MAP_H */
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: mipsX_subr.S,v 1.17 2005/09/08 15:19:58 tsutsui Exp $ */
|
||||
/* $NetBSD: mipsX_subr.S,v 1.18 2005/11/05 09:46:07 tsutsui Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2002 Wasabi Systems, Inc.
|
||||
|
@ -118,6 +118,7 @@
|
|||
#include "opt_cputype.h"
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_kgdb.h"
|
||||
#include "opt_mips3_wired.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
|
@ -1593,6 +1594,68 @@ LEAF(MIPSX(SetPID))
|
|||
nop
|
||||
END(MIPSX(SetPID))
|
||||
|
||||
#if defined(ENABLE_MIPS3_WIRED_MAP)
|
||||
/*--------------------------------------------------------------------------
|
||||
*
|
||||
* mipsN_TLBWriteIndexedVPS --
|
||||
*
|
||||
* Write the given entry into the TLB at the given index.
|
||||
* Pass full R4000 style TLB info including variable page size mask.
|
||||
*
|
||||
* mipsN_TLBWriteIndexed(unsigned int index, struct tlb *tlb)
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* TLB entry set.
|
||||
*
|
||||
*--------------------------------------------------------------------------
|
||||
*/
|
||||
LEAF(MIPSX(TLBWriteIndexedVPS))
|
||||
mfc0 v1, MIPS_COP_0_STATUS # Save the status register.
|
||||
mtc0 zero, MIPS_COP_0_STATUS # Disable interrupts
|
||||
COP0_SYNC
|
||||
nop
|
||||
lw a2, 8(a1) # fetch tlb->tlb_lo0
|
||||
lw a3, 12(a1) # fetch tlb->tlb_lo1
|
||||
mfc0 v0, MIPS_COP_0_TLB_PG_MASK # Save current page mask.
|
||||
_MFC0 t0, MIPS_COP_0_TLB_HI # Save the current PID.
|
||||
|
||||
_MTC0 a2, MIPS_COP_0_TLB_LO0 # Set up entry low0.
|
||||
COP0_SYNC
|
||||
_MTC0 a3, MIPS_COP_0_TLB_LO1 # Set up entry low1.
|
||||
COP0_SYNC
|
||||
nop
|
||||
lw a2, 0(a1) # fetch tlb->tlb_mask
|
||||
lw a3, 4(a1) # fetch tlb->tlb_hi
|
||||
nop
|
||||
mtc0 a0, MIPS_COP_0_TLB_INDEX # Set the index.
|
||||
COP0_SYNC
|
||||
mtc0 a2, MIPS_COP_0_TLB_PG_MASK # Set up entry pagemask.
|
||||
COP0_SYNC
|
||||
_MTC0 a3, MIPS_COP_0_TLB_HI # Set up entry high.
|
||||
COP0_SYNC
|
||||
nop
|
||||
nop
|
||||
tlbwi # Write the TLB
|
||||
COP0_SYNC
|
||||
nop
|
||||
nop
|
||||
nop # Delay for effect
|
||||
nop
|
||||
|
||||
_MTC0 t0, MIPS_COP_0_TLB_HI # Restore the PID.
|
||||
COP0_SYNC
|
||||
mtc0 v0, MIPS_COP_0_TLB_PG_MASK # Restore page mask.
|
||||
COP0_SYNC
|
||||
nop
|
||||
nop
|
||||
j ra
|
||||
mtc0 v1, MIPS_COP_0_STATUS # Restore the status register
|
||||
END(MIPSX(TLBWriteIndexedVPS))
|
||||
#endif /* ENABLE_MIPS3_WIRED_MAP */
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
*
|
||||
* mipsN_TLBUpdate --
|
||||
|
|
|
@ -0,0 +1,201 @@
|
|||
/* $NetBSD: wired_map.c,v 1.1 2005/11/05 09:46:07 tsutsui Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2005 Tadpole Computer Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Written by Garrett D'Amore for Tadpole Computer Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of Tadpole Computer Inc. may not be used to endorse
|
||||
* or promote products derived from this software without specific
|
||||
* prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY TADPOLE COMPUTER INC. ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TADPOLE COMPUTER INC.
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*
|
||||
* Copyright (C) 2000 Shuichiro URATA. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This code is derived from similiar code in the ARC port of NetBSD, but
|
||||
* it now bears little resemblence to it owing to quite different needs
|
||||
* from the mapping logic.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: wired_map.c,v 1.1 2005/11/05 09:46:07 tsutsui Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <uvm/uvm_extern.h>
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/pte.h>
|
||||
#include <machine/vmparam.h>
|
||||
#include <machine/wired_map.h>
|
||||
|
||||
#include <mips/locore.h>
|
||||
#include <mips/pte.h>
|
||||
|
||||
struct wired_map_entry mips3_wired_map[MIPS3_NWIRED_ENTRY];
|
||||
int mips3_nwired_page;
|
||||
|
||||
/*
|
||||
* Lower layer API, to supply an explicit page size. It only wires a
|
||||
* single page at a time.
|
||||
*/
|
||||
boolean_t
|
||||
mips3_wired_enter_page(vaddr_t va, paddr_t pa, vsize_t pgsize)
|
||||
{
|
||||
struct tlb tlb;
|
||||
vaddr_t va0;
|
||||
int found, index;
|
||||
|
||||
/* make sure entries are aligned */
|
||||
KASSERT((va & (pgsize - 1)) == 0);
|
||||
KASSERT((pa & (pgsize - 1)) == 0);
|
||||
|
||||
/* TLB entries come in pairs: this is the first address of the pair */
|
||||
va0 = va & ~MIPS3_WIRED_ENTRY_OFFMASK(pgsize);
|
||||
|
||||
found = 0;
|
||||
for (index = 0; index < mips3_nwired_page; index++) {
|
||||
if (mips3_wired_map[index].va == va0) {
|
||||
if ((va & pgsize) == 0) {
|
||||
/* EntryLo0 */
|
||||
mips3_wired_map[index].pa0 = pa;
|
||||
} else {
|
||||
/* EntryLo1 */
|
||||
mips3_wired_map[index].pa1 = pa;
|
||||
}
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found == 0) {
|
||||
/* we have to allocate a new wired entry */
|
||||
if (mips3_nwired_page >= MIPS3_NWIRED_ENTRY) {
|
||||
#ifdef DIAGNOSTIC
|
||||
printf("mips3_wired_map: entries exhausted\n");
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
index = mips3_nwired_page;
|
||||
mips3_nwired_page++;
|
||||
if (va == va0) {
|
||||
/* EntryLo0 */
|
||||
mips3_wired_map[index].pa0 = pa;
|
||||
mips3_wired_map[index].pa1 = 0;
|
||||
} else {
|
||||
/* EntryLo1 */
|
||||
mips3_wired_map[index].pa0 = 0;
|
||||
mips3_wired_map[index].pa1 = pa;
|
||||
}
|
||||
mips3_wired_map[index].va = va0;
|
||||
mips3_wired_map[index].pgmask = MIPS3_PG_SIZE_TO_MASK(pgsize);
|
||||
|
||||
/* Allocate new wired entry */
|
||||
mips3_cp0_wired_write(MIPS3_TLB_WIRED_UPAGES +
|
||||
mips3_nwired_page + 1);
|
||||
}
|
||||
|
||||
/* map it */
|
||||
tlb.tlb_mask = mips3_wired_map[index].pgmask;
|
||||
tlb.tlb_hi = mips3_vad_to_vpn(va);
|
||||
if (mips3_wired_map[index].pa0 == 0)
|
||||
tlb.tlb_lo0 = MIPS3_PG_G;
|
||||
else
|
||||
tlb.tlb_lo0 =
|
||||
mips3_paddr_to_tlbpfn(mips3_wired_map[index].pa0) |
|
||||
MIPS3_PG_IOPAGE(
|
||||
PMAP_CCA_FOR_PA(mips3_wired_map[index].pa0));
|
||||
if (mips3_wired_map[index].pa1 == 0)
|
||||
tlb.tlb_lo1 = MIPS3_PG_G;
|
||||
else
|
||||
tlb.tlb_lo1 = mips3_paddr_to_tlbpfn(
|
||||
mips3_wired_map[index].pa1) |
|
||||
MIPS3_PG_IOPAGE(
|
||||
PMAP_CCA_FOR_PA(mips3_wired_map[index].pa1));
|
||||
MachTLBWriteIndexedVPS(MIPS3_TLB_WIRED_UPAGES + index, &tlb);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Wire down a mapping from a virtual to physical address. The size
|
||||
* of the region must be a multiple of MIPS3_WIRED_SIZE, with
|
||||
* matching alignment.
|
||||
*
|
||||
* Typically the caller will just pass a physaddr that is the same as
|
||||
* the vaddr with bits 35-32 set nonzero.
|
||||
*/
|
||||
boolean_t
|
||||
mips3_wired_enter_region(vaddr_t va, paddr_t pa, vsize_t size)
|
||||
{
|
||||
vaddr_t vend;
|
||||
/*
|
||||
* This routine allows for for wired mappings to be set up,
|
||||
* and handles previously defined mappings and mapping
|
||||
* overlaps reasonably well. However, caution should be used
|
||||
* not to attempt to change the mapping for a page unless you
|
||||
* are certain that you are the only user of the virtual
|
||||
* address space, otherwise chaos may ensue.
|
||||
*/
|
||||
|
||||
/* offsets within the page have to be identical */
|
||||
KASSERT((va & MIPS3_WIRED_OFFMASK) == (pa & MIPS3_WIRED_OFFMASK));
|
||||
|
||||
vend = va + size;
|
||||
/* adjust for alignment */
|
||||
va &= ~MIPS3_WIRED_OFFMASK;
|
||||
pa &= ~MIPS3_WIRED_OFFMASK;
|
||||
|
||||
while (va < vend) {
|
||||
if (!mips3_wired_enter_page(va, pa, MIPS3_WIRED_SIZE))
|
||||
return FALSE;
|
||||
va += MIPS3_WIRED_SIZE;
|
||||
pa += MIPS3_WIRED_SIZE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
Loading…
Reference in New Issue