diff options
author | Richard Henderson <rth@twiddle.net> | 2016-07-08 12:19:32 -0700 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2016-07-08 12:58:55 -0700 |
commit | 7e9a7c50d9a400ef51242d661a261123c2cc9485 (patch) | |
tree | e9f57a47518a8d2d41829fc0e3d21b37dd38327a /cputlb.c | |
parent | 4f4a9ca4a4386c137301b3662faba076455ff15a (diff) | |
download | qemu-7e9a7c50d9a400ef51242d661a261123c2cc9485.tar.gz qemu-7e9a7c50d9a400ef51242d661a261123c2cc9485.tar.bz2 qemu-7e9a7c50d9a400ef51242d661a261123c2cc9485.zip |
cputlb: Move VICTIM_TLB_HIT out of line
There are currently 22 invocations of this function,
and we're about to increase that number.
Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'cputlb.c')
-rw-r--r-- | cputlb.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -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 |