[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH RFC 3/5] softmmu: add a tlb_vaddr_to_host_fill f
From: |
Richard Henderson |
Subject: |
Re: [Qemu-devel] [PATCH RFC 3/5] softmmu: add a tlb_vaddr_to_host_fill function |
Date: |
Tue, 02 Jun 2015 13:54:14 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 |
On 06/02/2015 04:26 AM, Aurelien Jarno wrote:
> int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
> - CPUTLBEntry *tlbentry = &env->tlb_table[mmu_idx][index];
> + CPUTLBEntry *tlbentry;
> target_ulong tlb_addr;
> uintptr_t haddr;
>
> +again:
> + tlbentry = &env->tlb_table[mmu_idx][index];
> +
> switch (access_type) {
> - case 0:
> + case MMU_DATA_LOAD:
> tlb_addr = tlbentry->addr_read;
> break;
> - case 1:
> + case MMU_DATA_STORE:
> tlb_addr = tlbentry->addr_write;
> break;
> - case 2:
> + case MMU_INST_FETCH:
> tlb_addr = tlbentry->addr_code;
> break;
> default:
> @@ -347,10 +350,14 @@ static inline void *tlb_vaddr_to_host(CPUArchState
> *env, target_ulong addr,
> if ((addr & TARGET_PAGE_MASK)
> != (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
> /* TLB entry is for a different page */
> + if (fill) {
> + tlb_fill(ENV_GET_CPU(env), addr, access_type, mmu_idx, retaddr);
> + goto again;
> + }
> return NULL;
> }
To properly perform a fill, you also ought to check the victim cache.
There's a macro to do that in softmmu_template.h, which is why I
placed probe_write there. It's not so convenient to use with a
variable type though.
In addition, the address of tlbentry cannot change, so there's no
point in recomputing that. Indeed, you'd probably be better off
saving &addr_foo so that you only have to go through the switch once.
switch (access_type) {
case N:
tlb_addr_ptr = &tlbentry->addr_foo;
break;
}
tlb_addr = *tlb_addr_ptr;
if (...) {
if (!VICTIM_TLB_HIT(...)) {
if (!fill) {
return NULL;
}
tlb_fill(...);
}
tlb_addr = *tlb_addr_ptr;
}
and thus there's no loop to be mis-predicted.
r~
- [Qemu-devel] [PATCH RFC 0/5] softmmu and s390x memory helper improvements, Aurelien Jarno, 2015/06/02
- [Qemu-devel] [PATCH RFC 4/5] target-s390x: function to adjust the length wrt page boundary, Aurelien Jarno, 2015/06/02
- [Qemu-devel] [PATCH RFC 1/5] target-s390x: add a cpu_mmu_idx_to_asc function., Aurelien Jarno, 2015/06/02
- [Qemu-devel] [PATCH RFC 2/5] target-390x: support non current ASC in s390_cpu_handle_mmu_fault, Aurelien Jarno, 2015/06/02
- [Qemu-devel] [PATCH RFC 5/5] target-s390x: use softmmu host addr function for mvcp/mvcs, Aurelien Jarno, 2015/06/02
- [Qemu-devel] [PATCH RFC 3/5] softmmu: add a tlb_vaddr_to_host_fill function, Aurelien Jarno, 2015/06/02
- Re: [Qemu-devel] [PATCH RFC 3/5] softmmu: add a tlb_vaddr_to_host_fill function,
Richard Henderson <=