Guest register G4 and above have PMU-ish features that are yet to be implemented. We'll skip these when we encounter this code rather than fault on an assertion.
Note that the generated call to greg_writable() has the side-effect of doing a LOG_UNIMP for these register accesses. Signed-off-by: Brian Cain <[email protected]> --- target/hexagon/translate.h | 4 +++- target/hexagon/hex_common.py | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/target/hexagon/translate.h b/target/hexagon/translate.h index 00de2b0d2ec..d8628383f1d 100644 --- a/target/hexagon/translate.h +++ b/target/hexagon/translate.h @@ -97,7 +97,9 @@ bool is_gather_store_insn(DisasContext *ctx); #ifndef CONFIG_USER_ONLY static inline void ctx_log_greg_write(DisasContext *ctx, int rnum) { - assert(rnum <= HEX_GREG_G3); + if (rnum > HEX_GREG_G3) { + return; + } ctx->greg_log[ctx->greg_log_idx] = rnum; ctx->greg_log_idx++; } diff --git a/target/hexagon/hex_common.py b/target/hexagon/hex_common.py index e33d43e3ce0..c180c19b092 100755 --- a/target/hexagon/hex_common.py +++ b/target/hexagon/hex_common.py @@ -1097,11 +1097,24 @@ def analyze_write(self, f, tag, regno): """)) class GuestRegister(Register): - pass + def gen_check_impl(self, f, regno): + if self.is_written(): + f.write(code_fmt(f"""\ + if (!greg_writable(insn->regno[{regno}], + {str(self.is_pair()).lower()})) {{ + return; + }} + """)) + else: + f.write(code_fmt(f"""\ + check_greg_impl(insn->regno[{regno}], + {str(self.is_pair()).lower()}); + """)) class GuestDest(GuestRegister, Single, Dest): def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) + self.gen_check_impl(f, regno) f.write(code_fmt(f"""\ TCGv_i32 {self.reg_tcg()} = tcg_temp_new_i32(); """)) @@ -1121,6 +1134,7 @@ def decl_reg_num(self, f, regno): """)) def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) + self.gen_check_impl(f, regno) f.write(code_fmt(f"""\ TCGv_i32 {self.reg_tcg()} = tcg_temp_new_i32(); gen_read_greg({self.reg_tcg()}, {self.reg_num}); @@ -1131,6 +1145,7 @@ def analyze_read(self, f, regno): class GuestPairDest(GuestRegister, Pair, Dest): def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) + self.gen_check_impl(f, regno) f.write(code_fmt(f"""\ TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64(); """)) @@ -1150,6 +1165,7 @@ def decl_reg_num(self, f, regno): """)) def decl_tcg(self, f, tag, regno): self.decl_reg_num(f, regno) + self.gen_check_impl(f, regno) f.write(code_fmt(f"""\ TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64(); gen_read_greg_pair({self.reg_tcg()}, {self.reg_num}); -- 2.34.1
