target/xtensa: convert to do_transaction_failed
PATCH 1/1 target/xtensa: convert to do_transaction_failed
--- target/xtensa/cpu.c | 2 +- target/xtensa/cpu.h | 7 ++++--- target/xtensa/op_helper.c | 12 +++++++----- 3 files changed, 12 insertions(+), 9 deletions(-)
target/xtensa/cpu.c +1 -1
@@ -186,7 +186,7 @@ static void xtensa_cpu_class_init(ObjectClass *oc, void *data)#else cc->do_unaligned_access = xtensa_cpu_do_unaligned_access; cc->get_phys_page_debug = xtensa_cpu_get_phys_page_debug; - cc->do_unassigned_access = xtensa_cpu_do_unassigned_access; + cc->do_transaction_failed = xtensa_cpu_do_transaction_failed;#endif cc->debug_excp_handler = xtensa_breakpoint_handler; cc->disas_set_info = xtensa_cpu_disas_set_info;
target/xtensa/cpu.h +4 -3
@@ -497,9 +497,10 @@ int xtensa_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, int size, int mmu_idx);void xtensa_cpu_do_interrupt (CPUState *cpu);bool xtensa_cpu_exec_interrupt (CPUState *cpu,int interrupt_request); -void xtensa_cpu_do_unassigned_access (CPUState *cpu,hwaddr addr, -bool is_write,bool is_exec,int opaque, -unsigned size); +void xtensa_cpu_do_transaction_failed (CPUState *cs,hwaddr physaddr,vaddr addr, +unsigned size,MMUAccessType access_type, +int mmu_idx,MemTxAttrs attrs, +MemTxResult response,uintptr_t retaddr);void xtensa_cpu_dump_state (CPUState *cpu,FILE *f,fprintf_function cpu_fprintf,int flags);hwaddr xtensa_cpu_get_phys_page_debug (CPUState *cpu,vaddr addr);
target/xtensa/op_helper.c +7 -5
@@ -78,18 +78,20 @@ void tlb_fill(CPUState *cs, target_ulong vaddr, int size, } } -void xtensa_cpu_do_unassigned_access (CPUState *cs,hwaddr addr, -bool is_write,bool is_exec,int opaque, -unsigned size) +void xtensa_cpu_do_transaction_failed (CPUState *cs,hwaddr physaddr,vaddr addr, +unsigned size,MMUAccessType access_type, +int mmu_idx,MemTxAttrs attrs, +MemTxResult response,uintptr_t retaddr) {XtensaCPU *cpu =XTENSA_CPU (cs);CPUXtensaState *env = &cpu->env; +cpu_restore_state (cs, retaddr, true);HELPER (exception_cause_vaddr)(env, env->pc, - is_exec ? + access_type ==MMU_INST_FETCH ?INSTR_PIF_ADDR_ERROR_CAUSE :LOAD_STORE_PIF_ADDR_ERROR_CAUSE , - is_exec ? addr : cs->mem_io_vaddr); + addr); }static void tb_invalidate_virtual_addr (CPUXtensaState *env,uint32_t vaddr)
Signature · 1 line
2.11.0
Quoted 6 lines · Max Filippov
Signed-off-by Max Filippov <[email protected]>--- target/xtensa/cpu.c | 2 +- target/xtensa/cpu.h | 7 ++++--- target/xtensa/op_helper.c | 12 +++++++----- 3 files changed, 12 insertions(+), 9 deletions(-)
Hi -- thanks for doing this conversion. This change means that you'll no longer get guest exceptions for bus errors that happen during get_pte()'s page table entry fetch. Don't you need at least a TODO comment there indicating that there's missing behaviour?
(Obviously the ideal would be to switch to address_space_ldl_* and handle the case when they don't return MEMTX_OK.)
thanks
-- PMM
Hi Peter,
Quoted 8 lines · Peter Maydell
Quoted 6 lines · Max Filippov
Signed-off-by Max Filippov <[email protected]>--- target/xtensa/cpu.c | 2 +- target/xtensa/cpu.h | 7 ++++--- target/xtensa/op_helper.c | 12 +++++++----- 3 files changed, 12 insertions(+), 9 deletions(-)
Quoted 5 lines
Hi -- thanks for doing this conversion. This change means that you'll no longer get guest exceptions for bus errors that happen during get_pte()'s page table entry fetch. Don't you need at least a TODO comment there indicating that there's missing behaviour?
Thanks for taking a look and letting me know, I've missed that entirely.
Quoted 2 lines
(Obviously the ideal would be to switch to address_space_ldl_* and handle the case when they don't return
MEMTX_OK.)
Yeah, let me do something about it.
Signature · 2 lines
Thanks. -- Max
Quoted 12 lines · Max Filippov
Hi Peter,
Quoted 8 lines · Peter Maydell
Quoted 6 lines · Max Filippov
Signed-off-by Max Filippov <[email protected]>--- target/xtensa/cpu.c | 2 +- target/xtensa/cpu.h | 7 ++++--- target/xtensa/op_helper.c | 12 +++++++----- 3 files changed, 12 insertions(+), 9 deletions(-)
Quoted 7 lines
Quoted 5 lines
Hi -- thanks for doing this conversion. This change means that you'll no longer get guest exceptions for bus errors that happen during get_pte()'s page table entry fetch. Don't you need at least a TODO comment there indicating that there's missing behaviour?
Thanks for taking a look and letting me know, I've missed that entirely.
Basically the new hook only handles failures for code paths that go via the MMU; anything where the target code does a direct physical address lookup has to handle the failure itself. I think for xtensa that's just the page table reads.
(This is why it's a bit of a pain to convert a target, but the end result makes much more sense, because almost always the target code doing physical address accesses doesn't want to handle bus errors by randomly longjumping out.)
thanks
-- PMM