target-xtensa: fix translation for cross-page opcodes
cover target-xtensa: fix translation for cross-page opcodes
Hi,
this series fixes translation for opcodes crossing page boundary and adds a testcase.
Max Filippov (2):
target-xtensa: fix translation for opcodes crossing page boundary
target-xtensa: test cross-page opcode
target-xtensa/translate.c | 27 +++++++++++++++++++++++---- tests/tcg/xtensa/test_mmu.S | 26 +++++++++++++------------- 2 files changed, 36 insertions(+), 17 deletions(-)
Signature · 1 line
1.8.1.4
PATCH 1/2 target-xtensa: fix translation for opcodes crossing page boundary
If TB ends with an opcode that crosses page boundary and the following page is not executable then EPC1 for the code fetch exception wrongly points at the beginning of the TB. Always treat instruction that crosses page boundary as a separate TB.
Signed-off-by Max Filippov <[email protected]>
--- target-xtensa/translate.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)
target-xtensa/translate.c +23 -4
@@ -887,6 +887,11 @@ static TCGv_i32 gen_mac16_m(TCGv_i32 v, bool hi, bool is_unsigned)return m; } +static inline unsigned xtensa_op0_insn_len (unsigned op0) +{ +return op0 >=8 ?2 :3 ; +} +static void disas_xtensa_insn (CPUXtensaState *env,DisasContext *dc) {#define HAS_OPTION_BITS (opt) do { \
@@ -989,6 +994,7 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)uint8_t b0 =cpu_ldub_code (env, dc->pc);uint8_t b1 =cpu_ldub_code (env, dc->pc +1 );uint8_t b2 =0 ; +unsigned len =xtensa_op0_insn_len (OP0 );static const uint32_t B4CONST [] = {0xffffffff ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,10 ,12 ,16 ,32 ,64 ,128 ,256
@@ -998,13 +1004,19 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)32768 ,65536 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,10 ,12 ,16 ,32 ,64 ,128 ,256 }; -if (OP0 >=8 ) { - dc->next_pc = dc->pc +2 ; +switch (len) { +case 2 :HAS_OPTION (XTENSA_OPTION_CODE_DENSITY ); - }else { - dc->next_pc = dc->pc +3 ; +break ; + +case 3 : b2 =cpu_ldub_code (env, dc->pc +2 ); +break ; + +default : +RESERVED (); } + dc->next_pc = dc->pc + len;switch (OP0 ) {case 0 :/*QRST*/
@@ -2949,6 +2961,12 @@ invalid_opcode:#undef HAS_OPTION } +static inline unsigned xtensa_insn_len (CPUXtensaState *env,DisasContext *dc) +{ +uint8_t b0 =cpu_ldub_code (env, dc->pc); +return xtensa_op0_insn_len (OP0 ); +} +static void check_breakpoint (CPUXtensaState *env,DisasContext *dc) {CPUState *cs =CPU (xtensa_env_get_cpu (env));
@@ -3081,6 +3099,7 @@ void gen_intermediate_code_internal(XtensaCPU *cpu, }while (dc.is_jmp ==DISAS_NEXT && insn_count < max_insns && dc.pc < next_page_start && + dc.pc +xtensa_insn_len (env, &dc) <= next_page_start && tcg_ctx.gen_opc_ptr < gen_opc_end);reset_litbase (&dc);
Signature · 1 line
1.8.1.4
PATCH 2/2 target-xtensa: test cross-page opcode
In reply to Max FilippovAlter cross-page TB test to also test cross-page opcode.
Signed-off-by Max Filippov <[email protected]>
--- tests/tcg/xtensa/test_mmu.S | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
tests/tcg/xtensa/test_mmu.S +13 -13
@@ -641,7 +641,7 @@ test cross_page_tb witlb a2, a3 wdtlb a2, a3 - movi a2, 0x00007ffd + movi a2, 0x00007ffc movi a3, 20f movi a4, 21f sub a4, a4, a3
@@ -651,7 +651,7 @@ test cross_page_tb addi a2, a2, 1 addi a3, a3, 1 1: - movi a2, 0x00007ffd + movi a2, 0x00007ffc movi a3, 0x00008000 /* DTLB: OK, ITLB: OK */ jx a2
@@ -668,10 +668,10 @@ test cross_page_tb movi a3, 1 assert eq, a2, a3 rsr a2, epc1 - movi a3, 0x8000 + movi a3, 0x7fff assert eq, a2, a3 rsr a2, excsave1 - movi a3, 0x00007ffd + movi a3, 0x00007ffc assert ne, a2, a3 reset_ps
@@ -680,7 +680,7 @@ test cross_page_tb movi a2, 0x0400000c /* PPN */ movi a3, 0x00008000 /* VPN */ wdtlb a2, a3 - movi a2, 0x00007ffd + movi a2, 0x00007ffc movi a3, 0x00008000 /* DTLB: FAIL, ITLB: OK */ jx a2
@@ -689,10 +689,10 @@ test cross_page_tb movi a3, 28 assert eq, a2, a3 rsr a2, epc1 - movi a3, 0x7ffd + movi a3, 0x7ffc assert eq, a2, a3 rsr a2, excsave1 - movi a3, 0x00007ffd + movi a3, 0x00007ffc assert eq, a2, a3 reset_ps
@@ -703,7 +703,7 @@ test cross_page_tb witlb a2, a3 movi a2, 0x04000003 /* PPN */ wdtlb a2, a3 - movi a2, 0x00007ffd + movi a2, 0x00007ffc movi a3, 0x00008000 /* DTLB: OK, ITLB: FAIL */ jx a2
@@ -712,10 +712,10 @@ test cross_page_tb movi a3, 20 assert eq, a2, a3 rsr a2, epc1 - movi a3, 0x8000 + movi a3, 0x7fff assert eq, a2, a3 rsr a2, excsave1 - movi a3, 0x00007ffd + movi a3, 0x00007ffc assert ne, a2, a3 reset_ps
@@ -724,7 +724,7 @@ test cross_page_tb movi a2, 0x0400000c /* PPN */ movi a3, 0x00008000 /* VPN */ wdtlb a2, a3 - movi a2, 0x00007ffd + movi a2, 0x00007ffc movi a3, 0x00008000 /* DTLB: FAIL, ITLB: FAIL */ jx a2
@@ -733,10 +733,10 @@ test cross_page_tb movi a3, 28 assert eq, a2, a3 rsr a2, epc1 - movi a3, 0x7ffd + movi a3, 0x7ffc assert eq, a2, a3 rsr a2, excsave1 - movi a3, 0x00007ffd + movi a3, 0x00007ffc assert eq, a2, a3 test_end
Signature · 1 line
1.8.1.4