Message ID | 20250127102620.39159-8-philmd@linaro.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | target/ppc: Move TCG code from excp_helper.c to tcg-excp_helper.c | expand |
On 1/27/25 15:56, Philippe Mathieu-Daudé wrote: > Expose powerpc_checkstop() prototype, and move it to > tcg-excp_helper.c, only built when TCG is available. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com> > --- > target/ppc/internal.h | 4 +++- > target/ppc/excp_helper.c | 26 -------------------------- > target/ppc/tcg-excp_helper.c | 28 ++++++++++++++++++++++++++++ > 3 files changed, 31 insertions(+), 27 deletions(-) > > diff --git a/target/ppc/internal.h b/target/ppc/internal.h > index 46db6adfcf6..62186bc1e61 100644 > --- a/target/ppc/internal.h > +++ b/target/ppc/internal.h > @@ -289,7 +289,9 @@ void ppc_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, > void ppc_cpu_debug_excp_handler(CPUState *cs); > bool ppc_cpu_debug_check_breakpoint(CPUState *cs); > bool ppc_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp); > -#endif > + > +G_NORETURN void powerpc_checkstop(CPUPPCState *env, const char *reason); > +#endif /* !CONFIG_USER_ONLY */ > > FIELD(GER_MSK, XMSK, 0, 4) > FIELD(GER_MSK, YMSK, 4, 4) > diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c > index b08cd53688c..236e5078f56 100644 > --- a/target/ppc/excp_helper.c > +++ b/target/ppc/excp_helper.c > @@ -400,32 +400,6 @@ static void powerpc_set_excp_state(PowerPCCPU *cpu, target_ulong vector, > } > > #ifdef CONFIG_TCG > -/* > - * This stops the machine and logs CPU state without killing QEMU (like > - * cpu_abort()) because it is often a guest error as opposed to a QEMU error, > - * so the machine can still be debugged. > - */ > -static G_NORETURN void powerpc_checkstop(CPUPPCState *env, const char *reason) > -{ > - CPUState *cs = env_cpu(env); > - FILE *f; > - > - f = qemu_log_trylock(); > - if (f) { > - fprintf(f, "Entering checkstop state: %s\n", reason); > - cpu_dump_state(cs, f, CPU_DUMP_FPU | CPU_DUMP_CCOP); > - qemu_log_unlock(f); > - } > - > - /* > - * This stops the machine and logs CPU state without killing QEMU > - * (like cpu_abort()) so the machine can still be debugged (because > - * it is often a guest error). > - */ > - qemu_system_guest_panicked(NULL); > - cpu_loop_exit_noexc(cs); > -} > - > #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) > void helper_attn(CPUPPCState *env) > { > diff --git a/target/ppc/tcg-excp_helper.c b/target/ppc/tcg-excp_helper.c > index 6950b78774d..93c2d6b5a03 100644 > --- a/target/ppc/tcg-excp_helper.c > +++ b/target/ppc/tcg-excp_helper.c > @@ -17,7 +17,9 @@ > * License along with this library; if not, see <http://www.gnu.org/licenses/>. > */ > #include "qemu/osdep.h" > +#include "qemu/log.h" > #include "exec/cpu_ldst.h" > +#include "system/runstate.h" > > #include "hw/ppc/ppc.h" > #include "internal.h" > @@ -199,6 +201,32 @@ bool ppc_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp) > return false; > } > > +/* > + * This stops the machine and logs CPU state without killing QEMU (like > + * cpu_abort()) because it is often a guest error as opposed to a QEMU error, > + * so the machine can still be debugged. > + */ > +G_NORETURN void powerpc_checkstop(CPUPPCState *env, const char *reason) > +{ > + CPUState *cs = env_cpu(env); > + FILE *f; > + > + f = qemu_log_trylock(); > + if (f) { > + fprintf(f, "Entering checkstop state: %s\n", reason); > + cpu_dump_state(cs, f, CPU_DUMP_FPU | CPU_DUMP_CCOP); > + qemu_log_unlock(f); > + } > + > + /* > + * This stops the machine and logs CPU state without killing QEMU > + * (like cpu_abort()) so the machine can still be debugged (because > + * it is often a guest error). > + */ > + qemu_system_guest_panicked(NULL); > + cpu_loop_exit_noexc(cs); > +} > + > /* Return true iff byteswap is needed to load instruction */ > static inline bool insn_need_byteswap(CPUArchState *env) > {
diff --git a/target/ppc/internal.h b/target/ppc/internal.h index 46db6adfcf6..62186bc1e61 100644 --- a/target/ppc/internal.h +++ b/target/ppc/internal.h @@ -289,7 +289,9 @@ void ppc_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, void ppc_cpu_debug_excp_handler(CPUState *cs); bool ppc_cpu_debug_check_breakpoint(CPUState *cs); bool ppc_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp); -#endif + +G_NORETURN void powerpc_checkstop(CPUPPCState *env, const char *reason); +#endif /* !CONFIG_USER_ONLY */ FIELD(GER_MSK, XMSK, 0, 4) FIELD(GER_MSK, YMSK, 4, 4) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index b08cd53688c..236e5078f56 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -400,32 +400,6 @@ static void powerpc_set_excp_state(PowerPCCPU *cpu, target_ulong vector, } #ifdef CONFIG_TCG -/* - * This stops the machine and logs CPU state without killing QEMU (like - * cpu_abort()) because it is often a guest error as opposed to a QEMU error, - * so the machine can still be debugged. - */ -static G_NORETURN void powerpc_checkstop(CPUPPCState *env, const char *reason) -{ - CPUState *cs = env_cpu(env); - FILE *f; - - f = qemu_log_trylock(); - if (f) { - fprintf(f, "Entering checkstop state: %s\n", reason); - cpu_dump_state(cs, f, CPU_DUMP_FPU | CPU_DUMP_CCOP); - qemu_log_unlock(f); - } - - /* - * This stops the machine and logs CPU state without killing QEMU - * (like cpu_abort()) so the machine can still be debugged (because - * it is often a guest error). - */ - qemu_system_guest_panicked(NULL); - cpu_loop_exit_noexc(cs); -} - #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) void helper_attn(CPUPPCState *env) { diff --git a/target/ppc/tcg-excp_helper.c b/target/ppc/tcg-excp_helper.c index 6950b78774d..93c2d6b5a03 100644 --- a/target/ppc/tcg-excp_helper.c +++ b/target/ppc/tcg-excp_helper.c @@ -17,7 +17,9 @@ * License along with this library; if not, see <http://www.gnu.org/licenses/>. */ #include "qemu/osdep.h" +#include "qemu/log.h" #include "exec/cpu_ldst.h" +#include "system/runstate.h" #include "hw/ppc/ppc.h" #include "internal.h" @@ -199,6 +201,32 @@ bool ppc_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp) return false; } +/* + * This stops the machine and logs CPU state without killing QEMU (like + * cpu_abort()) because it is often a guest error as opposed to a QEMU error, + * so the machine can still be debugged. + */ +G_NORETURN void powerpc_checkstop(CPUPPCState *env, const char *reason) +{ + CPUState *cs = env_cpu(env); + FILE *f; + + f = qemu_log_trylock(); + if (f) { + fprintf(f, "Entering checkstop state: %s\n", reason); + cpu_dump_state(cs, f, CPU_DUMP_FPU | CPU_DUMP_CCOP); + qemu_log_unlock(f); + } + + /* + * This stops the machine and logs CPU state without killing QEMU + * (like cpu_abort()) so the machine can still be debugged (because + * it is often a guest error). + */ + qemu_system_guest_panicked(NULL); + cpu_loop_exit_noexc(cs); +} + /* Return true iff byteswap is needed to load instruction */ static inline bool insn_need_byteswap(CPUArchState *env) {
Expose powerpc_checkstop() prototype, and move it to tcg-excp_helper.c, only built when TCG is available. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- target/ppc/internal.h | 4 +++- target/ppc/excp_helper.c | 26 -------------------------- target/ppc/tcg-excp_helper.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 27 deletions(-)