Search
lxdream.org :: lxdream/src/sh4/mmu.c :: diff
lxdream 0.9.1
released Jun 29
Download Now
filename src/sh4/mmu.c
changeset 971:886e1ec8447d
prev968:6fb1481859a4
next973: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 +0000
1.2 +++ b/src/sh4/mmu.c Thu Jan 22 02:58:13 2009 +0000
1.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.11
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 out
1.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 in
1.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 out
1.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 in
1.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 pages
1.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 out
1.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 in
1.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 }
.