The problem seems to be this piece of code:
cputlb.c -------- static uint64_t io_readx(...) {
if (recheck) { ...
tlb_fill(cpu, addr, size, MMU_DATA_LOAD, mmu_idx, retaddr);
entry = tlb_entry(env, mmu_idx, addr); tlb_addr = entry->addr_read; ... } --------
"entry->addr_read" is indeed looking for a "reading address". in this case, it must look for an "executing address", i.e. "entry->addr_code".
I see softmmu_template.h does something like this: ---- ... #ifdef SOFTMMU_CODE_ACCESS #define READ_ACCESS_TYPE MMU_INST_FETCH #define ADDR_READ addr_code #else #define READ_ACCESS_TYPE MMU_DATA_LOAD #define ADDR_READ addr_read #endif ...
WORD_TYPE helper_le_ld_name(...) { ... target_ulong tlb_addr = entry->ADDR_READ; ... } ----
The problem seems to be this piece of code:
cputlb.c
--------
static uint64_t io_readx(...)
{
if (recheck) {
...
entry = tlb_entry(env, mmu_idx, addr);
tlb_addr = entry->addr_read;
...
}
--------
"entry->addr_read" is indeed looking for a "reading address". in this case, it must look for an
"executing address", i.e. "entry->addr_code".
I see softmmu_template.h does something like this:
----
...
#ifdef SOFTMMU_CODE_ACCESS
#define READ_ACCESS_TYPE MMU_INST_FETCH
#define ADDR_READ addr_code
#else
#define READ_ACCESS_TYPE MMU_DATA_LOAD
#define ADDR_READ addr_read
#endif
...
WORD_TYPE helper_ le_ld_name( ...)
{
...
target_ulong tlb_addr = entry->ADDR_READ;
...
}
----