[PATCH 54/62] libcpu/powerpc/e500/mmu/mmu.c: Fix warnings
Joel Sherrill
joel.sherrill at oarcorp.com
Wed Oct 15 20:00:44 UTC 2014
---
c/src/lib/libcpu/powerpc/e500/mmu/mmu.c | 662 ++++++++++++++++----------------
1 file changed, 331 insertions(+), 331 deletions(-)
diff --git a/c/src/lib/libcpu/powerpc/e500/mmu/mmu.c b/c/src/lib/libcpu/powerpc/e500/mmu/mmu.c
index a972a65..c93a660 100644
--- a/c/src/lib/libcpu/powerpc/e500/mmu/mmu.c
+++ b/c/src/lib/libcpu/powerpc/e500/mmu/mmu.c
@@ -22,13 +22,13 @@
* ----------
* This software was created by
* Till Straumann <strauman at slac.stanford.edu>, 2005-2007,
- * Stanford Linear Accelerator Center, Stanford University.
+ * Stanford Linear Accelerator Center, Stanford University.
*
* Acknowledgement of sponsorship
* ------------------------------
* This software was produced by
* the Stanford Linear Accelerator Center, Stanford University,
- * under Contract DE-AC03-76SFO0515 with the Department of Energy.
+ * under Contract DE-AC03-76SFO0515 with the Department of Energy.
*
* Government disclaimer of liability
* ----------------------------------
@@ -76,13 +76,13 @@
#include "e500_mmu.h"
-#define TLBIVAX_TLBSEL (1<<(63-60))
-#define TLBIVAX_INV_ALL (1<<(63-61))
+#define TLBIVAX_TLBSEL (1<<(63-60))
+#define TLBIVAX_INV_ALL (1<<(63-61))
-#define E500_TLB_ATTR_WIMGE(x) ((x)&0x7f) /* includes user bits */
+#define E500_TLB_ATTR_WIMGE(x) ((x)&0x7f) /* includes user bits */
#define E500_TLB_ATTR_WIMGE_GET(x) ((x)&0x7f)
#define E500_TLB_ATTR_TS (1<<7)
-#define E500_TLB_ATTR_PERM(x) (((x)&0x3ff)<<8)
+#define E500_TLB_ATTR_PERM(x) (((x)&0x3ff)<<8)
#define E500_TLB_ATTR_PERM_GET(x) (((x)>>8)&0x3ff)
#define E500_TLB_ATTR_TID(x) (((x)&0xfff)<<20)
#define E500_TLB_ATTR_TID_GET(x) (((x)>>20)&0xfff)
@@ -95,11 +95,11 @@
#endif
/* Factory to generate inline macros for accessing the MAS registers */
-#define __RDWRMAS(mas,rmas) \
- static inline uint32_t _read_MAS##mas(void) \
- { uint32_t x; __asm__ volatile("mfspr %0, %1": "=r"(x):"i"(rmas)); return x; } \
- static inline void _write_MAS##mas(uint32_t x) \
- { __asm__ volatile("mtspr %1, %0":: "r"(x),"i"(rmas)); }
+#define __RDWRMAS(mas,rmas) \
+ static inline uint32_t _read_MAS##mas(void) \
+ { uint32_t x; __asm__ volatile("mfspr %0, %1": "=r"(x):"i"(rmas)); return x; } \
+ static inline void _write_MAS##mas(uint32_t x) \
+ { __asm__ volatile("mtspr %1, %0":: "r"(x),"i"(rmas)); }
__RDWRMAS(0,FSL_EIS_MAS0)
__RDWRMAS(1,FSL_EIS_MAS1)
@@ -121,19 +121,19 @@ E500_tlb_va_cache_t rtems_e500_tlb_va_cache[16];
static void
myprintf(FILE *f, char *fmt, ...)
{
-va_list ap;
- va_start(ap, fmt);
-
- if (!f || !_impure_ptr->__sdidinit) {
- /*
- * Might be called at an early stage when
- * stdio is not yet initialized.
- */
- vprintk(fmt,ap);
- } else {
- vfprintf(f,fmt,ap);
- }
- va_end(ap);
+ va_list ap;
+ va_start(ap, fmt);
+
+ if (!f || !_impure_ptr->__sdidinit) {
+ /*
+ * Might be called at an early stage when
+ * stdio is not yet initialized.
+ */
+ vprintk(fmt,ap);
+ } else {
+ vfprintf(f,fmt,ap);
+ }
+ va_end(ap);
}
@@ -141,38 +141,38 @@ void
rtems_e500_dmptlbc(FILE *f)
{
int i;
- if ( !initialized ) {
- myprintf(stderr,"TLB cache not initialized\n");
- return;
- }
- for ( i=0; i<16; i++ ) {
- if ( !rtems_e500_tlb_va_cache[i].att.v )
- continue;
- myprintf(f,"#%2i: TID 0x%03x, TS %i, ea 0x%08x .. 0x%08x\n",
- i,
- rtems_e500_tlb_va_cache[i].va.va_tid,
- rtems_e500_tlb_va_cache[i].att.ts,
- rtems_e500_tlb_va_cache[i].va.va_epn<<12,
- (rtems_e500_tlb_va_cache[i].va.va_epn<<12) + (1024<<(2*rtems_e500_tlb_va_cache[i].att.sz))-1);
- myprintf(f,"PA 0x%08"PRIx32", PERM 0x%03x, WIMGE 0x%02x\n",
- rtems_e500_tlb_va_cache[i].rpn<<12,
- rtems_e500_tlb_va_cache[i].att.perm,
- rtems_e500_tlb_va_cache[i].att.wimge);
- }
+ if ( !initialized ) {
+ myprintf(stderr,"TLB cache not initialized\n");
+ return;
+ }
+ for ( i=0; i<16; i++ ) {
+ if ( !rtems_e500_tlb_va_cache[i].att.v )
+ continue;
+ myprintf(f,"#%2i: TID 0x%03x, TS %i, ea 0x%08x .. 0x%08x\n",
+ i,
+ rtems_e500_tlb_va_cache[i].va.va_tid,
+ rtems_e500_tlb_va_cache[i].att.ts,
+ rtems_e500_tlb_va_cache[i].va.va_epn<<12,
+ (rtems_e500_tlb_va_cache[i].va.va_epn<<12) + (1024<<(2*rtems_e500_tlb_va_cache[i].att.sz))-1);
+ myprintf(f,"PA 0x%08"PRIx32", PERM 0x%03x, WIMGE 0x%02x\n",
+ rtems_e500_tlb_va_cache[i].rpn<<12,
+ rtems_e500_tlb_va_cache[i].att.perm,
+ rtems_e500_tlb_va_cache[i].att.wimge);
+ }
}
-#define E500_SELTLB_1 0x1000
+#define E500_SELTLB_1 0x1000
static void seltlb(rtems_e500_tlb_idx key)
{
int idx = key & ~E500_SELTLB_1;
- if ( key & E500_SELTLB_1 ) {
- _write_MAS0( FSL_EIS_MAS0_TLBSEL | FSL_EIS_MAS0_ESEL(idx) );
- } else {
- _write_MAS0( (idx & 128) ? FSL_EIS_MAS0_ESEL(1) : FSL_EIS_MAS0_ESEL(0) );
- _write_MAS2( FSL_EIS_MAS2_EPN( idx & 127 ) );
- }
+ if ( key & E500_SELTLB_1 ) {
+ _write_MAS0( FSL_EIS_MAS0_TLBSEL | FSL_EIS_MAS0_ESEL(idx) );
+ } else {
+ _write_MAS0( (idx & 128) ? FSL_EIS_MAS0_ESEL(1) : FSL_EIS_MAS0_ESEL(0) );
+ _write_MAS2( FSL_EIS_MAS2_EPN( idx & 127 ) );
+ }
}
/*
@@ -199,84 +199,84 @@ int idx = key & ~E500_SELTLB_1;
int
rtems_e500_prtlb(rtems_e500_tlb_idx key, int quiet, FILE *f)
{
-uint32_t mas0, mas1, mas2, mas3;
-rtems_interrupt_level lvl;
-E500_tlb_va_cache_t *tlb;
-E500_tlb_va_cache_t buf;
-int sel, idx;
+ uint32_t mas1, mas2, mas3;
+ rtems_interrupt_level lvl;
+ E500_tlb_va_cache_t *tlb;
+ E500_tlb_va_cache_t buf;
+ int sel, idx;
- sel = (key & E500_SELTLB_1) ? 1 : 0;
- idx = key & ~E500_SELTLB_1;
+ sel = (key & E500_SELTLB_1) ? 1 : 0;
+ idx = key & ~E500_SELTLB_1;
- if ( idx < 0 || idx > 255 || ( idx > 15 && sel ) )
- return -1;
+ if ( idx < 0 || idx > 255 || ( idx > 15 && sel ) )
+ return -1;
- rtems_interrupt_disable(lvl);
+ rtems_interrupt_disable(lvl);
- seltlb( key );
+ seltlb( key );
- asm volatile("tlbre");
+ asm volatile("tlbre");
- mas0 = _read_MAS0();
- mas1 = _read_MAS1();
- mas2 = _read_MAS2();
- mas3 = _read_MAS3();
+ /* not manipulating MAS0, skip reading it */
+ mas1 = _read_MAS1();
+ mas2 = _read_MAS2();
+ mas3 = _read_MAS3();
- rtems_interrupt_enable(lvl);
+ rtems_interrupt_enable(lvl);
- tlb = sel ? rtems_e500_tlb_va_cache + idx : &buf;
+ tlb = sel ? rtems_e500_tlb_va_cache + idx : &buf;
- if ( (tlb->att.v = (FSL_EIS_MAS1_V & mas1) ? 1 : 0) ) {
- tlb->va.va_epn = FSL_EIS_MAS2_EPN_GET(mas2);
- tlb->rpn = FSL_EIS_MAS3_RPN_GET(mas3);
- tlb->va.va_tid = FSL_EIS_MAS1_TID_GET(mas1);
- tlb->att.ts = (FSL_EIS_MAS1_TS & mas1) ? 1 : 0;
- tlb->att.sz = sel ? FSL_EIS_MAS1_TSIZE_GET(mas1) : 1 /* 4k size */;
- tlb->att.wimge = FSL_EIS_MAS2_ATTR_GET(mas2);
- tlb->att.perm = FSL_EIS_MAS3_PERM_GET(mas3);
- }
+ if ( (tlb->att.v = (FSL_EIS_MAS1_V & mas1) ? 1 : 0) ) {
+ tlb->va.va_epn = FSL_EIS_MAS2_EPN_GET(mas2);
+ tlb->rpn = FSL_EIS_MAS3_RPN_GET(mas3);
+ tlb->va.va_tid = FSL_EIS_MAS1_TID_GET(mas1);
+ tlb->att.ts = (FSL_EIS_MAS1_TS & mas1) ? 1 : 0;
+ tlb->att.sz = sel ? FSL_EIS_MAS1_TSIZE_GET(mas1) : 1 /* 4k size */;
+ tlb->att.wimge = FSL_EIS_MAS2_ATTR_GET(mas2);
+ tlb->att.perm = FSL_EIS_MAS3_PERM_GET(mas3);
+ }
- if ( tlb->att.v ) {
- if ( !quiet ) {
+ if ( tlb->att.v ) {
+ if ( !quiet ) {
/*
- "TLB[1] Entry # 0 spans EA range 0x00000000 .. 0x00000000
- "Mapping: VA [TS 0/TID 0x00/EPN 0x00000] -> RPN 0x00000"
- "Size: TSIZE 0x0 ( 4^ts KiB = 000000 KiB = 0x00000000 B)
- "Attributes: PERM 0x000 (ux/sx/uw/sw/ur/sr) WIMGE 0x00 IPROT 0"
+ "TLB[1] Entry # 0 spans EA range 0x00000000 .. 0x00000000
+ "Mapping: VA [TS 0/TID 0x00/EPN 0x00000] -> RPN 0x00000"
+ "Size: TSIZE 0x0 ( 4^ts KiB = 000000 KiB = 0x00000000 B)
+ "Attributes: PERM 0x000 (ux/sx/uw/sw/ur/sr) WIMGE 0x00 IPROT 0"
*/
- myprintf(f,
- "TLB[%i] Entry # %d spans EA range 0x%08x .. 0x%08x\r\n",
- sel,
- idx,
- (tlb->va.va_epn << 12),
- (tlb->va.va_epn << 12) + (1024<<(2*tlb->att.sz)) - 1
- );
-
- myprintf(f,
- "Mapping: VA [TS %d/TID 0x%02x/EPN 0x%05x] -> RPN 0x%05"PRIx32"\r\n",
- tlb->att.ts, tlb->va.va_tid, tlb->va.va_epn, tlb->rpn
- );
- myprintf(f,
- "Size: TSIZE 0x%x ( 4^ts KiB = %6d KiB = 0x%08x B)\r\n",
- tlb->att.sz, (1<<(2*tlb->att.sz)), (1024<<(2*tlb->att.sz))
- );
- myprintf(f,
- "Attributes: PERM 0x%03x (ux/sx/uw/sw/ur/sr) WIMGE 0x%02x IPROT %i\r\n",
- tlb->att.perm, tlb->att.wimge, (sel && (mas1 & FSL_EIS_MAS1_IPROT) ? 1 : 0)
- );
- myprintf(f,
- "EA range 0x%08x .. 0x%08x\r\n",
- (tlb->va.va_epn << 12),
- (tlb->va.va_epn << 12) + (1024<<(2*tlb->att.sz)) - 1
- );
- }
- } else {
- if ( !quiet ) {
- myprintf(f, "TLB[%i] Entry #%i <OFF> (size 0x%x = 0x%xb)\n", sel, idx, tlb->att.sz, (1024<<(2*tlb->att.sz)));
- }
- return 1;
- }
- return 0;
+ myprintf(f,
+ "TLB[%i] Entry # %d spans EA range 0x%08x .. 0x%08x\r\n",
+ sel,
+ idx,
+ (tlb->va.va_epn << 12),
+ (tlb->va.va_epn << 12) + (1024<<(2*tlb->att.sz)) - 1
+ );
+
+ myprintf(f,
+ "Mapping: VA [TS %d/TID 0x%02x/EPN 0x%05x] -> RPN 0x%05"PRIx32"\r\n",
+ tlb->att.ts, tlb->va.va_tid, tlb->va.va_epn, tlb->rpn
+ );
+ myprintf(f,
+ "Size: TSIZE 0x%x ( 4^ts KiB = %6d KiB = 0x%08x B)\r\n",
+ tlb->att.sz, (1<<(2*tlb->att.sz)), (1024<<(2*tlb->att.sz))
+ );
+ myprintf(f,
+ "Attributes: PERM 0x%03x (ux/sx/uw/sw/ur/sr) WIMGE 0x%02x IPROT %i\r\n",
+ tlb->att.perm, tlb->att.wimge, (sel && (mas1 & FSL_EIS_MAS1_IPROT) ? 1 : 0)
+ );
+ myprintf(f,
+ "EA range 0x%08x .. 0x%08x\r\n",
+ (tlb->va.va_epn << 12),
+ (tlb->va.va_epn << 12) + (1024<<(2*tlb->att.sz)) - 1
+ );
+ }
+ } else {
+ if ( !quiet ) {
+ myprintf(f, "TLB[%i] Entry #%i <OFF> (size 0x%x = 0x%xb)\n", sel, idx, tlb->att.sz, (1024<<(2*tlb->att.sz)));
+ }
+ return 1;
+ }
+ return 0;
}
/* Initialize cache; verify that TLB0 is unused;
@@ -290,22 +290,22 @@ int rtems_e500_initlb()
{
int i;
int rval = 0;
- for (i=0; i<16; i++)
- rtems_e500_prtlb(E500_SELTLB_1 | i, 1, 0);
- for (i=0; i<256; i++) {
- /* refuse to enable operations that change TLB entries
+ for (i=0; i<16; i++)
+ rtems_e500_prtlb(E500_SELTLB_1 | i, 1, 0);
+ for (i=0; i<256; i++) {
+ /* refuse to enable operations that change TLB entries
* if anything in TLB[0] is valid (because we currently
- * don't check against overlap with TLB[0] when we
- * write a new entry).
- */
- if ( rtems_e500_prtlb(E500_SELTLB_0 | i, 1, 0) <=0 ) {
- myprintf(stderr,"WARNING: 4k TLB #%i seems to be valid; UNSUPPORTED configuration\n", i);
- rval = -1;
- }
- }
- if ( !rval )
- initialized = 1;
- return rval;
+ * don't check against overlap with TLB[0] when we
+ * write a new entry).
+ */
+ if ( rtems_e500_prtlb(E500_SELTLB_0 | i, 1, 0) <=0 ) {
+ myprintf(stderr,"WARNING: 4k TLB #%i seems to be valid; UNSUPPORTED configuration\n", i);
+ rval = -1;
+ }
+ }
+ if ( !rval )
+ initialized = 1;
+ return rval;
}
/*
@@ -343,10 +343,10 @@ int rval = 0;
* <0: other error
*
*/
-#define E500_TLB_ATTR_WIMGE(x) ((x)&0x7f) /* includes user bits */
+#define E500_TLB_ATTR_WIMGE(x) ((x)&0x7f) /* includes user bits */
#define E500_TLB_ATTR_WIMGE_GET(x) ((x)&0x7f)
#define E500_TLB_ATTR_TS (1<<7)
-#define E500_TLB_ATTR_PERM(x) (((x)&0x3ff)<<8)
+#define E500_TLB_ATTR_PERM(x) (((x)&0x3ff)<<8)
#define E500_TLB_ATTR_PERM_GET(x) (((x)>>8)&0x3ff)
#define E500_TLB_ATTR_TID(x) (((x)&0xfff)<<20)
#define E500_TLB_ATTR_TID_GET(x) (((x)>>20)&0xfff)
@@ -359,94 +359,94 @@ uint32_t tid, msk;
int lkup;
rtems_interrupt_level lvl;
- if ( sz >= 1024 ) {
- /* Assume they literally specify a size */
- msk = sz;
- sz = 0;
- while ( msk != (1024<<(2*sz)) ) {
- if ( ++sz > 15 ) {
- return -1;
- }
- }
- /* OK, acceptable */
- }
-
- msk = sz > 0 ? (1024<<(2*sz)) - 1 : 0;
-
- if ( !initialized && sz > 0 ) {
- myprintf(stderr,"TLB driver not initialized; refuse to enable any entry\n");
- return -3;
- }
-
- if ( (ea & msk) || (pa & msk) ) {
- myprintf(stderr,"Misaligned ea or pa\n");
- return -1;
- }
-
- if ( idx < 0 || idx > 15 )
- return -1;
-
- if ( sz > 15 ) {
- /* but e500v1 doesn't support all 16 sizes!! */
- /* FIXME: we should inquire about this CPU's
- * capabilities...
- */
- return -1;
- }
-
- tid = E500_TLB_ATTR_TID_GET(attr);
-
- mas1 = (attr & E500_TLB_ATTR_TS) ? FSL_EIS_MAS1_TS : 0;
-
- if ( sz >=0 ) {
- lkup = rtems_e500_matchtlb(ea, tid, mas1, sz);
-
- if ( lkup < -1 ) {
- /* some error */
- return lkup;
- }
-
- if ( lkup >= 0 && lkup != idx ) {
- myprintf(stderr,"TLB[1] #%i overlaps with requested mapping\n", lkup);
- rtems_e500_prtlb( E500_SELTLB_1 | lkup, 0, stderr);
- return lkup+1;
- }
- }
-
- /* OK to proceed */
- mas1 |= FSL_EIS_MAS1_IPROT | FSL_EIS_MAS1_TID(tid);
-
- if ( sz >= 0 )
- mas1 |= FSL_EIS_MAS1_V | FSL_EIS_MAS1_TSIZE(sz);
-
- mas2 = FSL_EIS_MAS2_EPN( ea>>12 ) | E500_TLB_ATTR_WIMGE(attr);
- mas3 = FSL_EIS_MAS3_RPN( pa>>12 ) | E500_TLB_ATTR_PERM_GET(attr);
- /* mas4 is not really relevant; we don't use TLB replacement */
- mas4 = FSL_EIS_MAS4_TLBSELD | FSL_EIS_MAS4_TIDSELD(0) | FSL_EIS_MAS4_TSIZED(9) | FSL_EIS_MAS4_ID | FSL_EIS_MAS4_GD;
-
- rtems_interrupt_disable(lvl);
-
- seltlb(idx | E500_SELTLB_1);
-
- _write_MAS1(mas1);
- _write_MAS2(mas2);
- _write_MAS3(mas3);
- _write_MAS4(mas4);
-
- asm volatile(
- " sync \n"
- " isync \n"
- " tlbwe \n"
- " sync \n"
- " isync \n"
- );
-
- rtems_interrupt_enable(lvl);
-
- /* update cache */
- rtems_e500_prtlb( E500_SELTLB_1 | idx, 1, 0);
-
- return 0;
+ if ( sz >= 1024 ) {
+ /* Assume they literally specify a size */
+ msk = sz;
+ sz = 0;
+ while ( msk != (1024<<(2*sz)) ) {
+ if ( ++sz > 15 ) {
+ return -1;
+ }
+ }
+ /* OK, acceptable */
+ }
+
+ msk = sz > 0 ? (1024<<(2*sz)) - 1 : 0;
+
+ if ( !initialized && sz > 0 ) {
+ myprintf(stderr,"TLB driver not initialized; refuse to enable any entry\n");
+ return -3;
+ }
+
+ if ( (ea & msk) || (pa & msk) ) {
+ myprintf(stderr,"Misaligned ea or pa\n");
+ return -1;
+ }
+
+ if ( idx < 0 || idx > 15 )
+ return -1;
+
+ if ( sz > 15 ) {
+ /* but e500v1 doesn't support all 16 sizes!! */
+ /* FIXME: we should inquire about this CPU's
+ * capabilities...
+ */
+ return -1;
+ }
+
+ tid = E500_TLB_ATTR_TID_GET(attr);
+
+ mas1 = (attr & E500_TLB_ATTR_TS) ? FSL_EIS_MAS1_TS : 0;
+
+ if ( sz >=0 ) {
+ lkup = rtems_e500_matchtlb(ea, tid, mas1, sz);
+
+ if ( lkup < -1 ) {
+ /* some error */
+ return lkup;
+ }
+
+ if ( lkup >= 0 && lkup != idx ) {
+ myprintf(stderr,"TLB[1] #%i overlaps with requested mapping\n", lkup);
+ rtems_e500_prtlb( E500_SELTLB_1 | lkup, 0, stderr);
+ return lkup+1;
+ }
+ }
+
+ /* OK to proceed */
+ mas1 |= FSL_EIS_MAS1_IPROT | FSL_EIS_MAS1_TID(tid);
+
+ if ( sz >= 0 )
+ mas1 |= FSL_EIS_MAS1_V | FSL_EIS_MAS1_TSIZE(sz);
+
+ mas2 = FSL_EIS_MAS2_EPN( ea>>12 ) | E500_TLB_ATTR_WIMGE(attr);
+ mas3 = FSL_EIS_MAS3_RPN( pa>>12 ) | E500_TLB_ATTR_PERM_GET(attr);
+ /* mas4 is not really relevant; we don't use TLB replacement */
+ mas4 = FSL_EIS_MAS4_TLBSELD | FSL_EIS_MAS4_TIDSELD(0) | FSL_EIS_MAS4_TSIZED(9) | FSL_EIS_MAS4_ID | FSL_EIS_MAS4_GD;
+
+ rtems_interrupt_disable(lvl);
+
+ seltlb(idx | E500_SELTLB_1);
+
+ _write_MAS1(mas1);
+ _write_MAS2(mas2);
+ _write_MAS3(mas3);
+ _write_MAS4(mas4);
+
+ asm volatile(
+ " sync\n"
+ " isync\n"
+ " tlbwe\n"
+ " sync\n"
+ " isync\n"
+ );
+
+ rtems_interrupt_enable(lvl);
+
+ /* update cache */
+ rtems_e500_prtlb( E500_SELTLB_1 | idx, 1, 0);
+
+ return 0;
}
/*
@@ -470,41 +470,41 @@ int i;
uint32_t m,a;
E500_tlb_va_cache_t *tlb;
- if ( sz < 0 || sz > 15 )
- return -4;
-
- sz = (1024<<(2*sz));
-
- if ( !initialized ) {
- /* cache not initialized */
- return -3;
- }
-
- if ( ea & (sz-1) ) {
- /* misaligned ea */
- return -2;
- }
-
- if ( ts )
- ts = 1;
-
- for ( i=0, tlb=rtems_e500_tlb_va_cache; i<16; i++, tlb++ ) {
- if ( ! tlb->att.v )
- continue;
- if ( tlb->att.ts != ts )
- continue;
- if ( tlb->va.va_tid && tlb->va.va_tid != tid )
- continue;
- /* TID and TS match a valid entry */
- m = (1024<<(2*tlb->att.sz)) - 1;
- /* calculate starting address of this entry */
- a = tlb->va.va_epn<<12;
- if ( ea <= a + m && ea + sz -1 >= a ) {
- /* overlap */
- return i;
- }
- }
- return -1;
+ if ( sz < 0 || sz > 15 )
+ return -4;
+
+ sz = (1024<<(2*sz));
+
+ if ( !initialized ) {
+ /* cache not initialized */
+ return -3;
+ }
+
+ if ( ea & (sz-1) ) {
+ /* misaligned ea */
+ return -2;
+ }
+
+ if ( ts )
+ ts = 1;
+
+ for ( i=0, tlb=rtems_e500_tlb_va_cache; i<16; i++, tlb++ ) {
+ if ( ! tlb->att.v )
+ continue;
+ if ( tlb->att.ts != ts )
+ continue;
+ if ( tlb->va.va_tid && tlb->va.va_tid != tid )
+ continue;
+ /* TID and TS match a valid entry */
+ m = (1024<<(2*tlb->att.sz)) - 1;
+ /* calculate starting address of this entry */
+ a = tlb->va.va_epn<<12;
+ if ( ea <= a + m && ea + sz -1 >= a ) {
+ /* overlap */
+ return i;
+ }
+ }
+ return -1;
}
/* Find TLB index that maps 'ea/as' combination
@@ -523,38 +523,38 @@ uint32_t pid, mas0, mas1;
int i, rval = -1;
rtems_interrupt_level lvl;
- rtems_interrupt_disable(lvl);
+ rtems_interrupt_disable(lvl);
- for ( i=0; i<3; i++ ) {
- switch (i) {
- case 0: asm volatile("mfspr %0, %1":"=r"(pid):"i"(FSL_EIS_PID0)); break;
- case 1: asm volatile("mfspr %0, %1":"=r"(pid):"i"(FSL_EIS_PID1)); break;
- case 2: asm volatile("mfspr %0, %1":"=r"(pid):"i"(FSL_EIS_PID2)); break;
- default:
- goto bail;
- }
+ for ( i=0; i<3; i++ ) {
+ switch (i) {
+ case 0: asm volatile("mfspr %0, %1":"=r"(pid):"i"(FSL_EIS_PID0)); break;
+ case 1: asm volatile("mfspr %0, %1":"=r"(pid):"i"(FSL_EIS_PID1)); break;
+ case 2: asm volatile("mfspr %0, %1":"=r"(pid):"i"(FSL_EIS_PID2)); break;
+ default:
+ goto bail;
+ }
- _write_MAS6( FSL_EIS_MAS6_SPID0(pid) | (as ? FSL_EIS_MAS6_SAS : 0 ) );
+ _write_MAS6( FSL_EIS_MAS6_SPID0(pid) | (as ? FSL_EIS_MAS6_SAS : 0 ) );
- asm volatile("tlbsx 0, %0"::"r"(ea));
+ asm volatile("tlbsx 0, %0"::"r"(ea));
- mas1 = _read_MAS1();
+ mas1 = _read_MAS1();
- if ( (FSL_EIS_MAS1_V & mas1) ) {
- mas0 = _read_MAS0();
- if ( FSL_EIS_MAS0_TLBSEL & mas0 ) {
- /* TLB1 */
- rval = FSL_EIS_MAS0_ESEL_GET(mas0) | E500_SELTLB_1;
- } else {
- rval = (ea >> (63-51)) | (( FSL_EIS_MAS0_NV & mas0 ) ? 180 : 0 ) ;
- }
- break;
- }
- }
+ if ( (FSL_EIS_MAS1_V & mas1) ) {
+ mas0 = _read_MAS0();
+ if ( FSL_EIS_MAS0_TLBSEL & mas0 ) {
+ /* TLB1 */
+ rval = FSL_EIS_MAS0_ESEL_GET(mas0) | E500_SELTLB_1;
+ } else {
+ rval = (ea >> (63-51)) | (( FSL_EIS_MAS0_NV & mas0 ) ? 180 : 0 ) ;
+ }
+ break;
+ }
+ }
bail:
- rtems_interrupt_enable(lvl);
- return rval;
+ rtems_interrupt_enable(lvl);
+ return rval;
}
/* Mark TLB entry as invalid ('disabled'). Unlike
@@ -577,55 +577,55 @@ rtems_e500_clrtlb(rtems_e500_tlb_idx key)
rtems_e500_tlb_idx k0;
rtems_interrupt_level lvl;
- /* minimal guard against bad key */
- if ( key < 0 )
- return -1;
-
- if ( (key & E500_SELTLB_1) ) {
- if ( (key & ~E500_SELTLB_1) > 15 ) {
- myprintf(stderr,"Invalid TLB index; TLB1 index must be < 16\n");
- return -1;
- }
- } else if ( key > 255 ) {
- myprintf(stderr,"Invalid TLB index; TLB0 index must be < 256\n");
- return -1;
- }
-
- /* Must not invalidate page 0 which holds vectors, text etc... */
- k0 = rtems_e500_ftlb(0, 0);
- if ( -1 == k0 ) {
- myprintf(stderr,"tlbivax; something's fishy - I don't find mapping for addr. 0\n");
- return -1;
- }
-
- /* NOTE: we assume PID is ignored, and AS is 0 */
- if ( k0 == key ) {
- myprintf(stderr,"Refuse to invalidate page holding addr 0 (always needed)\n");
- return -1;
- }
-
- rtems_interrupt_disable(lvl);
-
- seltlb(key);
-
- asm volatile("tlbre");
-
- /* read old entries */
- _write_MAS1( _read_MAS1() & ~FSL_EIS_MAS1_V );
-
- asm volatile(
- " sync \n"
- " isync \n"
- " tlbwe \n"
- " sync \n"
- " isync \n"
- );
-
- /* update cache */
- if ( E500_SELTLB_1 & key )
- rtems_e500_tlb_va_cache[ (~E500_SELTLB_1 & key) ].att.v = 0;
-
- rtems_interrupt_enable(lvl);
-
- return 0;
+ /* minimal guard against bad key */
+ if ( key < 0 )
+ return -1;
+
+ if ( (key & E500_SELTLB_1) ) {
+ if ( (key & ~E500_SELTLB_1) > 15 ) {
+ myprintf(stderr,"Invalid TLB index; TLB1 index must be < 16\n");
+ return -1;
+ }
+ } else if ( key > 255 ) {
+ myprintf(stderr,"Invalid TLB index; TLB0 index must be < 256\n");
+ return -1;
+ }
+
+ /* Must not invalidate page 0 which holds vectors, text etc... */
+ k0 = rtems_e500_ftlb(0, 0);
+ if ( -1 == k0 ) {
+ myprintf(stderr,"tlbivax; something's fishy - I don't find mapping for addr. 0\n");
+ return -1;
+ }
+
+ /* NOTE: we assume PID is ignored, and AS is 0 */
+ if ( k0 == key ) {
+ myprintf(stderr,"Refuse to invalidate page holding addr 0 (always needed)\n");
+ return -1;
+ }
+
+ rtems_interrupt_disable(lvl);
+
+ seltlb(key);
+
+ asm volatile("tlbre");
+
+ /* read old entries */
+ _write_MAS1( _read_MAS1() & ~FSL_EIS_MAS1_V );
+
+ asm volatile(
+ " sync\n"
+ " isync\n"
+ " tlbwe\n"
+ " sync\n"
+ " isync\n"
+ );
+
+ /* update cache */
+ if ( E500_SELTLB_1 & key )
+ rtems_e500_tlb_va_cache[ (~E500_SELTLB_1 & key) ].att.v = 0;
+
+ rtems_interrupt_enable(lvl);
+
+ return 0;
}
--
1.9.3
More information about the devel
mailing list