Previous 199869 Revisions Next

r20752 Wednesday 6th February, 2013 at 01:47:18 UTC by Ryan Holtz
arm.c: Add fine page table lvl2 lookup, fixes ldrink fatalerror. [MooglyGuy]
[src/emu/cpu/arm7]arm7.c arm7core.h arm7drc.c

trunk/src/emu/cpu/arm7/arm7drc.c
r20751r20752
22872287
22882288   if (T_IS_SET(GET_CPSR))
22892289   {
2290      UINT32 raddr;
22902291
2292      pc = R15;
2293
2294      // "In Thumb state, bit [0] is undefined and must be ignored. Bits [31:1] contain the PC."
2295      raddr = pc & (~1);
2296
2297      if ( COPRO_CTRL & COPRO_CTRL_MMU_EN )
2298      {
2299         if (!arm7_tlb_translate(arm, &raddr, ARM7_TLB_ABORT_P | ARM7_TLB_READ))
2300         {
2301            goto skip_exec;
2302         }
2303      }
2304
2305      UML_AND(block, I0, DRC_PC, ~1);
2306      UML_TEST(block, mem(&COPRO_CTRL), COPRO_CTRL_MMU_EN);            // test      COPRO_CTRL, COPRO_CTRL_MMU_EN
2307      UML_MOVc(block, COND_Z, I0, 0);                              // movz      i0, 0
2308      UML_MOVc(block, COND_NZ, I0, ARM7_TLB_ABORT_P | ARM7_TLB_READ);      // movnz   i0, ARM7_TLB_ABORT_P | ARM7_TLB_READ
2309      UML_CALLHc(block, COND_NZ, *arm->impstate->tlb_translate);         // callhnz   tlb_translate);
2310
2311      insn = arm->direct->read_decrypted_word(raddr);
2312      thumb_handler[(insn & 0xffc0) >> 6](arm, pc, insn);
2313      UML_OR(block, I3, I3, );                                 // or      i2, i2, i3
2314      UML_CALLHc(block, COND_NZ, *arm->impstate->tlb_translate);         // callhnz   tlb_translate
2315
22912316   }
2317   else
2318   {
2319      UML_AND(block, I0, DRC_PC, ~1);
2320      UML_TEST(block, mem(&COPRO_CTRL), COPRO_CTRL_MMU_EN);            // test      COPRO_CTRL, COPRO_CTRL_MMU_EN
2321      UML_MOVc(block, COND_NZ, I3, ARM7_TLB_READ);               // movnz   i3, ARM7_TLB_READ
2322      UML_OR(block, I3, I3, I3);                                 // or      i2, i2, i3
2323      UML_CALLHc(block, COND_NZ, *arm->impstate->tlb_translate);         // callhnz   tlb_translate
2324   }
22922325
22932326   switch (opswitch)
22942327   {
trunk/src/emu/cpu/arm7/arm7core.h
r20751r20752
103103#define COPRO_TLB_VADDR_FSLTI_MASK_SHIFT    8
104104#define COPRO_TLB_CFLD_ADDR_MASK            0xfffffc00
105105#define COPRO_TLB_CFLD_ADDR_MASK_SHIFT      10
106#define COPRO_TLB_FPTB_ADDR_MASK            0xfffff000
107#define COPRO_TLB_FPTB_ADDR_MASK_SHIFT      12
106108#define COPRO_TLB_SECTION_PAGE_MASK         0xfff00000
107109#define COPRO_TLB_LARGE_PAGE_MASK           0xffff0000
108110#define COPRO_TLB_SMALL_PAGE_MASK           0xfffff000
trunk/src/emu/cpu/arm7/arm7.c
r20751r20752
127127   switch( granularity )
128128   {
129129      case TLB_COARSE:
130         desc_lvl2 = ( first_desc & COPRO_TLB_CFLD_ADDR_MASK ) | ( ( vaddr & COPRO_TLB_VADDR_CSLTI_MASK ) >> COPRO_TLB_VADDR_CSLTI_MASK_SHIFT );
130         desc_lvl2 = (first_desc & COPRO_TLB_CFLD_ADDR_MASK) | ((vaddr & COPRO_TLB_VADDR_CSLTI_MASK) >> COPRO_TLB_VADDR_CSLTI_MASK_SHIFT);
131131         break;
132132      case TLB_FINE:
133         LOG( ( "ARM7: Attempting to get second-level TLB descriptor of fine granularity\n" ) );
133         desc_lvl2 = (first_desc & COPRO_TLB_FPTB_ADDR_MASK) | ((vaddr & COPRO_TLB_VADDR_FSLTI_MASK) >> COPRO_TLB_VADDR_FSLTI_MASK_SHIFT);
134134         break;
135135      default:
136136         // We shouldn't be here
r20751r20752
322322         }
323323         break;
324324      case COPRO_TLB_FINE_TABLE:
325         // Entry is the physical address of a fine second-level table
326         fatalerror("ARM7: Not Yet Implemented: fine second-level TLB lookup, PC = %08x, vaddr = %08x\n", R15, vaddr);
325         // Entry is the physical address of a coarse second-level table
326         if ((permission == 1) || (permission == 3))
327         {
328            desc_lvl2 = arm7_tlb_get_second_level_descriptor( arm, TLB_FINE, desc_lvl1, vaddr );
329         }
330         else
331         {
332            fatalerror("ARM7: Not Yet Implemented: Fine Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x\n", vaddr, domain, R15);
333         }
327334         break;
328335      default:
329336         // Entry is the physical address of a three-legged termite-eaten table

Previous 199869 Revisions Next


© 1997-2024 The MAME Team