Revision 6ebbf390 exec-all.h

b/exec-all.h
117 117
void tlb_flush(CPUState *env, int flush_global);
118 118
int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
119 119
                      target_phys_addr_t paddr, int prot,
120
                      int is_user, int is_softmmu);
120
                      int mmu_idx, int is_softmmu);
121 121
static inline int tlb_set_page(CPUState *env, target_ulong vaddr,
122 122
                               target_phys_addr_t paddr, int prot,
123
                               int is_user, int is_softmmu)
123
                               int mmu_idx, int is_softmmu)
124 124
{
125 125
    if (prot & PAGE_READ)
126 126
        prot |= PAGE_EXEC;
127
    return tlb_set_page_exec(env, vaddr, paddr, prot, is_user, is_softmmu);
127
    return tlb_set_page_exec(env, vaddr, paddr, prot, mmu_idx, is_softmmu);
128 128
}
129 129

  
130 130
#define CODE_GEN_MAX_SIZE        65536
......
562 562

  
563 563
#if !defined(CONFIG_USER_ONLY)
564 564

  
565
void tlb_fill(target_ulong addr, int is_write, int is_user,
565
void tlb_fill(target_ulong addr, int is_write, int mmu_idx,
566 566
              void *retaddr);
567 567

  
568
#define ACCESS_TYPE 3
568
#define ACCESS_TYPE (NB_MMU_MODES + 1)
569 569
#define MEMSUFFIX _code
570 570
#define env cpu_single_env
571 571

  
......
598 598
   is the offset relative to phys_ram_base */
599 599
static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr)
600 600
{
601
    int is_user, index, pd;
601
    int mmu_idx, index, pd;
602 602

  
603 603
    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
604
#if defined(TARGET_I386)
605
    is_user = ((env->hflags & HF_CPL_MASK) == 3);
606
#elif defined (TARGET_PPC)
607
    is_user = msr_pr;
608
#elif defined (TARGET_MIPS)
609
    is_user = ((env->hflags & MIPS_HFLAG_MODE) == MIPS_HFLAG_UM);
610
#elif defined (TARGET_SPARC)
611
    is_user = (env->psrs == 0);
612
#elif defined (TARGET_ARM)
613
    is_user = ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR);
614
#elif defined (TARGET_SH4)
615
    is_user = ((env->sr & SR_MD) == 0);
616
#elif defined (TARGET_ALPHA)
617
    is_user = ((env->ps >> 3) & 3);
618
#elif defined (TARGET_M68K)
619
    is_user = ((env->sr & SR_S) == 0);
620
#elif defined (TARGET_CRIS)
621
    is_user = (0);
622
#else
623
#error unimplemented CPU
624
#endif
625
    if (__builtin_expect(env->tlb_table[is_user][index].addr_code !=
604
    mmu_idx = cpu_mmu_index(env);
605
    if (__builtin_expect(env->tlb_table[mmu_idx][index].addr_code !=
626 606
                         (addr & TARGET_PAGE_MASK), 0)) {
627 607
        ldub_code(addr);
628 608
    }
629
    pd = env->tlb_table[is_user][index].addr_code & ~TARGET_PAGE_MASK;
609
    pd = env->tlb_table[mmu_idx][index].addr_code & ~TARGET_PAGE_MASK;
630 610
    if (pd > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
631 611
#ifdef TARGET_SPARC
632 612
        do_unassigned_access(addr, 0, 1, 0);
......
634 614
        cpu_abort(env, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
635 615
#endif
636 616
    }
637
    return addr + env->tlb_table[is_user][index].addend - (unsigned long)phys_ram_base;
617
    return addr + env->tlb_table[mmu_idx][index].addend - (unsigned long)phys_ram_base;
638 618
}
639 619
#endif
640 620

  

Also available in: Unified diff