> -----Original Message-----
> From: Brian Cain <brian.c...@oss.qualcomm.com>
> Sent: Friday, February 28, 2025 11:26 PM
> To: qemu-devel@nongnu.org
> Cc: brian.c...@oss.qualcomm.com; richard.hender...@linaro.org;
> phi...@linaro.org; quic_mathb...@quicinc.com; a...@rev.ng; a...@rev.ng;
> quic_mlie...@quicinc.com; ltaylorsimp...@gmail.com;
> alex.ben...@linaro.org; quic_mbur...@quicinc.com;
> sidn...@quicinc.com; Brian Cain <bc...@quicinc.com>
> Subject: [PATCH 03/38] target/hexagon: Add System/Guest register
> definitions
>
Based on the subject, I was expecting to see the register definitions in
CPUHexagonState. A better description would be
target/hexagon: Handle system/guest registers in gen_analyze_funcs.py and
hex_common.py
> From: Brian Cain <bc...@quicinc.com>
>
> Signed-off-by: Brian Cain <brian.c...@oss.qualcomm.com>
> ---
> target/hexagon/gen_analyze_funcs.py | 21 +++-
> target/hexagon/hex_common.py | 163
> ++++++++++++++++++++++++++++
> 2 files changed, 181 insertions(+), 3 deletions(-)
>
> diff --git a/target/hexagon/hex_common.py
> b/target/hexagon/hex_common.py index 758e5fd12d..db50defeb6 100755
> --- a/target/hexagon/hex_common.py
> +++ b/target/hexagon/hex_common.py
> @@ -33,6 +33,41 @@
> overrides = {} # tags with helper overrides idef_parser_enabled = {} #
> tags
> enabled for idef-parser
>
> +class GuestRegister(Register):
> + 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()});
You can indent this, the code_fmt function will handle it properly in the
output. Are you worried about making the line too long for checkpatch?
> + """))
> +
> +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 {self.reg_tcg()} = tcg_temp_new();
> + gen_read_greg({self.reg_tcg()}, {self.reg_num});
Do you need this read if it's a destination register?
> + """))
> + def log_write(self, f, tag):
> + f.write(code_fmt(f"""\
> + gen_log_greg_write(ctx, {self.reg_num}, {self.reg_tcg()});
> + """))
> + def analyze_write(self, f, tag, regno):
> + f.write(code_fmt(f"""\
> + ctx_log_greg_write(ctx, {self.reg_num});
> + """))
> +
> +class GuestSource(GuestRegister, Single, OldSource):
> + 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 {self.reg_tcg()} = tcg_temp_new();
> + gen_read_greg({self.reg_tcg()}, {self.reg_num});
> + """))
> +
> +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();
> + gen_read_greg_pair({self.reg_tcg()}, {self.reg_num});
Read needed?
> + """))
> + def log_write(self, f, tag):
> + f.write(code_fmt(f"""\
> + gen_log_greg_write_pair(ctx, {self.reg_num}, {self.reg_tcg()});
> + """))
> + def analyze_write(self, f, tag, regno):
> + f.write(code_fmt(f"""\
> + ctx_log_greg_write_pair(ctx, {self.reg_num});
> + """))
> +
> +class GuestPairSource(GuestRegister, Pair, OldSource):
> + 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});
> + """))
> +
> +class SystemDest(Register, Single, Dest):
> + def decl_tcg(self, f, tag, regno):
> + self.decl_reg_num(f, regno)
> + f.write(code_fmt(f"""\
> + TCGv {self.reg_tcg()} = tcg_temp_new();
> + gen_read_sreg({self.reg_tcg()}, {self.reg_num});
Read needed?
> + """))
> + def log_write(self, f, tag):
> + f.write(code_fmt(f"""\
> + gen_log_sreg_write(ctx, {self.reg_num}, {self.reg_tcg()});
> + """))
> + def analyze_write(self, f, tag, regno):
> + f.write(code_fmt(f"""\
> + ctx_log_sreg_write(ctx, {self.reg_num});
> + """))
> +
> +class SystemSource(Register, Single, OldSource):
> + def decl_tcg(self, f, tag, regno):
> + self.decl_reg_num(f, regno);
> + f.write(code_fmt(f"""\
> + TCGv {self.reg_tcg()} = tcg_temp_new();
> + gen_read_sreg({self.reg_tcg()}, {self.reg_num});
> + """))
> +
> +class SystemPairDest(Register, Pair, Dest):
> + def decl_tcg(self, f, tag, regno):
> + self.decl_reg_num(f, regno)
> + f.write(code_fmt(f"""\
> + TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64();
> + gen_read_sreg_pair({self.reg_tcg()}, {self.reg_num});
Read needed?
> + """))
> + def log_write(self, f, tag):
> + f.write(code_fmt(f"""\
> + gen_log_sreg_write_pair(ctx, {self.reg_num}, {self.reg_tcg()});
> + """))
> + def analyze_write(self, f, tag, regno):
> + f.write(code_fmt(f"""\
> + ctx_log_sreg_write_pair(ctx, {self.reg_num});
> + """))
> +
> +class SystemPairSource(Register, Pair, OldSource):
> + def decl_tcg(self, f, tag, regno):
> + self.decl_reg_num(f, regno)
> + f.write(code_fmt(f"""\
> + TCGv_i64 {self.reg_tcg()} = tcg_temp_new_i64();
> + gen_read_sreg_pair({self.reg_tcg()}, {self.reg_num});
> + """))
> +