filename | src/sh4/mmu.c |
changeset | 736:a02d1475ccfd |
prev | 669:ab344e42bca9 |
next | 740:dd11269ee48b |
author | nkeynes |
date | Mon Jul 14 07:44:42 2008 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Re-indent everything consistently Fix include guards for consistency as well |
file | annotate | diff | log | raw |
1.1 --- a/src/sh4/mmu.c Mon May 12 10:00:13 2008 +00001.2 +++ b/src/sh4/mmu.c Mon Jul 14 07:44:42 2008 +00001.3 @@ -128,9 +128,9 @@1.4 {1.5 switch( reg ) {1.6 case MMUCR:1.7 - return MMIO_READ( MMU, MMUCR) | (mmu_urc<<10) | (mmu_urb<<18) | (mmu_lrui<<26);1.8 + return MMIO_READ( MMU, MMUCR) | (mmu_urc<<10) | (mmu_urb<<18) | (mmu_lrui<<26);1.9 default:1.10 - return MMIO_READ( MMU, reg );1.11 + return MMIO_READ( MMU, reg );1.12 }1.13 }1.15 @@ -139,40 +139,40 @@1.16 uint32_t tmp;1.17 switch(reg) {1.18 case PTEH:1.19 - val &= 0xFFFFFCFF;1.20 - if( (val & 0xFF) != mmu_asid ) {1.21 - mmu_asid = val&0xFF;1.22 - sh4_icache.page_vma = -1; // invalidate icache as asid has changed1.23 - }1.24 - break;1.25 + val &= 0xFFFFFCFF;1.26 + if( (val & 0xFF) != mmu_asid ) {1.27 + mmu_asid = val&0xFF;1.28 + sh4_icache.page_vma = -1; // invalidate icache as asid has changed1.29 + }1.30 + break;1.31 case PTEL:1.32 - val &= 0x1FFFFDFF;1.33 - break;1.34 + val &= 0x1FFFFDFF;1.35 + break;1.36 case PTEA:1.37 - val &= 0x0000000F;1.38 - break;1.39 + val &= 0x0000000F;1.40 + break;1.41 case MMUCR:1.42 - if( val & MMUCR_TI ) {1.43 - mmu_invalidate_tlb();1.44 - }1.45 - mmu_urc = (val >> 10) & 0x3F;1.46 - mmu_urb = (val >> 18) & 0x3F;1.47 - mmu_lrui = (val >> 26) & 0x3F;1.48 - val &= 0x00000301;1.49 - tmp = MMIO_READ( MMU, MMUCR );1.50 - if( ((val ^ tmp) & MMUCR_AT) && sh4_is_using_xlat() ) {1.51 - // AT flag has changed state - flush the xlt cache as all bets1.52 - // are off now. We also need to force an immediate exit from the1.53 - // current block1.54 - MMIO_WRITE( MMU, MMUCR, val );1.55 - sh4_translate_flush_cache();1.56 - }1.57 - break;1.58 + if( val & MMUCR_TI ) {1.59 + mmu_invalidate_tlb();1.60 + }1.61 + mmu_urc = (val >> 10) & 0x3F;1.62 + mmu_urb = (val >> 18) & 0x3F;1.63 + mmu_lrui = (val >> 26) & 0x3F;1.64 + val &= 0x00000301;1.65 + tmp = MMIO_READ( MMU, MMUCR );1.66 + if( ((val ^ tmp) & MMUCR_AT) && sh4_is_using_xlat() ) {1.67 + // AT flag has changed state - flush the xlt cache as all bets1.68 + // are off now. We also need to force an immediate exit from the1.69 + // current block1.70 + MMIO_WRITE( MMU, MMUCR, val );1.71 + sh4_translate_flush_cache();1.72 + }1.73 + break;1.74 case CCR:1.75 - mmu_set_cache_mode( val & (CCR_OIX|CCR_ORA) );1.76 - break;1.77 + mmu_set_cache_mode( val & (CCR_OIX|CCR_ORA) );1.78 + break;1.79 default:1.80 - break;1.81 + break;1.82 }1.83 MMIO_WRITE( MMU, reg, val );1.84 }1.85 @@ -207,25 +207,25 @@1.86 */1.87 mmio_region_MMU_write( CCR, MMIO_READ(MMU, CCR) );1.88 if( fread( cache, 4096, 2, f ) != 2 ) {1.89 - return 1;1.90 + return 1;1.91 }1.92 if( fread( &mmu_itlb, sizeof(mmu_itlb), 1, f ) != 1 ) {1.93 - return 1;1.94 + return 1;1.95 }1.96 if( fread( &mmu_utlb, sizeof(mmu_utlb), 1, f ) != 1 ) {1.97 - return 1;1.98 + return 1;1.99 }1.100 if( fread( &mmu_urc, sizeof(mmu_urc), 1, f ) != 1 ) {1.101 - return 1;1.102 + return 1;1.103 }1.104 if( fread( &mmu_urc, sizeof(mmu_urb), 1, f ) != 1 ) {1.105 - return 1;1.106 + return 1;1.107 }1.108 if( fread( &mmu_lrui, sizeof(mmu_lrui), 1, f ) != 1 ) {1.109 - return 1;1.110 + return 1;1.111 }1.112 if( fread( &mmu_asid, sizeof(mmu_asid), 1, f ) != 1 ) {1.113 - return 1;1.114 + return 1;1.115 }1.116 return 0;1.117 }1.118 @@ -234,18 +234,18 @@1.119 {1.120 uint32_t i;1.121 switch( mode ) {1.122 - case MEM_OC_INDEX0: /* OIX=0 */1.123 - for( i=OCRAM_START; i<OCRAM_END; i++ )1.124 - page_map[i] = cache + ((i&0x02)<<(PAGE_BITS-1));1.125 - break;1.126 - case MEM_OC_INDEX1: /* OIX=1 */1.127 - for( i=OCRAM_START; i<OCRAM_END; i++ )1.128 - page_map[i] = cache + ((i&0x02000000)>>(25-PAGE_BITS));1.129 - break;1.130 - default: /* disabled */1.131 - for( i=OCRAM_START; i<OCRAM_END; i++ )1.132 - page_map[i] = NULL;1.133 - break;1.134 + case MEM_OC_INDEX0: /* OIX=0 */1.135 + for( i=OCRAM_START; i<OCRAM_END; i++ )1.136 + page_map[i] = cache + ((i&0x02)<<(PAGE_BITS-1));1.137 + break;1.138 + case MEM_OC_INDEX1: /* OIX=1 */1.139 + for( i=OCRAM_START; i<OCRAM_END; i++ )1.140 + page_map[i] = cache + ((i&0x02000000)>>(25-PAGE_BITS));1.141 + break;1.142 + default: /* disabled */1.143 + for( i=OCRAM_START; i<OCRAM_END; i++ )1.144 + page_map[i] = NULL;1.145 + break;1.146 }1.147 }1.149 @@ -269,10 +269,10 @@1.150 {1.151 int i;1.152 for( i=0; i<ITLB_ENTRY_COUNT; i++ ) {1.153 - mmu_itlb[i].flags &= (~TLB_VALID);1.154 + mmu_itlb[i].flags &= (~TLB_VALID);1.155 }1.156 for( i=0; i<UTLB_ENTRY_COUNT; i++ ) {1.157 - mmu_utlb[i].flags &= (~TLB_VALID);1.158 + mmu_utlb[i].flags &= (~TLB_VALID);1.159 }1.160 }1.162 @@ -313,15 +313,15 @@1.163 {1.164 struct utlb_entry *ent = &mmu_utlb[UTLB_ENTRY(addr)];1.165 return ent->vpn | ent->asid | (ent->flags & TLB_VALID) |1.166 - ((ent->flags & TLB_DIRTY)<<7);1.167 + ((ent->flags & TLB_DIRTY)<<7);1.168 }1.169 int32_t mmu_utlb_data_read( sh4addr_t addr )1.170 {1.171 struct utlb_entry *ent = &mmu_utlb[UTLB_ENTRY(addr)];1.172 if( UTLB_DATA2(addr) ) {1.173 - return ent->pcmcia;1.174 + return ent->pcmcia;1.175 } else {1.176 - return ent->ppn | ent->flags;1.177 + return ent->ppn | ent->flags;1.178 }1.179 }1.181 @@ -334,15 +334,15 @@1.182 int result = -1;1.183 unsigned int i;1.184 for( i = 0; i < UTLB_ENTRY_COUNT; i++ ) {1.185 - if( (mmu_utlb[i].flags & TLB_VALID) &&1.186 - ((mmu_utlb[i].flags & TLB_SHARE) || asid == mmu_utlb[i].asid) &&1.187 - ((mmu_utlb[i].vpn ^ vpn) & mmu_utlb[i].mask) == 0 ) {1.188 - if( result != -1 ) {1.189 - fprintf( stderr, "TLB Multi hit: %d %d\n", result, i );1.190 - return -2;1.191 - }1.192 - result = i;1.193 - }1.194 + if( (mmu_utlb[i].flags & TLB_VALID) &&1.195 + ((mmu_utlb[i].flags & TLB_SHARE) || asid == mmu_utlb[i].asid) &&1.196 + ((mmu_utlb[i].vpn ^ vpn) & mmu_utlb[i].mask) == 0 ) {1.197 + if( result != -1 ) {1.198 + fprintf( stderr, "TLB Multi hit: %d %d\n", result, i );1.199 + return -2;1.200 + }1.201 + result = i;1.202 + }1.203 }1.204 return result;1.205 }1.206 @@ -356,14 +356,14 @@1.207 int result = -1;1.208 unsigned int i;1.209 for( i = 0; i < ITLB_ENTRY_COUNT; i++ ) {1.210 - if( (mmu_itlb[i].flags & TLB_VALID) &&1.211 - ((mmu_itlb[i].flags & TLB_SHARE) || asid == mmu_itlb[i].asid) &&1.212 - ((mmu_itlb[i].vpn ^ vpn) & mmu_itlb[i].mask) == 0 ) {1.213 - if( result != -1 ) {1.214 - return -2;1.215 - }1.216 - result = i;1.217 - }1.218 + if( (mmu_itlb[i].flags & TLB_VALID) &&1.219 + ((mmu_itlb[i].flags & TLB_SHARE) || asid == mmu_itlb[i].asid) &&1.220 + ((mmu_itlb[i].vpn ^ vpn) & mmu_itlb[i].mask) == 0 ) {1.221 + if( result != -1 ) {1.222 + return -2;1.223 + }1.224 + result = i;1.225 + }1.226 }1.227 return result;1.228 }1.229 @@ -371,31 +371,31 @@1.230 void mmu_utlb_addr_write( sh4addr_t addr, uint32_t val )1.231 {1.232 if( UTLB_ASSOC(addr) ) {1.233 - int utlb = mmu_utlb_lookup_assoc( val, mmu_asid );1.234 - if( utlb >= 0 ) {1.235 - struct utlb_entry *ent = &mmu_utlb[utlb];1.236 - ent->flags = ent->flags & ~(TLB_DIRTY|TLB_VALID);1.237 - ent->flags |= (val & TLB_VALID);1.238 - ent->flags |= ((val & 0x200)>>7);1.239 - }1.240 + int utlb = mmu_utlb_lookup_assoc( val, mmu_asid );1.241 + if( utlb >= 0 ) {1.242 + struct utlb_entry *ent = &mmu_utlb[utlb];1.243 + ent->flags = ent->flags & ~(TLB_DIRTY|TLB_VALID);1.244 + ent->flags |= (val & TLB_VALID);1.245 + ent->flags |= ((val & 0x200)>>7);1.246 + }1.248 - int itlb = mmu_itlb_lookup_assoc( val, mmu_asid );1.249 - if( itlb >= 0 ) {1.250 - struct itlb_entry *ent = &mmu_itlb[itlb];1.251 - ent->flags = (ent->flags & (~TLB_VALID)) | (val & TLB_VALID);1.252 - }1.253 + int itlb = mmu_itlb_lookup_assoc( val, mmu_asid );1.254 + if( itlb >= 0 ) {1.255 + struct itlb_entry *ent = &mmu_itlb[itlb];1.256 + ent->flags = (ent->flags & (~TLB_VALID)) | (val & TLB_VALID);1.257 + }1.259 - if( itlb == -2 || utlb == -2 ) {1.260 - MMU_TLB_MULTI_HIT_ERROR(addr);1.261 - return;1.262 - }1.263 + if( itlb == -2 || utlb == -2 ) {1.264 + MMU_TLB_MULTI_HIT_ERROR(addr);1.265 + return;1.266 + }1.267 } else {1.268 - struct utlb_entry *ent = &mmu_utlb[UTLB_ENTRY(addr)];1.269 - ent->vpn = (val & 0xFFFFFC00);1.270 - ent->asid = (val & 0xFF);1.271 - ent->flags = (ent->flags & ~(TLB_DIRTY|TLB_VALID));1.272 - ent->flags |= (val & TLB_VALID);1.273 - ent->flags |= ((val & 0x200)>>7);1.274 + struct utlb_entry *ent = &mmu_utlb[UTLB_ENTRY(addr)];1.275 + ent->vpn = (val & 0xFFFFFC00);1.276 + ent->asid = (val & 0xFF);1.277 + ent->flags = (ent->flags & ~(TLB_DIRTY|TLB_VALID));1.278 + ent->flags |= (val & TLB_VALID);1.279 + ent->flags |= ((val & 0x200)>>7);1.280 }1.281 }1.283 @@ -403,11 +403,11 @@1.284 {1.285 struct utlb_entry *ent = &mmu_utlb[UTLB_ENTRY(addr)];1.286 if( UTLB_DATA2(addr) ) {1.287 - ent->pcmcia = val & 0x0000000F;1.288 + ent->pcmcia = val & 0x0000000F;1.289 } else {1.290 - ent->ppn = (val & 0x1FFFFC00);1.291 - ent->flags = (val & 0x000001FF);1.292 - ent->mask = get_mask_for_flags(val);1.293 + ent->ppn = (val & 0x1FFFFC00);1.294 + ent->flags = (val & 0x000001FF);1.295 + ent->mask = get_mask_for_flags(val);1.296 }1.297 }1.299 @@ -471,18 +471,18 @@1.301 mmu_urc++;1.302 if( mmu_urc == mmu_urb || mmu_urc == 0x40 ) {1.303 - mmu_urc = 0;1.304 + mmu_urc = 0;1.305 }1.307 for( i = 0; i < UTLB_ENTRY_COUNT; i++ ) {1.308 - if( (mmu_utlb[i].flags & TLB_VALID) &&1.309 - ((mmu_utlb[i].flags & TLB_SHARE) || mmu_asid == mmu_utlb[i].asid) &&1.310 - ((mmu_utlb[i].vpn ^ vpn) & mmu_utlb[i].mask) == 0 ) {1.311 - if( result != -1 ) {1.312 - return -2;1.313 - }1.314 - result = i;1.315 - }1.316 + if( (mmu_utlb[i].flags & TLB_VALID) &&1.317 + ((mmu_utlb[i].flags & TLB_SHARE) || mmu_asid == mmu_utlb[i].asid) &&1.318 + ((mmu_utlb[i].vpn ^ vpn) & mmu_utlb[i].mask) == 0 ) {1.319 + if( result != -1 ) {1.320 + return -2;1.321 + }1.322 + result = i;1.323 + }1.324 }1.325 return result;1.326 }1.327 @@ -503,17 +503,17 @@1.329 mmu_urc++;1.330 if( mmu_urc == mmu_urb || mmu_urc == 0x40 ) {1.331 - mmu_urc = 0;1.332 + mmu_urc = 0;1.333 }1.335 for( i = 0; i < UTLB_ENTRY_COUNT; i++ ) {1.336 - if( (mmu_utlb[i].flags & TLB_VALID) &&1.337 - ((mmu_utlb[i].vpn ^ vpn) & mmu_utlb[i].mask) == 0 ) {1.338 - if( result != -1 ) {1.339 - return -2;1.340 - }1.341 - result = i;1.342 - }1.343 + if( (mmu_utlb[i].flags & TLB_VALID) &&1.344 + ((mmu_utlb[i].vpn ^ vpn) & mmu_utlb[i].mask) == 0 ) {1.345 + if( result != -1 ) {1.346 + return -2;1.347 + }1.348 + result = i;1.349 + }1.350 }1.352 return result;1.353 @@ -528,17 +528,17 @@1.354 int replace;1.355 /* Determine entry to replace based on lrui */1.356 if( (mmu_lrui & 0x38) == 0x38 ) {1.357 - replace = 0;1.358 - mmu_lrui = mmu_lrui & 0x07;1.359 + replace = 0;1.360 + mmu_lrui = mmu_lrui & 0x07;1.361 } else if( (mmu_lrui & 0x26) == 0x06 ) {1.362 - replace = 1;1.363 - mmu_lrui = (mmu_lrui & 0x19) | 0x20;1.364 + replace = 1;1.365 + mmu_lrui = (mmu_lrui & 0x19) | 0x20;1.366 } else if( (mmu_lrui & 0x15) == 0x01 ) {1.367 - replace = 2;1.368 - mmu_lrui = (mmu_lrui & 0x3E) | 0x14;1.369 + replace = 2;1.370 + mmu_lrui = (mmu_lrui & 0x3E) | 0x14;1.371 } else { // Note - gets invalid entries too1.372 - replace = 3;1.373 - mmu_lrui = (mmu_lrui | 0x0B);1.374 + replace = 3;1.375 + mmu_lrui = (mmu_lrui | 0x0B);1.376 }1.378 mmu_itlb[replace].vpn = mmu_utlb[entryNo].vpn;1.379 @@ -564,23 +564,23 @@1.380 unsigned int i;1.382 for( i = 0; i < ITLB_ENTRY_COUNT; i++ ) {1.383 - if( (mmu_itlb[i].flags & TLB_VALID) &&1.384 - ((mmu_itlb[i].flags & TLB_SHARE) || mmu_asid == mmu_itlb[i].asid) &&1.385 - ((mmu_itlb[i].vpn ^ vpn) & mmu_itlb[i].mask) == 0 ) {1.386 - if( result != -1 ) {1.387 - return -2;1.388 - }1.389 - result = i;1.390 - }1.391 + if( (mmu_itlb[i].flags & TLB_VALID) &&1.392 + ((mmu_itlb[i].flags & TLB_SHARE) || mmu_asid == mmu_itlb[i].asid) &&1.393 + ((mmu_itlb[i].vpn ^ vpn) & mmu_itlb[i].mask) == 0 ) {1.394 + if( result != -1 ) {1.395 + return -2;1.396 + }1.397 + result = i;1.398 + }1.399 }1.401 if( result == -1 ) {1.402 - int utlbEntry = mmu_utlb_lookup_vpn_asid( vpn );1.403 - if( utlbEntry < 0 ) {1.404 - return utlbEntry;1.405 - } else {1.406 - return mmu_itlb_update_from_utlb( utlbEntry );1.407 - }1.408 + int utlbEntry = mmu_utlb_lookup_vpn_asid( vpn );1.409 + if( utlbEntry < 0 ) {1.410 + return utlbEntry;1.411 + } else {1.412 + return mmu_itlb_update_from_utlb( utlbEntry );1.413 + }1.414 }1.416 switch( result ) {1.417 @@ -589,7 +589,7 @@1.418 case 2: mmu_lrui = (mmu_lrui & 0x3E) | 0x14; break;1.419 case 3: mmu_lrui = (mmu_lrui | 0x0B); break;1.420 }1.421 -1.422 +1.423 return result;1.424 }1.426 @@ -608,22 +608,22 @@1.427 unsigned int i;1.429 for( i = 0; i < ITLB_ENTRY_COUNT; i++ ) {1.430 - if( (mmu_itlb[i].flags & TLB_VALID) &&1.431 - ((mmu_itlb[i].vpn ^ vpn) & mmu_itlb[i].mask) == 0 ) {1.432 - if( result != -1 ) {1.433 - return -2;1.434 - }1.435 - result = i;1.436 - }1.437 + if( (mmu_itlb[i].flags & TLB_VALID) &&1.438 + ((mmu_itlb[i].vpn ^ vpn) & mmu_itlb[i].mask) == 0 ) {1.439 + if( result != -1 ) {1.440 + return -2;1.441 + }1.442 + result = i;1.443 + }1.444 }1.446 if( result == -1 ) {1.447 - int utlbEntry = mmu_utlb_lookup_vpn( vpn );1.448 - if( utlbEntry < 0 ) {1.449 - return utlbEntry;1.450 - } else {1.451 - return mmu_itlb_update_from_utlb( utlbEntry );1.452 - }1.453 + int utlbEntry = mmu_utlb_lookup_vpn( vpn );1.454 + if( utlbEntry < 0 ) {1.455 + return utlbEntry;1.456 + } else {1.457 + return mmu_itlb_update_from_utlb( utlbEntry );1.458 + }1.459 }1.461 switch( result ) {1.462 @@ -632,7 +632,7 @@1.463 case 2: mmu_lrui = (mmu_lrui & 0x3E) | 0x14; break;1.464 case 3: mmu_lrui = (mmu_lrui | 0x0B); break;1.465 }1.466 -1.467 +1.468 return result;1.469 }1.471 @@ -640,54 +640,54 @@1.472 {1.473 uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.474 if( addr & 0x80000000 ) {1.475 - if( IS_SH4_PRIVMODE() ) {1.476 - if( addr >= 0xE0000000 ) {1.477 - return addr; /* P4 - passthrough */1.478 - } else if( addr < 0xC0000000 ) {1.479 - /* P1, P2 regions are pass-through (no translation) */1.480 - return VMA_TO_EXT_ADDR(addr);1.481 - }1.482 - } else {1.483 - if( addr >= 0xE0000000 && addr < 0xE4000000 &&1.484 - ((mmucr&MMUCR_SQMD) == 0) ) {1.485 - /* Conditional user-mode access to the store-queue (no translation) */1.486 - return addr;1.487 - }1.488 - MMU_READ_ADDR_ERROR();1.489 - return MMU_VMA_ERROR;1.490 - }1.491 + if( IS_SH4_PRIVMODE() ) {1.492 + if( addr >= 0xE0000000 ) {1.493 + return addr; /* P4 - passthrough */1.494 + } else if( addr < 0xC0000000 ) {1.495 + /* P1, P2 regions are pass-through (no translation) */1.496 + return VMA_TO_EXT_ADDR(addr);1.497 + }1.498 + } else {1.499 + if( addr >= 0xE0000000 && addr < 0xE4000000 &&1.500 + ((mmucr&MMUCR_SQMD) == 0) ) {1.501 + /* Conditional user-mode access to the store-queue (no translation) */1.502 + return addr;1.503 + }1.504 + MMU_READ_ADDR_ERROR();1.505 + return MMU_VMA_ERROR;1.506 + }1.507 }1.508 -1.509 +1.510 if( (mmucr & MMUCR_AT) == 0 ) {1.511 - return VMA_TO_EXT_ADDR(addr);1.512 + return VMA_TO_EXT_ADDR(addr);1.513 }1.515 /* If we get this far, translation is required */1.516 int entryNo;1.517 if( ((mmucr & MMUCR_SV) == 0) || !IS_SH4_PRIVMODE() ) {1.518 - entryNo = mmu_utlb_lookup_vpn_asid( addr );1.519 + entryNo = mmu_utlb_lookup_vpn_asid( addr );1.520 } else {1.521 - entryNo = mmu_utlb_lookup_vpn( addr );1.522 + entryNo = mmu_utlb_lookup_vpn( addr );1.523 }1.525 switch(entryNo) {1.526 case -1:1.527 - MMU_TLB_READ_MISS_ERROR(addr);1.528 - return MMU_VMA_ERROR;1.529 + MMU_TLB_READ_MISS_ERROR(addr);1.530 + return MMU_VMA_ERROR;1.531 case -2:1.532 - MMU_TLB_MULTI_HIT_ERROR(addr);1.533 - return MMU_VMA_ERROR;1.534 + MMU_TLB_MULTI_HIT_ERROR(addr);1.535 + return MMU_VMA_ERROR;1.536 default:1.537 - if( (mmu_utlb[entryNo].flags & TLB_USERMODE) == 0 &&1.538 - !IS_SH4_PRIVMODE() ) {1.539 - /* protection violation */1.540 - MMU_TLB_READ_PROT_ERROR(addr);1.541 - return MMU_VMA_ERROR;1.542 - }1.543 + if( (mmu_utlb[entryNo].flags & TLB_USERMODE) == 0 &&1.544 + !IS_SH4_PRIVMODE() ) {1.545 + /* protection violation */1.546 + MMU_TLB_READ_PROT_ERROR(addr);1.547 + return MMU_VMA_ERROR;1.548 + }1.550 - /* finally generate the target address */1.551 - return (mmu_utlb[entryNo].ppn & mmu_utlb[entryNo].mask) |1.552 - (addr & (~mmu_utlb[entryNo].mask));1.553 + /* finally generate the target address */1.554 + return (mmu_utlb[entryNo].ppn & mmu_utlb[entryNo].mask) |1.555 + (addr & (~mmu_utlb[entryNo].mask));1.556 }1.557 }1.559 @@ -695,59 +695,59 @@1.560 {1.561 uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.562 if( addr & 0x80000000 ) {1.563 - if( IS_SH4_PRIVMODE() ) {1.564 - if( addr >= 0xE0000000 ) {1.565 - return addr; /* P4 - passthrough */1.566 - } else if( addr < 0xC0000000 ) {1.567 - /* P1, P2 regions are pass-through (no translation) */1.568 - return VMA_TO_EXT_ADDR(addr);1.569 - }1.570 - } else {1.571 - if( addr >= 0xE0000000 && addr < 0xE4000000 &&1.572 - ((mmucr&MMUCR_SQMD) == 0) ) {1.573 - /* Conditional user-mode access to the store-queue (no translation) */1.574 - return addr;1.575 - }1.576 - MMU_WRITE_ADDR_ERROR();1.577 - return MMU_VMA_ERROR;1.578 - }1.579 + if( IS_SH4_PRIVMODE() ) {1.580 + if( addr >= 0xE0000000 ) {1.581 + return addr; /* P4 - passthrough */1.582 + } else if( addr < 0xC0000000 ) {1.583 + /* P1, P2 regions are pass-through (no translation) */1.584 + return VMA_TO_EXT_ADDR(addr);1.585 + }1.586 + } else {1.587 + if( addr >= 0xE0000000 && addr < 0xE4000000 &&1.588 + ((mmucr&MMUCR_SQMD) == 0) ) {1.589 + /* Conditional user-mode access to the store-queue (no translation) */1.590 + return addr;1.591 + }1.592 + MMU_WRITE_ADDR_ERROR();1.593 + return MMU_VMA_ERROR;1.594 + }1.595 }1.596 -1.597 +1.598 if( (mmucr & MMUCR_AT) == 0 ) {1.599 - return VMA_TO_EXT_ADDR(addr);1.600 + return VMA_TO_EXT_ADDR(addr);1.601 }1.603 /* If we get this far, translation is required */1.604 int entryNo;1.605 if( ((mmucr & MMUCR_SV) == 0) || !IS_SH4_PRIVMODE() ) {1.606 - entryNo = mmu_utlb_lookup_vpn_asid( addr );1.607 + entryNo = mmu_utlb_lookup_vpn_asid( addr );1.608 } else {1.609 - entryNo = mmu_utlb_lookup_vpn( addr );1.610 + entryNo = mmu_utlb_lookup_vpn( addr );1.611 }1.613 switch(entryNo) {1.614 case -1:1.615 - MMU_TLB_WRITE_MISS_ERROR(addr);1.616 - return MMU_VMA_ERROR;1.617 + MMU_TLB_WRITE_MISS_ERROR(addr);1.618 + return MMU_VMA_ERROR;1.619 case -2:1.620 - MMU_TLB_MULTI_HIT_ERROR(addr);1.621 - return MMU_VMA_ERROR;1.622 + MMU_TLB_MULTI_HIT_ERROR(addr);1.623 + return MMU_VMA_ERROR;1.624 default:1.625 - if( IS_SH4_PRIVMODE() ? ((mmu_utlb[entryNo].flags & TLB_WRITABLE) == 0)1.626 - : ((mmu_utlb[entryNo].flags & TLB_USERWRITABLE) != TLB_USERWRITABLE) ) {1.627 - /* protection violation */1.628 - MMU_TLB_WRITE_PROT_ERROR(addr);1.629 - return MMU_VMA_ERROR;1.630 - }1.631 + if( IS_SH4_PRIVMODE() ? ((mmu_utlb[entryNo].flags & TLB_WRITABLE) == 0)1.632 + : ((mmu_utlb[entryNo].flags & TLB_USERWRITABLE) != TLB_USERWRITABLE) ) {1.633 + /* protection violation */1.634 + MMU_TLB_WRITE_PROT_ERROR(addr);1.635 + return MMU_VMA_ERROR;1.636 + }1.638 - if( (mmu_utlb[entryNo].flags & TLB_DIRTY) == 0 ) {1.639 - MMU_TLB_INITIAL_WRITE_ERROR(addr);1.640 - return MMU_VMA_ERROR;1.641 - }1.642 + if( (mmu_utlb[entryNo].flags & TLB_DIRTY) == 0 ) {1.643 + MMU_TLB_INITIAL_WRITE_ERROR(addr);1.644 + return MMU_VMA_ERROR;1.645 + }1.647 - /* finally generate the target address */1.648 - return (mmu_utlb[entryNo].ppn & mmu_utlb[entryNo].mask) |1.649 - (addr & (~mmu_utlb[entryNo].mask));1.650 + /* finally generate the target address */1.651 + return (mmu_utlb[entryNo].ppn & mmu_utlb[entryNo].mask) |1.652 + (addr & (~mmu_utlb[entryNo].mask));1.653 }1.654 }1.656 @@ -757,20 +757,20 @@1.657 void mmu_update_icache_phys( sh4addr_t addr )1.658 {1.659 if( (addr & 0x1C000000) == 0x0C000000 ) {1.660 - /* Main ram */1.661 - sh4_icache.page_vma = addr & 0xFF000000;1.662 - sh4_icache.page_ppa = 0x0C000000;1.663 - sh4_icache.mask = 0xFF000000;1.664 - sh4_icache.page = sh4_main_ram;1.665 + /* Main ram */1.666 + sh4_icache.page_vma = addr & 0xFF000000;1.667 + sh4_icache.page_ppa = 0x0C000000;1.668 + sh4_icache.mask = 0xFF000000;1.669 + sh4_icache.page = sh4_main_ram;1.670 } else if( (addr & 0x1FE00000) == 0 ) {1.671 - /* BIOS ROM */1.672 - sh4_icache.page_vma = addr & 0xFFE00000;1.673 - sh4_icache.page_ppa = 0;1.674 - sh4_icache.mask = 0xFFE00000;1.675 - sh4_icache.page = mem_get_region(0);1.676 + /* BIOS ROM */1.677 + sh4_icache.page_vma = addr & 0xFFE00000;1.678 + sh4_icache.page_ppa = 0;1.679 + sh4_icache.mask = 0xFFE00000;1.680 + sh4_icache.page = mem_get_region(0);1.681 } else {1.682 - /* not supported */1.683 - sh4_icache.page_vma = -1;1.684 + /* not supported */1.685 + sh4_icache.page_vma = -1;1.686 }1.687 }1.689 @@ -790,64 +790,64 @@1.690 {1.691 int entryNo;1.692 if( IS_SH4_PRIVMODE() ) {1.693 - if( addr & 0x80000000 ) {1.694 - if( addr < 0xC0000000 ) {1.695 - /* P1, P2 and P4 regions are pass-through (no translation) */1.696 - mmu_update_icache_phys(addr);1.697 - return TRUE;1.698 - } else if( addr >= 0xE0000000 && addr < 0xFFFFFF00 ) {1.699 - MMU_READ_ADDR_ERROR();1.700 - return FALSE;1.701 - }1.702 - }1.703 -1.704 - uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.705 - if( (mmucr & MMUCR_AT) == 0 ) {1.706 - mmu_update_icache_phys(addr);1.707 - return TRUE;1.708 - }1.709 + if( addr & 0x80000000 ) {1.710 + if( addr < 0xC0000000 ) {1.711 + /* P1, P2 and P4 regions are pass-through (no translation) */1.712 + mmu_update_icache_phys(addr);1.713 + return TRUE;1.714 + } else if( addr >= 0xE0000000 && addr < 0xFFFFFF00 ) {1.715 + MMU_READ_ADDR_ERROR();1.716 + return FALSE;1.717 + }1.718 + }1.720 - entryNo = mmu_itlb_lookup_vpn( addr );1.721 + uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.722 + if( (mmucr & MMUCR_AT) == 0 ) {1.723 + mmu_update_icache_phys(addr);1.724 + return TRUE;1.725 + }1.726 +1.727 + entryNo = mmu_itlb_lookup_vpn( addr );1.728 } else {1.729 - if( addr & 0x80000000 ) {1.730 - MMU_READ_ADDR_ERROR();1.731 - return FALSE;1.732 - }1.733 + if( addr & 0x80000000 ) {1.734 + MMU_READ_ADDR_ERROR();1.735 + return FALSE;1.736 + }1.738 - uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.739 - if( (mmucr & MMUCR_AT) == 0 ) {1.740 - mmu_update_icache_phys(addr);1.741 - return TRUE;1.742 - }1.743 -1.744 - if( mmucr & MMUCR_SV ) {1.745 - entryNo = mmu_itlb_lookup_vpn( addr );1.746 - } else {1.747 - entryNo = mmu_itlb_lookup_vpn_asid( addr );1.748 - }1.749 - if( entryNo != -1 && (mmu_itlb[entryNo].flags & TLB_USERMODE) == 0 ) {1.750 - MMU_TLB_READ_PROT_ERROR(addr);1.751 - return FALSE;1.752 - }1.753 + uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.754 + if( (mmucr & MMUCR_AT) == 0 ) {1.755 + mmu_update_icache_phys(addr);1.756 + return TRUE;1.757 + }1.758 +1.759 + if( mmucr & MMUCR_SV ) {1.760 + entryNo = mmu_itlb_lookup_vpn( addr );1.761 + } else {1.762 + entryNo = mmu_itlb_lookup_vpn_asid( addr );1.763 + }1.764 + if( entryNo != -1 && (mmu_itlb[entryNo].flags & TLB_USERMODE) == 0 ) {1.765 + MMU_TLB_READ_PROT_ERROR(addr);1.766 + return FALSE;1.767 + }1.768 }1.770 switch(entryNo) {1.771 case -1:1.772 - MMU_TLB_READ_MISS_ERROR(addr);1.773 - return FALSE;1.774 + MMU_TLB_READ_MISS_ERROR(addr);1.775 + return FALSE;1.776 case -2:1.777 - MMU_TLB_MULTI_HIT_ERROR(addr);1.778 - return FALSE;1.779 + MMU_TLB_MULTI_HIT_ERROR(addr);1.780 + return FALSE;1.781 default:1.782 - sh4_icache.page_ppa = mmu_itlb[entryNo].ppn & mmu_itlb[entryNo].mask;1.783 - sh4_icache.page = mem_get_region( sh4_icache.page_ppa );1.784 - if( sh4_icache.page == NULL ) {1.785 - sh4_icache.page_vma = -1;1.786 - } else {1.787 - sh4_icache.page_vma = mmu_itlb[entryNo].vpn & mmu_itlb[entryNo].mask;1.788 - sh4_icache.mask = mmu_itlb[entryNo].mask;1.789 - }1.790 - return TRUE;1.791 + sh4_icache.page_ppa = mmu_itlb[entryNo].ppn & mmu_itlb[entryNo].mask;1.792 + sh4_icache.page = mem_get_region( sh4_icache.page_ppa );1.793 + if( sh4_icache.page == NULL ) {1.794 + sh4_icache.page_vma = -1;1.795 + } else {1.796 + sh4_icache.page_vma = mmu_itlb[entryNo].vpn & mmu_itlb[entryNo].mask;1.797 + sh4_icache.mask = mmu_itlb[entryNo].mask;1.798 + }1.799 + return TRUE;1.800 }1.801 }1.803 @@ -860,29 +860,29 @@1.804 sh4addr_t mmu_vma_to_phys_disasm( sh4vma_t vma )1.805 {1.806 if( vma & 0x80000000 ) {1.807 - if( vma < 0xC0000000 ) {1.808 - /* P1, P2 and P4 regions are pass-through (no translation) */1.809 - return VMA_TO_EXT_ADDR(vma);1.810 - } else if( vma >= 0xE0000000 && vma < 0xFFFFFF00 ) {1.811 - /* Not translatable */1.812 - return MMU_VMA_ERROR;1.813 - }1.814 + if( vma < 0xC0000000 ) {1.815 + /* P1, P2 and P4 regions are pass-through (no translation) */1.816 + return VMA_TO_EXT_ADDR(vma);1.817 + } else if( vma >= 0xE0000000 && vma < 0xFFFFFF00 ) {1.818 + /* Not translatable */1.819 + return MMU_VMA_ERROR;1.820 + }1.821 }1.823 uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.824 if( (mmucr & MMUCR_AT) == 0 ) {1.825 - return VMA_TO_EXT_ADDR(vma);1.826 + return VMA_TO_EXT_ADDR(vma);1.827 }1.828 -1.829 +1.830 int entryNo = mmu_itlb_lookup_vpn( vma );1.831 if( entryNo == -2 ) {1.832 - entryNo = mmu_itlb_lookup_vpn_asid( vma );1.833 + entryNo = mmu_itlb_lookup_vpn_asid( vma );1.834 }1.835 if( entryNo < 0 ) {1.836 - return MMU_VMA_ERROR;1.837 + return MMU_VMA_ERROR;1.838 } else {1.839 - return (mmu_itlb[entryNo].ppn & mmu_itlb[entryNo].mask) |1.840 - (vma & (~mmu_itlb[entryNo].mask));1.841 + return (mmu_itlb[entryNo].ppn & mmu_itlb[entryNo].mask) |1.842 + (vma & (~mmu_itlb[entryNo].mask));1.843 }1.844 }1.846 @@ -894,39 +894,39 @@1.847 sh4addr_t target;1.848 /* Store queue operation */1.849 if( mmucr & MMUCR_AT ) {1.850 - int entryNo;1.851 - if( ((mmucr & MMUCR_SV) == 0) || !IS_SH4_PRIVMODE() ) {1.852 - entryNo = mmu_utlb_lookup_vpn_asid( addr );1.853 - } else {1.854 - entryNo = mmu_utlb_lookup_vpn( addr );1.855 - }1.856 - switch(entryNo) {1.857 - case -1:1.858 - MMU_TLB_WRITE_MISS_ERROR(addr);1.859 - return FALSE;1.860 - case -2:1.861 - MMU_TLB_MULTI_HIT_ERROR(addr);1.862 - return FALSE;1.863 - default:1.864 - if( IS_SH4_PRIVMODE() ? ((mmu_utlb[entryNo].flags & TLB_WRITABLE) == 0)1.865 - : ((mmu_utlb[entryNo].flags & TLB_USERWRITABLE) != TLB_USERWRITABLE) ) {1.866 - /* protection violation */1.867 - MMU_TLB_WRITE_PROT_ERROR(addr);1.868 - return FALSE;1.869 - }1.870 -1.871 - if( (mmu_utlb[entryNo].flags & TLB_DIRTY) == 0 ) {1.872 - MMU_TLB_INITIAL_WRITE_ERROR(addr);1.873 - return FALSE;1.874 - }1.875 -1.876 - /* finally generate the target address */1.877 - target = ((mmu_utlb[entryNo].ppn & mmu_utlb[entryNo].mask) |1.878 - (addr & (~mmu_utlb[entryNo].mask))) & 0xFFFFFFE0;1.879 - }1.880 + int entryNo;1.881 + if( ((mmucr & MMUCR_SV) == 0) || !IS_SH4_PRIVMODE() ) {1.882 + entryNo = mmu_utlb_lookup_vpn_asid( addr );1.883 + } else {1.884 + entryNo = mmu_utlb_lookup_vpn( addr );1.885 + }1.886 + switch(entryNo) {1.887 + case -1:1.888 + MMU_TLB_WRITE_MISS_ERROR(addr);1.889 + return FALSE;1.890 + case -2:1.891 + MMU_TLB_MULTI_HIT_ERROR(addr);1.892 + return FALSE;1.893 + default:1.894 + if( IS_SH4_PRIVMODE() ? ((mmu_utlb[entryNo].flags & TLB_WRITABLE) == 0)1.895 + : ((mmu_utlb[entryNo].flags & TLB_USERWRITABLE) != TLB_USERWRITABLE) ) {1.896 + /* protection violation */1.897 + MMU_TLB_WRITE_PROT_ERROR(addr);1.898 + return FALSE;1.899 + }1.900 +1.901 + if( (mmu_utlb[entryNo].flags & TLB_DIRTY) == 0 ) {1.902 + MMU_TLB_INITIAL_WRITE_ERROR(addr);1.903 + return FALSE;1.904 + }1.905 +1.906 + /* finally generate the target address */1.907 + target = ((mmu_utlb[entryNo].ppn & mmu_utlb[entryNo].mask) |1.908 + (addr & (~mmu_utlb[entryNo].mask))) & 0xFFFFFFE0;1.909 + }1.910 } else {1.911 - uint32_t hi = (MMIO_READ( MMU, (queue == 0 ? QACR0 : QACR1) ) & 0x1C) << 24;1.912 - target = (addr&0x03FFFFE0) | hi;1.913 + uint32_t hi = (MMIO_READ( MMU, (queue == 0 ? QACR0 : QACR1) ) & 0x1C) << 24;1.914 + target = (addr&0x03FFFFE0) | hi;1.915 }1.916 mem_copy_to_sh4( target, src, 32 );1.917 return TRUE;
.