filename | src/sh4/mmu.c |
changeset | 971:886e1ec8447d |
prev | 968:6fb1481859a4 |
next | 973:7434ac745eff |
author | nkeynes |
date | Thu Jan 22 02:58:13 2009 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Fix 1k-entry allocation Break asid remap into two passes for simplicity |
file | annotate | diff | log | raw |
1.1 --- a/src/sh4/mmu.c Thu Jan 15 11:23:20 2009 +00001.2 +++ b/src/sh4/mmu.c Thu Jan 22 02:58:13 2009 +00001.3 @@ -334,7 +334,7 @@1.4 static struct utlb_1k_entry *mmu_utlb_1k_alloc()1.5 {1.6 assert( mmu_utlb_1k_free_index < UTLB_ENTRY_COUNT );1.7 - struct utlb_1k_entry *entry = &mmu_utlb_1k_pages[mmu_utlb_1k_free_index++];1.8 + struct utlb_1k_entry *entry = &mmu_utlb_1k_pages[mmu_utlb_1k_free_list[mmu_utlb_1k_free_index++]];1.9 return entry;1.10 }1.12 @@ -473,35 +473,39 @@1.13 int i;1.14 if( IS_SV_ENABLED() ) {1.15 for( i=0; i<UTLB_ENTRY_COUNT; i++ ) {1.16 - if( mmu_utlb[i].flags & TLB_VALID ) {1.17 - if( (mmu_utlb[i].flags & TLB_SHARE) == 0 ) {1.18 - if( mmu_utlb[i].asid == mmu_asid ) { // Matches old ASID - unmap out1.19 - if( !mmu_utlb_unmap_pages( FALSE, TRUE, mmu_utlb[i].vpn&mmu_utlb[i].mask,1.20 - get_tlb_size_pages(mmu_utlb[i].flags) ) )1.21 - mmu_utlb_remap_pages( FALSE, TRUE, i );1.22 - } else if( mmu_utlb[i].asid == asid ) { // Matches new ASID - map in1.23 - mmu_utlb_map_pages( NULL, mmu_utlb_pages[i].user_fn,1.24 - mmu_utlb[i].vpn&mmu_utlb[i].mask,1.25 - get_tlb_size_pages(mmu_utlb[i].flags) );1.26 - }1.27 - }1.28 + if( mmu_utlb[i].asid == mmu_asid &&1.29 + (mmu_utlb[i].flags & (TLB_VALID|TLB_SHARE)) == (TLB_VALID) ) {1.30 + // Matches old ASID - unmap out1.31 + if( !mmu_utlb_unmap_pages( FALSE, TRUE, mmu_utlb[i].vpn&mmu_utlb[i].mask,1.32 + get_tlb_size_pages(mmu_utlb[i].flags) ) )1.33 + mmu_utlb_remap_pages( FALSE, TRUE, i );1.34 + }1.35 + }1.36 + for( i=0; i<UTLB_ENTRY_COUNT; i++ ) {1.37 + if( mmu_utlb[i].asid == asid &&1.38 + (mmu_utlb[i].flags & (TLB_VALID|TLB_SHARE)) == (TLB_VALID) ) {1.39 + // Matches new ASID - map in1.40 + mmu_utlb_map_pages( NULL, mmu_utlb_pages[i].user_fn,1.41 + mmu_utlb[i].vpn&mmu_utlb[i].mask,1.42 + get_tlb_size_pages(mmu_utlb[i].flags) );1.43 }1.44 }1.45 } else {1.46 // Remap both Priv+user pages1.47 for( i=0; i<UTLB_ENTRY_COUNT; i++ ) {1.48 - if( mmu_utlb[i].flags & TLB_VALID ) {1.49 - if( (mmu_utlb[i].flags & TLB_SHARE) == 0 ) {1.50 - if( mmu_utlb[i].asid == mmu_asid ) { // Matches old ASID - unmap out1.51 - if( !mmu_utlb_unmap_pages( TRUE, TRUE, mmu_utlb[i].vpn&mmu_utlb[i].mask,1.52 - get_tlb_size_pages(mmu_utlb[i].flags) ) )1.53 - mmu_utlb_remap_pages( TRUE, TRUE, i );1.54 - } else if( mmu_utlb[i].asid == asid ) { // Matches new ASID - map in1.55 - mmu_utlb_map_pages( &mmu_utlb_pages[i].fn, mmu_utlb_pages[i].user_fn,1.56 - mmu_utlb[i].vpn&mmu_utlb[i].mask,1.57 - get_tlb_size_pages(mmu_utlb[i].flags) );1.58 - }1.59 - }1.60 + if( mmu_utlb[i].asid == mmu_asid &&1.61 + (mmu_utlb[i].flags & (TLB_VALID|TLB_SHARE)) == (TLB_VALID) ) {1.62 + if( !mmu_utlb_unmap_pages( TRUE, TRUE, mmu_utlb[i].vpn&mmu_utlb[i].mask,1.63 + get_tlb_size_pages(mmu_utlb[i].flags) ) )1.64 + mmu_utlb_remap_pages( TRUE, TRUE, i );1.65 + }1.66 + }1.67 + for( i=0; i<UTLB_ENTRY_COUNT; i++ ) {1.68 + if( mmu_utlb[i].asid == asid &&1.69 + (mmu_utlb[i].flags & (TLB_VALID|TLB_SHARE)) == (TLB_VALID) ) {1.70 + mmu_utlb_map_pages( &mmu_utlb_pages[i].fn, mmu_utlb_pages[i].user_fn,1.71 + mmu_utlb[i].vpn&mmu_utlb[i].mask,1.72 + get_tlb_size_pages(mmu_utlb[i].flags) );1.73 }1.74 }1.75 }
.