Loading cputlb.c +29 −0 Original line number Diff line number Diff line Loading @@ -498,6 +498,35 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) return qemu_ram_addr_from_host_nofail(p); } /* Return true if ADDR is present in the victim tlb, and has been copied back to the main tlb. */ static bool victim_tlb_hit(CPUArchState *env, size_t mmu_idx, size_t index, size_t elt_ofs, target_ulong page) { size_t vidx; for (vidx = 0; vidx < CPU_VTLB_SIZE; ++vidx) { CPUTLBEntry *vtlb = &env->tlb_v_table[mmu_idx][vidx]; target_ulong cmp = *(target_ulong *)((uintptr_t)vtlb + elt_ofs); if (cmp == page) { /* Found entry in victim tlb, swap tlb and iotlb. */ CPUTLBEntry tmptlb, *tlb = &env->tlb_table[mmu_idx][index]; CPUIOTLBEntry tmpio, *io = &env->iotlb[mmu_idx][index]; CPUIOTLBEntry *vio = &env->iotlb_v[mmu_idx][vidx]; tmptlb = *tlb; *tlb = *vtlb; *vtlb = tmptlb; tmpio = *io; *io = *vio; *vio = tmpio; return true; } } return false; } /* Macro to call the above, with local variables from the use context. */ #define VICTIM_TLB_HIT(TY) \ victim_tlb_hit(env, mmu_idx, index, offsetof(CPUTLBEntry, TY), \ addr & TARGET_PAGE_MASK) #define MMUSUFFIX _mmu #define SHIFT 0 Loading softmmu_template.h +0 −25 Original line number Diff line number Diff line Loading @@ -116,31 +116,6 @@ # define helper_te_st_name helper_le_st_name #endif /* macro to check the victim tlb */ #define VICTIM_TLB_HIT(ty) \ ({ \ /* we are about to do a page table walk. our last hope is the \ * victim tlb. try to refill from the victim tlb before walking the \ * page table. */ \ int vidx; \ CPUIOTLBEntry tmpiotlb; \ CPUTLBEntry tmptlb; \ for (vidx = CPU_VTLB_SIZE-1; vidx >= 0; --vidx) { \ if (env->tlb_v_table[mmu_idx][vidx].ty == (addr & TARGET_PAGE_MASK)) {\ /* found entry in victim tlb, swap tlb and iotlb */ \ tmptlb = env->tlb_table[mmu_idx][index]; \ env->tlb_table[mmu_idx][index] = env->tlb_v_table[mmu_idx][vidx]; \ env->tlb_v_table[mmu_idx][vidx] = tmptlb; \ tmpiotlb = env->iotlb[mmu_idx][index]; \ env->iotlb[mmu_idx][index] = env->iotlb_v[mmu_idx][vidx]; \ env->iotlb_v[mmu_idx][vidx] = tmpiotlb; \ break; \ } \ } \ /* return true when there is a vtlb hit, i.e. vidx >=0 */ \ vidx >= 0; \ }) #ifndef SOFTMMU_CODE_ACCESS static inline DATA_TYPE glue(io_read, SUFFIX)(CPUArchState *env, CPUIOTLBEntry *iotlbentry, Loading Loading
cputlb.c +29 −0 Original line number Diff line number Diff line Loading @@ -498,6 +498,35 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) return qemu_ram_addr_from_host_nofail(p); } /* Return true if ADDR is present in the victim tlb, and has been copied back to the main tlb. */ static bool victim_tlb_hit(CPUArchState *env, size_t mmu_idx, size_t index, size_t elt_ofs, target_ulong page) { size_t vidx; for (vidx = 0; vidx < CPU_VTLB_SIZE; ++vidx) { CPUTLBEntry *vtlb = &env->tlb_v_table[mmu_idx][vidx]; target_ulong cmp = *(target_ulong *)((uintptr_t)vtlb + elt_ofs); if (cmp == page) { /* Found entry in victim tlb, swap tlb and iotlb. */ CPUTLBEntry tmptlb, *tlb = &env->tlb_table[mmu_idx][index]; CPUIOTLBEntry tmpio, *io = &env->iotlb[mmu_idx][index]; CPUIOTLBEntry *vio = &env->iotlb_v[mmu_idx][vidx]; tmptlb = *tlb; *tlb = *vtlb; *vtlb = tmptlb; tmpio = *io; *io = *vio; *vio = tmpio; return true; } } return false; } /* Macro to call the above, with local variables from the use context. */ #define VICTIM_TLB_HIT(TY) \ victim_tlb_hit(env, mmu_idx, index, offsetof(CPUTLBEntry, TY), \ addr & TARGET_PAGE_MASK) #define MMUSUFFIX _mmu #define SHIFT 0 Loading
softmmu_template.h +0 −25 Original line number Diff line number Diff line Loading @@ -116,31 +116,6 @@ # define helper_te_st_name helper_le_st_name #endif /* macro to check the victim tlb */ #define VICTIM_TLB_HIT(ty) \ ({ \ /* we are about to do a page table walk. our last hope is the \ * victim tlb. try to refill from the victim tlb before walking the \ * page table. */ \ int vidx; \ CPUIOTLBEntry tmpiotlb; \ CPUTLBEntry tmptlb; \ for (vidx = CPU_VTLB_SIZE-1; vidx >= 0; --vidx) { \ if (env->tlb_v_table[mmu_idx][vidx].ty == (addr & TARGET_PAGE_MASK)) {\ /* found entry in victim tlb, swap tlb and iotlb */ \ tmptlb = env->tlb_table[mmu_idx][index]; \ env->tlb_table[mmu_idx][index] = env->tlb_v_table[mmu_idx][vidx]; \ env->tlb_v_table[mmu_idx][vidx] = tmptlb; \ tmpiotlb = env->iotlb[mmu_idx][index]; \ env->iotlb[mmu_idx][index] = env->iotlb_v[mmu_idx][vidx]; \ env->iotlb_v[mmu_idx][vidx] = tmpiotlb; \ break; \ } \ } \ /* return true when there is a vtlb hit, i.e. vidx >=0 */ \ vidx >= 0; \ }) #ifndef SOFTMMU_CODE_ACCESS static inline DATA_TYPE glue(io_read, SUFFIX)(CPUArchState *env, CPUIOTLBEntry *iotlbentry, Loading