1.1 --- a/src/sh4/mmu.c Wed Jan 07 05:45:15 2009 +0000
1.2 +++ b/src/sh4/mmu.c Wed Jan 07 06:01:33 2009 +0000
1.4 /* Accessed from the UTLB accessor methods */
1.7 +static gboolean mmu_urc_overflow; /* If true, urc was set >= urb */
1.10 static struct itlb_entry mmu_itlb[ITLB_ENTRY_COUNT];
1.12 static void mmu_utlb_1k_init();
1.13 static struct utlb_1k_entry *mmu_utlb_1k_alloc();
1.14 static void mmu_utlb_1k_free( struct utlb_1k_entry *entry );
1.15 +static void mmu_fix_urc();
1.17 static void FASTCALL tlb_miss_read( sh4addr_t addr, void *exc );
1.18 static int32_t FASTCALL tlb_protected_read( sh4addr_t addr, void *exc );
1.21 void MMU_save_state( FILE *f )
1.24 fwrite( &mmu_itlb, sizeof(mmu_itlb), 1, f );
1.25 fwrite( &mmu_utlb, sizeof(mmu_utlb), 1, f );
1.26 fwrite( &mmu_urc, sizeof(mmu_urc), 1, f );
1.30 uint32_t mmucr = MMIO_READ(MMU,MMUCR);
1.31 + mmu_urc_overflow = mmu_urc >= mmu_urb;
1.32 mmu_set_tlb_enabled(mmucr&MMUCR_AT);
1.33 mmu_set_storequeue_protected(mmucr&MMUCR_SQMD, mmucr&MMUCR_AT);
1.39 - mmu_urc %= mmu_urb;
1.41 if( mmu_utlb[mmu_urc].flags & TLB_VALID )
1.42 mmu_utlb_remove_entry( mmu_urc );
1.43 mmu_utlb[mmu_urc].vpn = MMIO_READ(MMU, PTEH) & 0xFFFFFC00;
1.48 - mmu_urc %= mmu_urb;
1.50 return MMIO_READ( MMU, MMUCR) | (mmu_urc<<10) | ((mmu_urb&0x3F)<<18) | (mmu_lrui<<26);
1.52 return MMIO_READ( MMU, reg );
1.54 mmu_urb = (val >> 18) & 0x3F;
1.55 if( mmu_urb == 0 ) {
1.57 + } else if( mmu_urc >= mmu_urb ) {
1.58 + mmu_urc_overflow = TRUE;
1.60 mmu_lrui = (val >> 26) & 0x3F;
1.62 @@ -343,9 +349,17 @@
1.64 * MMU accessor functions just increment URC - fixup here if necessary
1.66 -static inline void mmu_urc_fixup()
1.67 +static inline void mmu_fix_urc()
1.69 - mmu_urc %= mmu_urb;
1.70 + if( mmu_urc_overflow ) {
1.71 + if( mmu_urc >= 0x40 ) {
1.72 + mmu_urc_overflow = FALSE;
1.74 + mmu_urc %= mmu_urb;
1.77 + mmu_urc %= mmu_urb;
1.81 static void mmu_register_mem_region( uint32_t start, uint32_t end, mem_region_fn_t fn )