From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [PULL 15/24] cpu: Turn cpu_dump_{state,statistics}() into CPUState hooks Date: Fri, 28 Jun 2013 17:55:37 +0200 Message-ID: <1372434946-18489-16-git-send-email-afaerber@suse.de> References: <1372434946-18489-1-git-send-email-afaerber@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= , Blue Swirl , Gleb Natapov , Marcelo Tosatti , Riku Voipio , Luiz Capitulino , Richard Henderson , Paul Brook , Peter Maydell , "Edgar E. Iglesias" , Michael Walle , Aurelien Jarno , Anthony Green , Alexander Graf , Guan Xuetao , Max Filippov , kvm@vger.kernel.org (open list:Overall), qemu-ppc@nongnu.org (open list:PowerPC) To: qemu-devel@nongnu.org Return-path: Received: from cantor2.suse.de ([195.135.220.15]:44159 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755449Ab3F1P4E (ORCPT ); Fri, 28 Jun 2013 11:56:04 -0400 In-Reply-To: <1372434946-18489-1-git-send-email-afaerber@suse.de> Sender: kvm-owner@vger.kernel.org List-ID: Make cpustats monitor command available unconditionally. Prepares for changing kvm_handle_internal_error() and kvm_cpu_exec() arguments to CPUState. Signed-off-by: Andreas F=C3=A4rber --- bsd-user/main.c | 3 ++- cpus.c | 2 +- exec.c | 3 ++- include/exec/cpu-all.h | 10 ---------- include/qemu/log.h | 2 +- include/qom/cpu.h | 42 +++++++++++++++++++++++++++++++++++= +++++++ kvm-all.c | 4 ++-- linux-user/main.c | 38 +++++++++++++++++++++++------------= --- monitor.c | 13 ++++++------- qom/cpu.c | 22 +++++++++++++++++++++- stubs/cpus.c | 1 + target-alpha/cpu-qom.h | 2 ++ target-alpha/cpu.c | 1 + target-alpha/helper.c | 6 ++++-- target-arm/arm-semi.c | 3 ++- target-arm/cpu-qom.h | 3 +++ target-arm/cpu.c | 1 + target-arm/translate.c | 6 ++++-- target-cris/cpu-qom.h | 3 +++ target-cris/cpu.c | 1 + target-cris/helper.c | 4 +++- target-cris/translate.c | 6 ++++-- target-i386/cpu-qom.h | 3 +++ target-i386/cpu.c | 1 + target-i386/helper.c | 7 ++++--- target-lm32/cpu-qom.h | 2 ++ target-lm32/cpu.c | 1 + target-lm32/translate.c | 6 ++++-- target-m68k/cpu-qom.h | 2 ++ target-m68k/cpu.c | 1 + target-m68k/translate.c | 6 ++++-- target-microblaze/cpu-qom.h | 2 ++ target-microblaze/cpu.c | 1 + target-microblaze/helper.c | 4 +++- target-microblaze/translate.c | 6 ++++-- target-mips/cpu-qom.h | 2 ++ target-mips/cpu.c | 1 + target-mips/translate.c | 6 ++++-- target-moxie/cpu.c | 3 ++- target-moxie/cpu.h | 2 ++ target-moxie/helper.c | 4 +++- target-moxie/translate.c | 6 ++++-- target-openrisc/cpu.c | 1 + target-openrisc/cpu.h | 2 ++ target-openrisc/translate.c | 12 +++++++----- target-ppc/cpu-qom.h | 4 ++++ target-ppc/translate.c | 15 +++++++++------ target-ppc/translate_init.c | 2 ++ target-s390x/cpu-qom.h | 2 ++ target-s390x/cpu.c | 1 + target-s390x/translate.c | 6 ++++-- target-sh4/cpu-qom.h | 2 ++ target-sh4/cpu.c | 1 + target-sh4/translate.c | 7 ++++--- target-sparc/cpu-qom.h | 2 ++ target-sparc/cpu.c | 7 +++++-- target-unicore32/cpu-qom.h | 2 ++ target-unicore32/cpu.c | 1 + target-unicore32/translate.c | 6 ++++-- target-xtensa/cpu-qom.h | 2 ++ target-xtensa/cpu.c | 1 + target-xtensa/op_helper.c | 4 +++- target-xtensa/translate.c | 6 ++++-- 63 files changed, 242 insertions(+), 86 deletions(-) diff --git a/bsd-user/main.c b/bsd-user/main.c index 572f13a..75dbd7f 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -511,6 +511,7 @@ static void flush_windows(CPUSPARCState *env) =20 void cpu_loop(CPUSPARCState *env) { + CPUState *cs =3D CPU(sparc_env_get_cpu(env)); int trapnr, ret, syscall_nr; //target_siginfo_t info; =20 @@ -659,7 +660,7 @@ void cpu_loop(CPUSPARCState *env) badtrap: #endif printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); diff --git a/cpus.c b/cpus.c index 40bf64c..4c7e329 100644 --- a/cpus.c +++ b/cpus.c @@ -397,7 +397,7 @@ void hw_error(const char *fmt, ...) for (env =3D first_cpu; env !=3D NULL; env =3D env->next_cpu) { cpu =3D ENV_GET_CPU(env); fprintf(stderr, "CPU #%d:\n", cpu->cpu_index); - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_FPU); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU); } va_end(ap); abort(); diff --git a/exec.c b/exec.c index 2d02b11..c49806c 100644 --- a/exec.c +++ b/exec.c @@ -600,6 +600,7 @@ void cpu_single_step(CPUArchState *env, int enabled= ) =20 void cpu_abort(CPUArchState *env, const char *fmt, ...) { + CPUState *cpu =3D ENV_GET_CPU(env); va_list ap; va_list ap2; =20 @@ -608,7 +609,7 @@ void cpu_abort(CPUArchState *env, const char *fmt, = =2E..) fprintf(stderr, "qemu: fatal: "); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP)= ; + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP)= ; if (qemu_log_enabled()) { qemu_log("qemu: fatal: "); qemu_log_vprintf(fmt, ap2); diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index e1cc62e..35bdf85 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -355,16 +355,6 @@ int page_check_range(target_ulong start, target_ul= ong len, int flags); =20 CPUArchState *cpu_copy(CPUArchState *env); =20 -#define CPU_DUMP_CODE 0x00010000 -#define CPU_DUMP_FPU 0x00020000 /* dump FPU register state, not just i= nteger */ -/* dump info about TCG QEMU's condition code optimization state */ -#define CPU_DUMP_CCOP 0x00040000 - -void cpu_dump_state(CPUArchState *env, FILE *f, fprintf_function cpu_f= printf, - int flags); -void cpu_dump_statistics(CPUArchState *env, FILE *f, fprintf_function = cpu_fprintf, - int flags); - void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...) GCC_FMT_ATTR(2, 3); extern CPUArchState *first_cpu; diff --git a/include/qemu/log.h b/include/qemu/log.h index fd76f91..a9cf214 100644 --- a/include/qemu/log.h +++ b/include/qemu/log.h @@ -75,7 +75,7 @@ void GCC_FMT_ATTR(2, 3) qemu_log_mask(int mask, const= char *fmt, ...); static inline void log_cpu_state(CPUArchState *env1, int flags) { if (qemu_log_enabled()) { - cpu_dump_state(env1, qemu_logfile, fprintf, flags); + cpu_dump_state(ENV_GET_CPU(env1), qemu_logfile, fprintf, flags= ); } } =20 diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 3494356..12b5099 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -48,6 +48,8 @@ typedef struct CPUState CPUState; * instantiatable CPU type. * @reset: Callback to reset the #CPUState to its initial state. * @do_interrupt: Callback for interrupt handling. + * @dump_state: Callback for dumping state. + * @dump_statistics: Callback for dumping statistics. * @get_arch_id: Callback for getting architecture-dependent CPU ID. * @get_paging_enabled: Callback for inquiring whether paging is enabl= ed. * @get_memory_mapping: Callback for obtaining the memory mappings. @@ -64,6 +66,10 @@ typedef struct CPUClass { =20 void (*reset)(CPUState *cpu); void (*do_interrupt)(CPUState *cpu); + void (*dump_state)(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); + void (*dump_statistics)(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); int64_t (*get_arch_id)(CPUState *cpu); bool (*get_paging_enabled)(const CPUState *cpu); void (*get_memory_mapping)(CPUState *cpu, MemoryMappingList *list, @@ -201,6 +207,42 @@ int cpu_write_elf32_qemunote(WriteCoreDumpFunction= f, CPUState *cpu, void *opaque); =20 /** + * CPUDumpFlags: + * @CPU_DUMP_CODE: + * @CPU_DUMP_FPU: dump FPU register state, not just integer + * @CPU_DUMP_CCOP: dump info about TCG QEMU's condition code optimizat= ion state + */ +enum CPUDumpFlags { + CPU_DUMP_CODE =3D 0x00010000, + CPU_DUMP_FPU =3D 0x00020000, + CPU_DUMP_CCOP =3D 0x00040000, +}; + +/** + * cpu_dump_state: + * @cpu: The CPU whose state is to be dumped. + * @f: File to dump to. + * @cpu_fprintf: Function to dump with. + * @flags: Flags what to dump. + * + * Dumps CPU state. + */ +void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprin= tf, + int flags); + +/** + * cpu_dump_statistics: + * @cpu: The CPU whose state is to be dumped. + * @f: File to dump to. + * @cpu_fprintf: Function to dump with. + * @flags: Flags what to dump. + * + * Dumps CPU statistics. + */ +void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_= fprintf, + int flags); + +/** * cpu_reset: * @cpu: The CPU whose state is to be reset. */ diff --git a/kvm-all.c b/kvm-all.c index f1031e0..bab04c9 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1544,7 +1544,7 @@ static int kvm_handle_internal_error(CPUArchState= *env, struct kvm_run *run) if (run->internal.suberror =3D=3D KVM_INTERNAL_ERROR_EMULATION) { fprintf(stderr, "emulation failure\n"); if (!kvm_arch_stop_on_emulation_error(cpu)) { - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_CODE); return EXCP_INTERRUPT; } } @@ -1700,7 +1700,7 @@ int kvm_cpu_exec(CPUArchState *env) } while (ret =3D=3D 0); =20 if (ret < 0) { - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_CODE); vm_stop(RUN_STATE_INTERNAL_ERROR); } =20 diff --git a/linux-user/main.c b/linux-user/main.c index f67a62b..af82db8 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -901,7 +901,7 @@ void cpu_loop(CPUARMState *env) error: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - abor= ting\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } process_pending_signals(env); @@ -985,7 +985,7 @@ void cpu_loop(CPUUniCore32State *env) =20 error: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",= trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } #endif @@ -1115,6 +1115,7 @@ static void flush_windows(CPUSPARCState *env) =20 void cpu_loop (CPUSPARCState *env) { + CPUState *cs =3D CPU(sparc_env_get_cpu(env)); int trapnr; abi_long ret; target_siginfo_t info; @@ -1246,7 +1247,7 @@ void cpu_loop (CPUSPARCState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -1304,7 +1305,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, = uint32_t val) #define EXCP_DUMP(env, fmt, ...) = \ do { = \ fprintf(stderr, fmt , ## __VA_ARGS__); = \ - cpu_dump_state(env, stderr, fprintf, 0); = \ + cpu_dump_state(ENV_GET_CPU(env), stderr, fprintf, 0); = \ qemu_log(fmt, ## __VA_ARGS__); = \ if (qemu_log_enabled()) { = \ log_cpu_state(env, 0); = \ @@ -2391,7 +2392,7 @@ done_syscall: error: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - abor= ting\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } process_pending_signals(env); @@ -2403,6 +2404,7 @@ error: =20 void cpu_loop(CPUOpenRISCState *env) { + CPUState *cs =3D CPU(openrisc_env_get_cpu(env)); int trapnr, gdbsig; =20 for (;;) { @@ -2420,7 +2422,7 @@ void cpu_loop(CPUOpenRISCState *env) break; case EXCP_DPF: case EXCP_IPF: - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); gdbsig =3D TARGET_SIGSEGV; break; case EXCP_TICK: @@ -2469,7 +2471,7 @@ void cpu_loop(CPUOpenRISCState *env) default: qemu_log("\nqemu: unhandled CPU exception %#x - aborting\n= ", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); gdbsig =3D TARGET_SIGILL; break; } @@ -2489,6 +2491,7 @@ void cpu_loop(CPUOpenRISCState *env) #ifdef TARGET_SH4 void cpu_loop(CPUSH4State *env) { + CPUState *cs =3D CPU(sh_env_get_cpu(env)); int trapnr, ret; target_siginfo_t info; =20 @@ -2537,7 +2540,7 @@ void cpu_loop(CPUSH4State *env) =20 default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -2548,6 +2551,7 @@ void cpu_loop(CPUSH4State *env) #ifdef TARGET_CRIS void cpu_loop(CPUCRISState *env) { + CPUState *cs =3D CPU(cris_env_get_cpu(env)); int trapnr, ret; target_siginfo_t info; =20 @@ -2595,7 +2599,7 @@ void cpu_loop(CPUCRISState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -2606,6 +2610,7 @@ void cpu_loop(CPUCRISState *env) #ifdef TARGET_MICROBLAZE void cpu_loop(CPUMBState *env) { + CPUState *cs =3D CPU(mb_env_get_cpu(env)); int trapnr, ret; target_siginfo_t info; =20 @@ -2673,7 +2678,7 @@ void cpu_loop(CPUMBState *env) default: printf ("Unhandled hw-exception: 0x%x\n", env->sregs[SR_ESR] & ESR_EC_MASK); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); break; } @@ -2694,7 +2699,7 @@ void cpu_loop(CPUMBState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -2706,6 +2711,7 @@ void cpu_loop(CPUMBState *env) =20 void cpu_loop(CPUM68KState *env) { + CPUState *cs =3D CPU(m68k_env_get_cpu(env)); int trapnr; unsigned int n; target_siginfo_t info; @@ -2787,7 +2793,7 @@ void cpu_loop(CPUM68KState *env) default: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - abor= ting\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } process_pending_signals(env); @@ -2843,6 +2849,7 @@ static void do_store_exclusive(CPUAlphaState *env= , int reg, int quad) =20 void cpu_loop(CPUAlphaState *env) { + CPUState *cs =3D CPU(alpha_env_get_cpu(env)); int trapnr; target_siginfo_t info; abi_long sysret; @@ -3017,7 +3024,7 @@ void cpu_loop(CPUAlphaState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -3028,6 +3035,7 @@ void cpu_loop(CPUAlphaState *env) #ifdef TARGET_S390X void cpu_loop(CPUS390XState *env) { + CPUState *cs =3D CPU(s390_env_get_cpu(env)); int trapnr, n, sig; target_siginfo_t info; target_ulong addr; @@ -3118,7 +3126,7 @@ void cpu_loop(CPUS390XState *env) =20 default: fprintf(stderr, "Unhandled program exception: %#x\n", = n); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit(1); } break; @@ -3135,7 +3143,7 @@ void cpu_loop(CPUS390XState *env) =20 default: fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit(1); } process_pending_signals (env); diff --git a/monitor.c b/monitor.c index 19c297d..9be515c 100644 --- a/monitor.c +++ b/monitor.c @@ -921,9 +921,11 @@ int monitor_get_cpu_index(void) =20 static void do_info_registers(Monitor *mon, const QDict *qdict) { + CPUState *cpu; CPUArchState *env; env =3D mon_get_cpu(); - cpu_dump_state(env, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); + cpu =3D ENV_GET_CPU(env); + cpu_dump_state(cpu, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); } =20 static void do_info_jit(Monitor *mon, const QDict *qdict) @@ -948,16 +950,15 @@ static void do_info_history(Monitor *mon, const Q= Dict *qdict) } } =20 -#if defined(TARGET_PPC) -/* XXX: not implemented in other targets */ static void do_info_cpu_stats(Monitor *mon, const QDict *qdict) { + CPUState *cpu; CPUArchState *env; =20 env =3D mon_get_cpu(); - cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0); + cpu =3D ENV_GET_CPU(env); + cpu_dump_statistics(cpu, (FILE *)mon, &monitor_fprintf, 0); } -#endif =20 static void do_trace_print_events(Monitor *mon, const QDict *qdict) { @@ -2678,7 +2679,6 @@ static mon_cmd_t info_cmds[] =3D { .help =3D "show the current VM UUID", .mhandler.cmd =3D hmp_info_uuid, }, -#if defined(TARGET_PPC) { .name =3D "cpustats", .args_type =3D "", @@ -2686,7 +2686,6 @@ static mon_cmd_t info_cmds[] =3D { .help =3D "show CPU statistics", .mhandler.cmd =3D do_info_cpu_stats, }, -#endif #if defined(CONFIG_SLIRP) { .name =3D "usernet", diff --git a/qom/cpu.c b/qom/cpu.c index 8a122b0..4da6332 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -18,8 +18,8 @@ * */ =20 -#include "qom/cpu.h" #include "qemu-common.h" +#include "qom/cpu.h" #include "sysemu/kvm.h" #include "qemu/notify.h" #include "sysemu/sysemu.h" @@ -156,6 +156,26 @@ static int cpu_common_write_elf64_note(WriteCoreDu= mpFunction f, } =20 =20 +void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprin= tf, + int flags) +{ + CPUClass *cc =3D CPU_GET_CLASS(cpu); + + if (cc->dump_state) { + cc->dump_state(cpu, f, cpu_fprintf, flags); + } +} + +void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_= fprintf, + int flags) +{ + CPUClass *cc =3D CPU_GET_CLASS(cpu); + + if (cc->dump_statistics) { + cc->dump_statistics(cpu, f, cpu_fprintf, flags); + } +} + void cpu_reset(CPUState *cpu) { CPUClass *klass =3D CPU_GET_CLASS(cpu); diff --git a/stubs/cpus.c b/stubs/cpus.c index 37000dd..f0d56c5 100644 --- a/stubs/cpus.c +++ b/stubs/cpus.c @@ -1,3 +1,4 @@ +#include "qemu-common.h" #include "qom/cpu.h" =20 void cpu_resume(CPUState *cpu) diff --git a/target-alpha/cpu-qom.h b/target-alpha/cpu-qom.h index ee10ed6..94e4a54 100644 --- a/target-alpha/cpu-qom.h +++ b/target-alpha/cpu-qom.h @@ -79,5 +79,7 @@ extern const struct VMStateDescription vmstate_alpha_= cpu; #endif =20 void alpha_cpu_do_interrupt(CPUState *cpu); +void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_= fprintf, + int flags); =20 #endif diff --git a/target-alpha/cpu.c b/target-alpha/cpu.c index 8252cea..7d7fdab 100644 --- a/target-alpha/cpu.c +++ b/target-alpha/cpu.c @@ -265,6 +265,7 @@ static void alpha_cpu_class_init(ObjectClass *oc, v= oid *data) =20 cc->class_by_name =3D alpha_cpu_class_by_name; cc->do_interrupt =3D alpha_cpu_do_interrupt; + cc->dump_state =3D alpha_cpu_dump_state; device_class_set_vmsd(dc, &vmstate_alpha_cpu); } =20 diff --git a/target-alpha/helper.c b/target-alpha/helper.c index 5741ec2..ff57dd6 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -464,8 +464,8 @@ void alpha_cpu_do_interrupt(CPUState *cs) #endif /* !USER_ONLY */ } =20 -void cpu_dump_state (CPUAlphaState *env, FILE *f, fprintf_function cpu= _fprintf, - int flags) +void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_= fprintf, + int flags) { static const char *linux_reg_names[] =3D { "v0 ", "t0 ", "t1 ", "t2 ", "t3 ", "t4 ", "t5 ", "t6 ", @@ -473,6 +473,8 @@ void cpu_dump_state (CPUAlphaState *env, FILE *f, f= printf_function cpu_fprintf, "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "t8 ", "t9 ", "t10", "t11", "ra ", "t12", "at ", "gp ", "sp ", "zero", }; + AlphaCPU *cpu =3D ALPHA_CPU(cs); + CPUAlphaState *env =3D &cpu->env; int i; =20 cpu_fprintf(f, " PC " TARGET_FMT_lx " PS %02x\n", diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c index f0637a4..5f01bca 100644 --- a/target-arm/arm-semi.c +++ b/target-arm/arm-semi.c @@ -178,6 +178,7 @@ static void arm_semi_flen_cb(CPUARMState *env, targ= et_ulong ret, target_ulong er #define SET_ARG(n, val) put_user_ual(val, args + (n) * 4) uint32_t do_arm_semihosting(CPUARMState *env) { + ARMCPU *cpu =3D arm_env_get_cpu(env); target_ulong args; target_ulong arg0, arg1, arg2, arg3; char * s; @@ -549,7 +550,7 @@ uint32_t do_arm_semihosting(CPUARMState *env) exit(0); default: fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", = nr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); abort(); } } diff --git a/target-arm/cpu-qom.h b/target-arm/cpu-qom.h index 25239b8..ef6261f 100644 --- a/target-arm/cpu-qom.h +++ b/target-arm/cpu-qom.h @@ -144,4 +144,7 @@ void init_cpreg_list(ARMCPU *cpu); void arm_cpu_do_interrupt(CPUState *cpu); void arm_v7m_cpu_do_interrupt(CPUState *cpu); =20 +void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags); + #endif diff --git a/target-arm/cpu.c b/target-arm/cpu.c index 2371f48..645c961 100644 --- a/target-arm/cpu.c +++ b/target-arm/cpu.c @@ -816,6 +816,7 @@ static void arm_cpu_class_init(ObjectClass *oc, voi= d *data) =20 cc->class_by_name =3D arm_cpu_class_by_name; cc->do_interrupt =3D arm_cpu_do_interrupt; + cc->dump_state =3D arm_cpu_dump_state; cpu_class_set_vmsd(cc, &vmstate_arm_cpu); } =20 diff --git a/target-arm/translate.c b/target-arm/translate.c index 2a18ffe..af2aef2 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -10085,9 +10085,11 @@ static const char *cpu_mode_names[16] =3D { "???", "???", "???", "und", "???", "???", "???", "sys" }; =20 -void cpu_dump_state(CPUARMState *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags) { + ARMCPU *cpu =3D ARM_CPU(cs); + CPUARMState *env =3D &cpu->env; int i; uint32_t psr; =20 diff --git a/target-cris/cpu-qom.h b/target-cris/cpu-qom.h index 03829bd..e08bdb1 100644 --- a/target-cris/cpu-qom.h +++ b/target-cris/cpu-qom.h @@ -76,4 +76,7 @@ static inline CRISCPU *cris_env_get_cpu(CPUCRISState = *env) void cris_cpu_do_interrupt(CPUState *cpu); void crisv10_cpu_do_interrupt(CPUState *cpu); =20 +void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_f= printf, + int flags); + #endif diff --git a/target-cris/cpu.c b/target-cris/cpu.c index 67181e5..82271f7 100644 --- a/target-cris/cpu.c +++ b/target-cris/cpu.c @@ -252,6 +252,7 @@ static void cris_cpu_class_init(ObjectClass *oc, vo= id *data) =20 cc->class_by_name =3D cris_cpu_class_by_name; cc->do_interrupt =3D cris_cpu_do_interrupt; + cc->dump_state =3D cris_cpu_dump_state; } =20 static const TypeInfo cris_cpu_type_info =3D { diff --git a/target-cris/helper.c b/target-cris/helper.c index 466cc2f..aba7537 100644 --- a/target-cris/helper.c +++ b/target-cris/helper.c @@ -53,9 +53,11 @@ void crisv10_cpu_do_interrupt(CPUState *cs) int cpu_cris_handle_mmu_fault(CPUCRISState * env, target_ulong address= , int rw, int mmu_idx) { + CRISCPU *cpu =3D cris_env_get_cpu(env); + env->exception_index =3D 0xaa; env->pregs[PR_EDA] =3D address; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); return 1; } =20 diff --git a/target-cris/translate.c b/target-cris/translate.c index dbcb811..09d0d2b 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -3427,9 +3427,11 @@ void gen_intermediate_code_pc (CPUCRISState *env= , struct TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state (CPUCRISState *env, FILE *f, fprintf_function cpu_= fprintf, - int flags) +void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_f= printf, + int flags) { + CRISCPU *cpu =3D CRIS_CPU(cs); + CPUCRISState *env =3D &cpu->env; int i; uint32_t srs; =20 diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index e0ac072..b7c70d6 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -101,4 +101,7 @@ int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunct= ion f, CPUState *cpu, void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list= , Error **errp); =20 +void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags); + #endif diff --git a/target-i386/cpu.c b/target-i386/cpu.c index a7154af..48c062f 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2526,6 +2526,7 @@ static void x86_cpu_common_class_init(ObjectClass= *oc, void *data) cc->reset =3D x86_cpu_reset; =20 cc->do_interrupt =3D x86_cpu_do_interrupt; + cc->dump_state =3D x86_cpu_dump_state; cc->get_arch_id =3D x86_cpu_get_arch_id; cc->get_paging_enabled =3D x86_cpu_get_paging_enabled; #ifndef CONFIG_USER_ONLY diff --git a/target-i386/helper.c b/target-i386/helper.c index 803945d..5e5abe3 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -179,10 +179,11 @@ done: #define DUMP_CODE_BYTES_TOTAL 50 #define DUMP_CODE_BYTES_BACKWARD 20 =20 -void cpu_dump_state(CPUX86State *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags) { - CPUState *cs =3D CPU(x86_env_get_cpu(env)); + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; int eflags, i, nb; char cc_op_name[32]; static const char *seg_name[6] =3D { "ES", "CS", "SS", "DS", "FS",= "GS" }; diff --git a/target-lm32/cpu-qom.h b/target-lm32/cpu-qom.h index 9571860..5ef884b 100644 --- a/target-lm32/cpu-qom.h +++ b/target-lm32/cpu-qom.h @@ -76,5 +76,7 @@ extern const struct VMStateDescription vmstate_lm32_c= pu; #endif =20 void lm32_cpu_do_interrupt(CPUState *cpu); +void lm32_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_= fprintf, + int flags); =20 #endif diff --git a/target-lm32/cpu.c b/target-lm32/cpu.c index 23c05dd..2366152 100644 --- a/target-lm32/cpu.c +++ b/target-lm32/cpu.c @@ -85,6 +85,7 @@ static void lm32_cpu_class_init(ObjectClass *oc, void= *data) cc->reset =3D lm32_cpu_reset; =20 cc->do_interrupt =3D lm32_cpu_do_interrupt; + cc->dump_state =3D lm32_cpu_dump_state; cpu_class_set_vmsd(cc, &vmstate_lm32_cpu); } =20 diff --git a/target-lm32/translate.c b/target-lm32/translate.c index af9ce8c..227a801 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -1141,9 +1141,11 @@ void gen_intermediate_code_pc(CPULM32State *env,= struct TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state(CPULM32State *env, FILE *f, fprintf_function cpu_f= printf, - int flags) +void lm32_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_f= printf, + int flags) { + LM32CPU *cpu =3D LM32_CPU(cs); + CPULM32State *env =3D &cpu->env; int i; =20 if (!env || !f) { diff --git a/target-m68k/cpu-qom.h b/target-m68k/cpu-qom.h index 846aa74..2436c13 100644 --- a/target-m68k/cpu-qom.h +++ b/target-m68k/cpu-qom.h @@ -71,5 +71,7 @@ static inline M68kCPU *m68k_env_get_cpu(CPUM68KState = *env) #define ENV_OFFSET offsetof(M68kCPU, env) =20 void m68k_cpu_do_interrupt(CPUState *cpu); +void m68k_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_= fprintf, + int flags); =20 #endif diff --git a/target-m68k/cpu.c b/target-m68k/cpu.c index 3c65b4e..d501027 100644 --- a/target-m68k/cpu.c +++ b/target-m68k/cpu.c @@ -187,6 +187,7 @@ static void m68k_cpu_class_init(ObjectClass *c, voi= d *data) =20 cc->class_by_name =3D m68k_cpu_class_by_name; cc->do_interrupt =3D m68k_cpu_do_interrupt; + cc->dump_state =3D m68k_cpu_dump_state; dc->vmsd =3D &vmstate_m68k_cpu; } =20 diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 32b8132..3752094 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3104,9 +3104,11 @@ void gen_intermediate_code_pc(CPUM68KState *env,= TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state(CPUM68KState *env, FILE *f, fprintf_function cpu_f= printf, - int flags) +void m68k_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_f= printf, + int flags) { + M68kCPU *cpu =3D M68K_CPU(cs); + CPUM68KState *env =3D &cpu->env; int i; uint16_t sr; CPU_DoubleU u; diff --git a/target-microblaze/cpu-qom.h b/target-microblaze/cpu-qom.h index ce92a4e..3e9c206 100644 --- a/target-microblaze/cpu-qom.h +++ b/target-microblaze/cpu-qom.h @@ -72,5 +72,7 @@ static inline MicroBlazeCPU *mb_env_get_cpu(CPUMBStat= e *env) #define ENV_OFFSET offsetof(MicroBlazeCPU, env) =20 void mb_cpu_do_interrupt(CPUState *cs); +void mb_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); =20 #endif diff --git a/target-microblaze/cpu.c b/target-microblaze/cpu.c index 404f82c..e8104d1 100644 --- a/target-microblaze/cpu.c +++ b/target-microblaze/cpu.c @@ -138,6 +138,7 @@ static void mb_cpu_class_init(ObjectClass *oc, void= *data) cc->reset =3D mb_cpu_reset; =20 cc->do_interrupt =3D mb_cpu_do_interrupt; + cc->dump_state =3D mb_cpu_dump_state; dc->vmsd =3D &vmstate_mb_cpu; =20 dc->props =3D mb_properties; diff --git a/target-microblaze/helper.c b/target-microblaze/helper.c index 0dd669d..01d4bbf 100644 --- a/target-microblaze/helper.c +++ b/target-microblaze/helper.c @@ -39,8 +39,10 @@ void mb_cpu_do_interrupt(CPUState *cs) int cpu_mb_handle_mmu_fault(CPUMBState * env, target_ulong address, in= t rw, int mmu_idx) { + MicroBlazeCPU *cpu =3D mb_env_get_cpu(env); + env->exception_index =3D 0xaa; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); return 1; } =20 diff --git a/target-microblaze/translate.c b/target-microblaze/translat= e.c index 06d2346..54f439f 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -1949,9 +1949,11 @@ void gen_intermediate_code_pc (CPUMBState *env, = struct TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state (CPUMBState *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void mb_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags) { + MicroBlazeCPU *cpu =3D MICROBLAZE_CPU(cs); + CPUMBState *env =3D &cpu->env; int i; =20 if (!env || !f) diff --git a/target-mips/cpu-qom.h b/target-mips/cpu-qom.h index 32e3cad..a7ff9e6 100644 --- a/target-mips/cpu-qom.h +++ b/target-mips/cpu-qom.h @@ -75,5 +75,7 @@ static inline MIPSCPU *mips_env_get_cpu(CPUMIPSState = *env) #define ENV_OFFSET offsetof(MIPSCPU, env) =20 void mips_cpu_do_interrupt(CPUState *cpu); +void mips_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_= fprintf, + int flags); =20 #endif diff --git a/target-mips/cpu.c b/target-mips/cpu.c index 5315f7b..b685d39 100644 --- a/target-mips/cpu.c +++ b/target-mips/cpu.c @@ -80,6 +80,7 @@ static void mips_cpu_class_init(ObjectClass *c, void = *data) cc->reset =3D mips_cpu_reset; =20 cc->do_interrupt =3D mips_cpu_do_interrupt; + cc->dump_state =3D mips_cpu_dump_state; } =20 static const TypeInfo mips_cpu_type_info =3D { diff --git a/target-mips/translate.c b/target-mips/translate.c index 0a53203..160c0c0 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -15780,9 +15780,11 @@ cpu_mips_check_sign_extensions (CPUMIPSState *= env, FILE *f, } #endif =20 -void cpu_dump_state (CPUMIPSState *env, FILE *f, fprintf_function cpu_= fprintf, - int flags) +void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_f= printf, + int flags) { + MIPSCPU *cpu =3D MIPS_CPU(cs); + CPUMIPSState *env =3D &cpu->env; int i; =20 cpu_fprintf(f, "pc=3D0x" TARGET_FMT_lx " HI=3D0x" TARGET_FMT_lx diff --git a/target-moxie/cpu.c b/target-moxie/cpu.c index f2b0791..3c3932c 100644 --- a/target-moxie/cpu.c +++ b/target-moxie/cpu.c @@ -97,8 +97,9 @@ static void moxie_cpu_class_init(ObjectClass *oc, voi= d *data) =20 cc->class_by_name =3D moxie_cpu_class_by_name; =20 - cpu_class_set_vmsd(cc, &vmstate_moxie_cpu); cc->do_interrupt =3D moxie_cpu_do_interrupt; + cc->dump_state =3D moxie_cpu_dump_state; + cpu_class_set_vmsd(cc, &vmstate_moxie_cpu); } =20 static void moxielite_initfn(Object *obj) diff --git a/target-moxie/cpu.h b/target-moxie/cpu.h index a9d9ace..374b24a 100644 --- a/target-moxie/cpu.h +++ b/target-moxie/cpu.h @@ -116,6 +116,8 @@ static inline MoxieCPU *moxie_env_get_cpu(CPUMoxieS= tate *env) MoxieCPU *cpu_moxie_init(const char *cpu_model); int cpu_moxie_exec(CPUMoxieState *s); void moxie_cpu_do_interrupt(CPUState *cs); +void moxie_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); void moxie_translate_init(void); int cpu_moxie_signal_handler(int host_signum, void *pinfo, void *puc); diff --git a/target-moxie/helper.c b/target-moxie/helper.c index 5cfe889..ea0788f 100644 --- a/target-moxie/helper.c +++ b/target-moxie/helper.c @@ -110,9 +110,11 @@ void moxie_cpu_do_interrupt(CPUState *env) int cpu_moxie_handle_mmu_fault(CPUMoxieState *env, target_ulong addres= s, int rw, int mmu_idx) { + MoxieCPU *cpu =3D moxie_env_get_cpu(env); + env->exception_index =3D 0xaa; env->debug1 =3D address; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); return 1; } =20 diff --git a/target-moxie/translate.c b/target-moxie/translate.c index cc02bd3..b0ae38a 100644 --- a/target-moxie/translate.c +++ b/target-moxie/translate.c @@ -74,9 +74,11 @@ static int extract_branch_offset(int opcode) return (((signed short)((opcode & ((1 << 10) - 1)) << 6)) >> 6) << 1= ; } =20 -void cpu_dump_state(CPUArchState *env, FILE *f, fprintf_function cpu_f= printf, - int flags) +void moxie_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_= fprintf, + int flags) { + MoxieCPU *cpu =3D MOXIE_CPU(cs); + CPUMoxieState *env =3D &cpu->env; int i; cpu_fprintf(f, "pc=3D0x%08x\n", env->pc); cpu_fprintf(f, "$fp=3D0x%08x $sp=3D0x%08x $r0=3D0x%08x $r1=3D0x%08= x\n", diff --git a/target-openrisc/cpu.c b/target-openrisc/cpu.c index f8703a0..a401706 100644 --- a/target-openrisc/cpu.c +++ b/target-openrisc/cpu.c @@ -149,6 +149,7 @@ static void openrisc_cpu_class_init(ObjectClass *oc= , void *data) =20 cc->class_by_name =3D openrisc_cpu_class_by_name; cc->do_interrupt =3D openrisc_cpu_do_interrupt; + cc->dump_state =3D openrisc_cpu_dump_state; device_class_set_vmsd(dc, &vmstate_openrisc_cpu); } =20 diff --git a/target-openrisc/cpu.h b/target-openrisc/cpu.h index aee7769..80a82df 100644 --- a/target-openrisc/cpu.h +++ b/target-openrisc/cpu.h @@ -347,6 +347,8 @@ OpenRISCCPU *cpu_openrisc_init(const char *cpu_mode= l); void cpu_openrisc_list(FILE *f, fprintf_function cpu_fprintf); int cpu_openrisc_exec(CPUOpenRISCState *s); void openrisc_cpu_do_interrupt(CPUState *cpu); +void openrisc_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); void openrisc_translate_init(void); int cpu_openrisc_handle_mmu_fault(CPUOpenRISCState *env, target_ulong address, diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 0eafd02..c59fd02 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -1814,15 +1814,17 @@ void gen_intermediate_code_pc(CPUOpenRISCState = *env, gen_intermediate_code_internal(openrisc_env_get_cpu(env), tb, 1); } =20 -void cpu_dump_state(CPUOpenRISCState *env, FILE *f, - fprintf_function cpu_fprintf, - int flags) +void openrisc_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, + int flags) { + OpenRISCCPU *cpu =3D OPENRISC_CPU(cs); + CPUOpenRISCState *env =3D &cpu->env; int i; - uint32_t *regs =3D env->gpr; + cpu_fprintf(f, "PC=3D%08x\n", env->pc); for (i =3D 0; i < 32; ++i) { - cpu_fprintf(f, "R%02d=3D%08x%c", i, regs[i], + cpu_fprintf(f, "R%02d=3D%08x%c", i, env->gpr[i], (i % 4) =3D=3D 3 ? '\n' : ' '); } } diff --git a/target-ppc/cpu-qom.h b/target-ppc/cpu-qom.h index eb03a00..84ba105 100644 --- a/target-ppc/cpu-qom.h +++ b/target-ppc/cpu-qom.h @@ -101,5 +101,9 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCSta= te *env) PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr); =20 void ppc_cpu_do_interrupt(CPUState *cpu); +void ppc_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_f= printf, + int flags); +void ppc_cpu_dump_statistics(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 076cdac..3643863 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -9526,15 +9526,17 @@ GEN_SPEOP_LDST(evstwwo, 0x1E, 2), =20 /*********************************************************************= ********/ /* Misc PowerPC helpers */ -void cpu_dump_state (CPUPPCState *env, FILE *f, fprintf_function cpu_f= printf, - int flags) +void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags) { #define RGPL 4 #define RFPL 4 =20 + PowerPCCPU *cpu =3D POWERPC_CPU(cs); + CPUPPCState *env =3D &cpu->env; int i; =20 - cpu_synchronize_state(CPU(ppc_env_get_cpu(env))); + cpu_synchronize_state(cs); =20 cpu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR " TARGET_FMT_lx " XER " TARGET_FMT_lx "\n", @@ -9675,14 +9677,15 @@ void cpu_dump_state (CPUPPCState *env, FILE *f,= fprintf_function cpu_fprintf, #undef RFPL } =20 -void cpu_dump_statistics (CPUPPCState *env, FILE*f, fprintf_function c= pu_fprintf, - int flags) +void ppc_cpu_dump_statistics(CPUState *cs, FILE*f, + fprintf_function cpu_fprintf, int flags) { #if defined(DO_PPC_STATISTICS) + PowerPCCPU *cpu =3D POWERPC_CPU(cs); opc_handler_t **t1, **t2, **t3, *handler; int op1, op2, op3; =20 - t1 =3D env->opcodes; + t1 =3D cpu->env.opcodes; for (op1 =3D 0; op1 < 64; op1++) { handler =3D t1[op1]; if (is_indirect_opcode(handler)) { diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 021a31e..0edb336 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -8309,6 +8309,8 @@ static void ppc_cpu_class_init(ObjectClass *oc, v= oid *data) =20 cc->class_by_name =3D ppc_cpu_class_by_name; cc->do_interrupt =3D ppc_cpu_do_interrupt; + cc->dump_state =3D ppc_cpu_dump_state; + cc->dump_statistics =3D ppc_cpu_dump_statistics; } =20 static const TypeInfo ppc_cpu_type_info =3D { diff --git a/target-s390x/cpu-qom.h b/target-s390x/cpu-qom.h index 34d45c2..ec32d21 100644 --- a/target-s390x/cpu-qom.h +++ b/target-s390x/cpu-qom.h @@ -72,5 +72,7 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState= *env) #define ENV_OFFSET offsetof(S390CPU, env) =20 void s390_cpu_do_interrupt(CPUState *cpu); +void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_= fprintf, + int flags); =20 #endif diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index 23fe51f..8ec2f9b 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -170,6 +170,7 @@ static void s390_cpu_class_init(ObjectClass *oc, vo= id *data) cc->reset =3D s390_cpu_reset; =20 cc->do_interrupt =3D s390_cpu_do_interrupt; + cc->dump_state =3D s390_cpu_dump_state; dc->vmsd =3D &vmstate_s390_cpu; } =20 diff --git a/target-s390x/translate.c b/target-s390x/translate.c index f97e431..cd9880e 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -86,9 +86,11 @@ static uint64_t pc_to_link_info(DisasContext *s, uin= t64_t pc) return pc; } =20 -void cpu_dump_state(CPUS390XState *env, FILE *f, fprintf_function cpu_= fprintf, - int flags) +void s390_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_f= printf, + int flags) { + S390CPU *cpu =3D S390_CPU(cs); + CPUS390XState *env =3D &cpu->env; int i; =20 if (env->cc_op > 3) { diff --git a/target-sh4/cpu-qom.h b/target-sh4/cpu-qom.h index f8c80d3..01d1637 100644 --- a/target-sh4/cpu-qom.h +++ b/target-sh4/cpu-qom.h @@ -84,5 +84,7 @@ static inline SuperHCPU *sh_env_get_cpu(CPUSH4State *= env) #define ENV_OFFSET offsetof(SuperHCPU, env) =20 void superh_cpu_do_interrupt(CPUState *cpu); +void superh_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-sh4/cpu.c b/target-sh4/cpu.c index 898aecd..a7d5213 100644 --- a/target-sh4/cpu.c +++ b/target-sh4/cpu.c @@ -274,6 +274,7 @@ static void superh_cpu_class_init(ObjectClass *oc, = void *data) =20 cc->class_by_name =3D superh_cpu_class_by_name; cc->do_interrupt =3D superh_cpu_do_interrupt; + cc->dump_state =3D superh_cpu_dump_state; dc->vmsd =3D &vmstate_sh_cpu; } =20 diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 14fdb8f..292c9e9 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -150,10 +150,11 @@ void sh4_translate_init(void) done_init =3D 1; } =20 -void cpu_dump_state(CPUSH4State * env, FILE * f, - int (*cpu_fprintf) (FILE * f, const char *fmt, ...), - int flags) +void superh_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) { + SuperHCPU *cpu =3D SUPERH_CPU(cs); + CPUSH4State *env =3D &cpu->env; int i; cpu_fprintf(f, "pc=3D0x%08x sr=3D0x%08x pr=3D0x%08x fpscr=3D0x%08x= \n", env->pc, env->sr, env->pr, env->fpscr); diff --git a/target-sparc/cpu-qom.h b/target-sparc/cpu-qom.h index d4fe89e..97c1ec7 100644 --- a/target-sparc/cpu-qom.h +++ b/target-sparc/cpu-qom.h @@ -76,5 +76,7 @@ static inline SPARCCPU *sparc_env_get_cpu(CPUSPARCSta= te *env) #define ENV_OFFSET offsetof(SPARCCPU, env) =20 void sparc_cpu_do_interrupt(CPUState *cpu); +void sparc_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-sparc/cpu.c b/target-sparc/cpu.c index 13bb7bb..72700cd 100644 --- a/target-sparc/cpu.c +++ b/target-sparc/cpu.c @@ -660,9 +660,11 @@ static void cpu_print_cc(FILE *f, fprintf_function= cpu_fprintf, #define REGS_PER_LINE 8 #endif =20 -void cpu_dump_state(CPUSPARCState *env, FILE *f, fprintf_function cpu_= fprintf, - int flags) +void sparc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_= fprintf, + int flags) { + SPARCCPU *cpu =3D SPARC_CPU(cs); + CPUSPARCState *env =3D &cpu->env; int i, x; =20 cpu_fprintf(f, "pc: " TARGET_FMT_lx " npc: " TARGET_FMT_lx "\n", = env->pc, @@ -771,6 +773,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, v= oid *data) cc->reset =3D sparc_cpu_reset; =20 cc->do_interrupt =3D sparc_cpu_do_interrupt; + cc->dump_state =3D sparc_cpu_dump_state; } =20 static const TypeInfo sparc_cpu_type_info =3D { diff --git a/target-unicore32/cpu-qom.h b/target-unicore32/cpu-qom.h index ba4dee4..7eec448 100644 --- a/target-unicore32/cpu-qom.h +++ b/target-unicore32/cpu-qom.h @@ -61,5 +61,7 @@ static inline UniCore32CPU *uc32_env_get_cpu(CPUUniCo= re32State *env) #define ENV_OFFSET offsetof(UniCore32CPU, env) =20 void uc32_cpu_do_interrupt(CPUState *cpu); +void uc32_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c index 66a1a74..1a97e6b 100644 --- a/target-unicore32/cpu.c +++ b/target-unicore32/cpu.c @@ -133,6 +133,7 @@ static void uc32_cpu_class_init(ObjectClass *oc, vo= id *data) =20 cc->class_by_name =3D uc32_cpu_class_by_name; cc->do_interrupt =3D uc32_cpu_do_interrupt; + cc->dump_state =3D uc32_cpu_dump_state; dc->vmsd =3D &vmstate_uc32_cpu; } =20 diff --git a/target-unicore32/translate.c b/target-unicore32/translate.= c index 3dc7856..e1fe4e6 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -2113,9 +2113,11 @@ static void cpu_dump_state_ucf64(CPUUniCore32Sta= te *env, FILE *f, #define cpu_dump_state_ucf64(env, file, pr, flags) do { } while (= 0) #endif =20 -void cpu_dump_state(CPUUniCore32State *env, FILE *f, - fprintf_function cpu_fprintf, int flags) +void uc32_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) { + UniCore32CPU *cpu =3D UNICORE32_CPU(cs); + CPUUniCore32State *env =3D &cpu->env; int i; uint32_t psr; =20 diff --git a/target-xtensa/cpu-qom.h b/target-xtensa/cpu-qom.h index af0ce28..30506cf 100644 --- a/target-xtensa/cpu-qom.h +++ b/target-xtensa/cpu-qom.h @@ -81,5 +81,7 @@ static inline XtensaCPU *xtensa_env_get_cpu(const CPU= XtensaState *env) #define ENV_OFFSET offsetof(XtensaCPU, env) =20 void xtensa_cpu_do_interrupt(CPUState *cpu); +void xtensa_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-xtensa/cpu.c b/target-xtensa/cpu.c index 6e93dd8..b5df321 100644 --- a/target-xtensa/cpu.c +++ b/target-xtensa/cpu.c @@ -102,6 +102,7 @@ static void xtensa_cpu_class_init(ObjectClass *oc, = void *data) cc->reset =3D xtensa_cpu_reset; =20 cc->do_interrupt =3D xtensa_cpu_do_interrupt; + cc->dump_state =3D xtensa_cpu_dump_state; dc->vmsd =3D &vmstate_xtensa_cpu; } =20 diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c index 1037101..4c41de0 100644 --- a/target-xtensa/op_helper.c +++ b/target-xtensa/op_helper.c @@ -368,7 +368,9 @@ void HELPER(wsr_lend)(CPUXtensaState *env, uint32_t= v) =20 void HELPER(dump_state)(CPUXtensaState *env) { - cpu_dump_state(env, stderr, fprintf, 0); + XtensaCPU *cpu =3D xtensa_env_get_cpu(env); + + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); } =20 void HELPER(waiti)(CPUXtensaState *env, uint32_t pc, uint32_t intlevel= ) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 06d68db..dcb90a5 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -3014,9 +3014,11 @@ void gen_intermediate_code_pc(CPUXtensaState *en= v, TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state(CPUXtensaState *env, FILE *f, fprintf_function cpu= _fprintf, - int flags) +void xtensa_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) { + XtensaCPU *cpu =3D XTENSA_CPU(cs); + CPUXtensaState *env =3D &cpu->env; int i, j; =20 cpu_fprintf(f, "PC=3D%08x\n\n", env->pc); --=20 1.8.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43946) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Usb5T-0005pg-R0 for qemu-devel@nongnu.org; Fri, 28 Jun 2013 11:59:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Usb1o-0003jh-II for qemu-devel@nongnu.org; Fri, 28 Jun 2013 11:56:21 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Fri, 28 Jun 2013 17:55:37 +0200 Message-Id: <1372434946-18489-16-git-send-email-afaerber@suse.de> In-Reply-To: <1372434946-18489-1-git-send-email-afaerber@suse.de> References: <1372434946-18489-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 15/24] cpu: Turn cpu_dump_{state, statistics}() into CPUState hooks List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Marcelo Tosatti , "open list:Overall" , Gleb Natapov , Anthony Green , Riku Voipio , Alexander Graf , Luiz Capitulino , Blue Swirl , Max Filippov , Michael Walle , "open list:PowerPC" , Paul Brook , "Edgar E. Iglesias" , Guan Xuetao , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Aurelien Jarno , Richard Henderson Make cpustats monitor command available unconditionally. Prepares for changing kvm_handle_internal_error() and kvm_cpu_exec() arguments to CPUState. Signed-off-by: Andreas F=C3=A4rber --- bsd-user/main.c | 3 ++- cpus.c | 2 +- exec.c | 3 ++- include/exec/cpu-all.h | 10 ---------- include/qemu/log.h | 2 +- include/qom/cpu.h | 42 +++++++++++++++++++++++++++++++++++++= +++++ kvm-all.c | 4 ++-- linux-user/main.c | 38 +++++++++++++++++++++++--------------= - monitor.c | 13 ++++++------- qom/cpu.c | 22 +++++++++++++++++++++- stubs/cpus.c | 1 + target-alpha/cpu-qom.h | 2 ++ target-alpha/cpu.c | 1 + target-alpha/helper.c | 6 ++++-- target-arm/arm-semi.c | 3 ++- target-arm/cpu-qom.h | 3 +++ target-arm/cpu.c | 1 + target-arm/translate.c | 6 ++++-- target-cris/cpu-qom.h | 3 +++ target-cris/cpu.c | 1 + target-cris/helper.c | 4 +++- target-cris/translate.c | 6 ++++-- target-i386/cpu-qom.h | 3 +++ target-i386/cpu.c | 1 + target-i386/helper.c | 7 ++++--- target-lm32/cpu-qom.h | 2 ++ target-lm32/cpu.c | 1 + target-lm32/translate.c | 6 ++++-- target-m68k/cpu-qom.h | 2 ++ target-m68k/cpu.c | 1 + target-m68k/translate.c | 6 ++++-- target-microblaze/cpu-qom.h | 2 ++ target-microblaze/cpu.c | 1 + target-microblaze/helper.c | 4 +++- target-microblaze/translate.c | 6 ++++-- target-mips/cpu-qom.h | 2 ++ target-mips/cpu.c | 1 + target-mips/translate.c | 6 ++++-- target-moxie/cpu.c | 3 ++- target-moxie/cpu.h | 2 ++ target-moxie/helper.c | 4 +++- target-moxie/translate.c | 6 ++++-- target-openrisc/cpu.c | 1 + target-openrisc/cpu.h | 2 ++ target-openrisc/translate.c | 12 +++++++----- target-ppc/cpu-qom.h | 4 ++++ target-ppc/translate.c | 15 +++++++++------ target-ppc/translate_init.c | 2 ++ target-s390x/cpu-qom.h | 2 ++ target-s390x/cpu.c | 1 + target-s390x/translate.c | 6 ++++-- target-sh4/cpu-qom.h | 2 ++ target-sh4/cpu.c | 1 + target-sh4/translate.c | 7 ++++--- target-sparc/cpu-qom.h | 2 ++ target-sparc/cpu.c | 7 +++++-- target-unicore32/cpu-qom.h | 2 ++ target-unicore32/cpu.c | 1 + target-unicore32/translate.c | 6 ++++-- target-xtensa/cpu-qom.h | 2 ++ target-xtensa/cpu.c | 1 + target-xtensa/op_helper.c | 4 +++- target-xtensa/translate.c | 6 ++++-- 63 files changed, 242 insertions(+), 86 deletions(-) diff --git a/bsd-user/main.c b/bsd-user/main.c index 572f13a..75dbd7f 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -511,6 +511,7 @@ static void flush_windows(CPUSPARCState *env) =20 void cpu_loop(CPUSPARCState *env) { + CPUState *cs =3D CPU(sparc_env_get_cpu(env)); int trapnr, ret, syscall_nr; //target_siginfo_t info; =20 @@ -659,7 +660,7 @@ void cpu_loop(CPUSPARCState *env) badtrap: #endif printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); diff --git a/cpus.c b/cpus.c index 40bf64c..4c7e329 100644 --- a/cpus.c +++ b/cpus.c @@ -397,7 +397,7 @@ void hw_error(const char *fmt, ...) for (env =3D first_cpu; env !=3D NULL; env =3D env->next_cpu) { cpu =3D ENV_GET_CPU(env); fprintf(stderr, "CPU #%d:\n", cpu->cpu_index); - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_FPU); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU); } va_end(ap); abort(); diff --git a/exec.c b/exec.c index 2d02b11..c49806c 100644 --- a/exec.c +++ b/exec.c @@ -600,6 +600,7 @@ void cpu_single_step(CPUArchState *env, int enabled) =20 void cpu_abort(CPUArchState *env, const char *fmt, ...) { + CPUState *cpu =3D ENV_GET_CPU(env); va_list ap; va_list ap2; =20 @@ -608,7 +609,7 @@ void cpu_abort(CPUArchState *env, const char *fmt, ..= .) fprintf(stderr, "qemu: fatal: "); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP); if (qemu_log_enabled()) { qemu_log("qemu: fatal: "); qemu_log_vprintf(fmt, ap2); diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index e1cc62e..35bdf85 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -355,16 +355,6 @@ int page_check_range(target_ulong start, target_ulon= g len, int flags); =20 CPUArchState *cpu_copy(CPUArchState *env); =20 -#define CPU_DUMP_CODE 0x00010000 -#define CPU_DUMP_FPU 0x00020000 /* dump FPU register state, not just int= eger */ -/* dump info about TCG QEMU's condition code optimization state */ -#define CPU_DUMP_CCOP 0x00040000 - -void cpu_dump_state(CPUArchState *env, FILE *f, fprintf_function cpu_fpr= intf, - int flags); -void cpu_dump_statistics(CPUArchState *env, FILE *f, fprintf_function cp= u_fprintf, - int flags); - void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...) GCC_FMT_ATTR(2, 3); extern CPUArchState *first_cpu; diff --git a/include/qemu/log.h b/include/qemu/log.h index fd76f91..a9cf214 100644 --- a/include/qemu/log.h +++ b/include/qemu/log.h @@ -75,7 +75,7 @@ void GCC_FMT_ATTR(2, 3) qemu_log_mask(int mask, const c= har *fmt, ...); static inline void log_cpu_state(CPUArchState *env1, int flags) { if (qemu_log_enabled()) { - cpu_dump_state(env1, qemu_logfile, fprintf, flags); + cpu_dump_state(ENV_GET_CPU(env1), qemu_logfile, fprintf, flags); } } =20 diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 3494356..12b5099 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -48,6 +48,8 @@ typedef struct CPUState CPUState; * instantiatable CPU type. * @reset: Callback to reset the #CPUState to its initial state. * @do_interrupt: Callback for interrupt handling. + * @dump_state: Callback for dumping state. + * @dump_statistics: Callback for dumping statistics. * @get_arch_id: Callback for getting architecture-dependent CPU ID. * @get_paging_enabled: Callback for inquiring whether paging is enabled= . * @get_memory_mapping: Callback for obtaining the memory mappings. @@ -64,6 +66,10 @@ typedef struct CPUClass { =20 void (*reset)(CPUState *cpu); void (*do_interrupt)(CPUState *cpu); + void (*dump_state)(CPUState *cpu, FILE *f, fprintf_function cpu_fpri= ntf, + int flags); + void (*dump_statistics)(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); int64_t (*get_arch_id)(CPUState *cpu); bool (*get_paging_enabled)(const CPUState *cpu); void (*get_memory_mapping)(CPUState *cpu, MemoryMappingList *list, @@ -201,6 +207,42 @@ int cpu_write_elf32_qemunote(WriteCoreDumpFunction f= , CPUState *cpu, void *opaque); =20 /** + * CPUDumpFlags: + * @CPU_DUMP_CODE: + * @CPU_DUMP_FPU: dump FPU register state, not just integer + * @CPU_DUMP_CCOP: dump info about TCG QEMU's condition code optimizatio= n state + */ +enum CPUDumpFlags { + CPU_DUMP_CODE =3D 0x00010000, + CPU_DUMP_FPU =3D 0x00020000, + CPU_DUMP_CCOP =3D 0x00040000, +}; + +/** + * cpu_dump_state: + * @cpu: The CPU whose state is to be dumped. + * @f: File to dump to. + * @cpu_fprintf: Function to dump with. + * @flags: Flags what to dump. + * + * Dumps CPU state. + */ +void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf= , + int flags); + +/** + * cpu_dump_statistics: + * @cpu: The CPU whose state is to be dumped. + * @f: File to dump to. + * @cpu_fprintf: Function to dump with. + * @flags: Flags what to dump. + * + * Dumps CPU statistics. + */ +void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); + +/** * cpu_reset: * @cpu: The CPU whose state is to be reset. */ diff --git a/kvm-all.c b/kvm-all.c index f1031e0..bab04c9 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1544,7 +1544,7 @@ static int kvm_handle_internal_error(CPUArchState *= env, struct kvm_run *run) if (run->internal.suberror =3D=3D KVM_INTERNAL_ERROR_EMULATION) { fprintf(stderr, "emulation failure\n"); if (!kvm_arch_stop_on_emulation_error(cpu)) { - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_CODE); return EXCP_INTERRUPT; } } @@ -1700,7 +1700,7 @@ int kvm_cpu_exec(CPUArchState *env) } while (ret =3D=3D 0); =20 if (ret < 0) { - cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_CODE); vm_stop(RUN_STATE_INTERNAL_ERROR); } =20 diff --git a/linux-user/main.c b/linux-user/main.c index f67a62b..af82db8 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -901,7 +901,7 @@ void cpu_loop(CPUARMState *env) error: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborti= ng\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } process_pending_signals(env); @@ -985,7 +985,7 @@ void cpu_loop(CPUUniCore32State *env) =20 error: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n", t= rapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } #endif @@ -1115,6 +1115,7 @@ static void flush_windows(CPUSPARCState *env) =20 void cpu_loop (CPUSPARCState *env) { + CPUState *cs =3D CPU(sparc_env_get_cpu(env)); int trapnr; abi_long ret; target_siginfo_t info; @@ -1246,7 +1247,7 @@ void cpu_loop (CPUSPARCState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -1304,7 +1305,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, ui= nt32_t val) #define EXCP_DUMP(env, fmt, ...) = \ do { = \ fprintf(stderr, fmt , ## __VA_ARGS__); = \ - cpu_dump_state(env, stderr, fprintf, 0); = \ + cpu_dump_state(ENV_GET_CPU(env), stderr, fprintf, 0); = \ qemu_log(fmt, ## __VA_ARGS__); = \ if (qemu_log_enabled()) { = \ log_cpu_state(env, 0); = \ @@ -2391,7 +2392,7 @@ done_syscall: error: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborti= ng\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } process_pending_signals(env); @@ -2403,6 +2404,7 @@ error: =20 void cpu_loop(CPUOpenRISCState *env) { + CPUState *cs =3D CPU(openrisc_env_get_cpu(env)); int trapnr, gdbsig; =20 for (;;) { @@ -2420,7 +2422,7 @@ void cpu_loop(CPUOpenRISCState *env) break; case EXCP_DPF: case EXCP_IPF: - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); gdbsig =3D TARGET_SIGSEGV; break; case EXCP_TICK: @@ -2469,7 +2471,7 @@ void cpu_loop(CPUOpenRISCState *env) default: qemu_log("\nqemu: unhandled CPU exception %#x - aborting\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); gdbsig =3D TARGET_SIGILL; break; } @@ -2489,6 +2491,7 @@ void cpu_loop(CPUOpenRISCState *env) #ifdef TARGET_SH4 void cpu_loop(CPUSH4State *env) { + CPUState *cs =3D CPU(sh_env_get_cpu(env)); int trapnr, ret; target_siginfo_t info; =20 @@ -2537,7 +2540,7 @@ void cpu_loop(CPUSH4State *env) =20 default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -2548,6 +2551,7 @@ void cpu_loop(CPUSH4State *env) #ifdef TARGET_CRIS void cpu_loop(CPUCRISState *env) { + CPUState *cs =3D CPU(cris_env_get_cpu(env)); int trapnr, ret; target_siginfo_t info; =20 @@ -2595,7 +2599,7 @@ void cpu_loop(CPUCRISState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -2606,6 +2610,7 @@ void cpu_loop(CPUCRISState *env) #ifdef TARGET_MICROBLAZE void cpu_loop(CPUMBState *env) { + CPUState *cs =3D CPU(mb_env_get_cpu(env)); int trapnr, ret; target_siginfo_t info; =20 @@ -2673,7 +2678,7 @@ void cpu_loop(CPUMBState *env) default: printf ("Unhandled hw-exception: 0x%x\n", env->sregs[SR_ESR] & ESR_EC_MASK); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); break; } @@ -2694,7 +2699,7 @@ void cpu_loop(CPUMBState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -2706,6 +2711,7 @@ void cpu_loop(CPUMBState *env) =20 void cpu_loop(CPUM68KState *env) { + CPUState *cs =3D CPU(m68k_env_get_cpu(env)); int trapnr; unsigned int n; target_siginfo_t info; @@ -2787,7 +2793,7 @@ void cpu_loop(CPUM68KState *env) default: fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborti= ng\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); abort(); } process_pending_signals(env); @@ -2843,6 +2849,7 @@ static void do_store_exclusive(CPUAlphaState *env, = int reg, int quad) =20 void cpu_loop(CPUAlphaState *env) { + CPUState *cs =3D CPU(alpha_env_get_cpu(env)); int trapnr; target_siginfo_t info; abi_long sysret; @@ -3017,7 +3024,7 @@ void cpu_loop(CPUAlphaState *env) break; default: printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit (1); } process_pending_signals (env); @@ -3028,6 +3035,7 @@ void cpu_loop(CPUAlphaState *env) #ifdef TARGET_S390X void cpu_loop(CPUS390XState *env) { + CPUState *cs =3D CPU(s390_env_get_cpu(env)); int trapnr, n, sig; target_siginfo_t info; target_ulong addr; @@ -3118,7 +3126,7 @@ void cpu_loop(CPUS390XState *env) =20 default: fprintf(stderr, "Unhandled program exception: %#x\n", n)= ; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit(1); } break; @@ -3135,7 +3143,7 @@ void cpu_loop(CPUS390XState *env) =20 default: fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(cs, stderr, fprintf, 0); exit(1); } process_pending_signals (env); diff --git a/monitor.c b/monitor.c index 19c297d..9be515c 100644 --- a/monitor.c +++ b/monitor.c @@ -921,9 +921,11 @@ int monitor_get_cpu_index(void) =20 static void do_info_registers(Monitor *mon, const QDict *qdict) { + CPUState *cpu; CPUArchState *env; env =3D mon_get_cpu(); - cpu_dump_state(env, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); + cpu =3D ENV_GET_CPU(env); + cpu_dump_state(cpu, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); } =20 static void do_info_jit(Monitor *mon, const QDict *qdict) @@ -948,16 +950,15 @@ static void do_info_history(Monitor *mon, const QDi= ct *qdict) } } =20 -#if defined(TARGET_PPC) -/* XXX: not implemented in other targets */ static void do_info_cpu_stats(Monitor *mon, const QDict *qdict) { + CPUState *cpu; CPUArchState *env; =20 env =3D mon_get_cpu(); - cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0); + cpu =3D ENV_GET_CPU(env); + cpu_dump_statistics(cpu, (FILE *)mon, &monitor_fprintf, 0); } -#endif =20 static void do_trace_print_events(Monitor *mon, const QDict *qdict) { @@ -2678,7 +2679,6 @@ static mon_cmd_t info_cmds[] =3D { .help =3D "show the current VM UUID", .mhandler.cmd =3D hmp_info_uuid, }, -#if defined(TARGET_PPC) { .name =3D "cpustats", .args_type =3D "", @@ -2686,7 +2686,6 @@ static mon_cmd_t info_cmds[] =3D { .help =3D "show CPU statistics", .mhandler.cmd =3D do_info_cpu_stats, }, -#endif #if defined(CONFIG_SLIRP) { .name =3D "usernet", diff --git a/qom/cpu.c b/qom/cpu.c index 8a122b0..4da6332 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -18,8 +18,8 @@ * */ =20 -#include "qom/cpu.h" #include "qemu-common.h" +#include "qom/cpu.h" #include "sysemu/kvm.h" #include "qemu/notify.h" #include "sysemu/sysemu.h" @@ -156,6 +156,26 @@ static int cpu_common_write_elf64_note(WriteCoreDump= Function f, } =20 =20 +void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf= , + int flags) +{ + CPUClass *cc =3D CPU_GET_CLASS(cpu); + + if (cc->dump_state) { + cc->dump_state(cpu, f, cpu_fprintf, flags); + } +} + +void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags) +{ + CPUClass *cc =3D CPU_GET_CLASS(cpu); + + if (cc->dump_statistics) { + cc->dump_statistics(cpu, f, cpu_fprintf, flags); + } +} + void cpu_reset(CPUState *cpu) { CPUClass *klass =3D CPU_GET_CLASS(cpu); diff --git a/stubs/cpus.c b/stubs/cpus.c index 37000dd..f0d56c5 100644 --- a/stubs/cpus.c +++ b/stubs/cpus.c @@ -1,3 +1,4 @@ +#include "qemu-common.h" #include "qom/cpu.h" =20 void cpu_resume(CPUState *cpu) diff --git a/target-alpha/cpu-qom.h b/target-alpha/cpu-qom.h index ee10ed6..94e4a54 100644 --- a/target-alpha/cpu-qom.h +++ b/target-alpha/cpu-qom.h @@ -79,5 +79,7 @@ extern const struct VMStateDescription vmstate_alpha_cp= u; #endif =20 void alpha_cpu_do_interrupt(CPUState *cpu); +void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags); =20 #endif diff --git a/target-alpha/cpu.c b/target-alpha/cpu.c index 8252cea..7d7fdab 100644 --- a/target-alpha/cpu.c +++ b/target-alpha/cpu.c @@ -265,6 +265,7 @@ static void alpha_cpu_class_init(ObjectClass *oc, voi= d *data) =20 cc->class_by_name =3D alpha_cpu_class_by_name; cc->do_interrupt =3D alpha_cpu_do_interrupt; + cc->dump_state =3D alpha_cpu_dump_state; device_class_set_vmsd(dc, &vmstate_alpha_cpu); } =20 diff --git a/target-alpha/helper.c b/target-alpha/helper.c index 5741ec2..ff57dd6 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -464,8 +464,8 @@ void alpha_cpu_do_interrupt(CPUState *cs) #endif /* !USER_ONLY */ } =20 -void cpu_dump_state (CPUAlphaState *env, FILE *f, fprintf_function cpu_f= printf, - int flags) +void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags) { static const char *linux_reg_names[] =3D { "v0 ", "t0 ", "t1 ", "t2 ", "t3 ", "t4 ", "t5 ", "t6 ", @@ -473,6 +473,8 @@ void cpu_dump_state (CPUAlphaState *env, FILE *f, fpr= intf_function cpu_fprintf, "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "t8 ", "t9 ", "t10", "t11", "ra ", "t12", "at ", "gp ", "sp ", "zero", }; + AlphaCPU *cpu =3D ALPHA_CPU(cs); + CPUAlphaState *env =3D &cpu->env; int i; =20 cpu_fprintf(f, " PC " TARGET_FMT_lx " PS %02x\n", diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c index f0637a4..5f01bca 100644 --- a/target-arm/arm-semi.c +++ b/target-arm/arm-semi.c @@ -178,6 +178,7 @@ static void arm_semi_flen_cb(CPUARMState *env, target= _ulong ret, target_ulong er #define SET_ARG(n, val) put_user_ual(val, args + (n) * 4) uint32_t do_arm_semihosting(CPUARMState *env) { + ARMCPU *cpu =3D arm_env_get_cpu(env); target_ulong args; target_ulong arg0, arg1, arg2, arg3; char * s; @@ -549,7 +550,7 @@ uint32_t do_arm_semihosting(CPUARMState *env) exit(0); default: fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", nr= ); - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); abort(); } } diff --git a/target-arm/cpu-qom.h b/target-arm/cpu-qom.h index 25239b8..ef6261f 100644 --- a/target-arm/cpu-qom.h +++ b/target-arm/cpu-qom.h @@ -144,4 +144,7 @@ void init_cpreg_list(ARMCPU *cpu); void arm_cpu_do_interrupt(CPUState *cpu); void arm_v7m_cpu_do_interrupt(CPUState *cpu); =20 +void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpri= ntf, + int flags); + #endif diff --git a/target-arm/cpu.c b/target-arm/cpu.c index 2371f48..645c961 100644 --- a/target-arm/cpu.c +++ b/target-arm/cpu.c @@ -816,6 +816,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void = *data) =20 cc->class_by_name =3D arm_cpu_class_by_name; cc->do_interrupt =3D arm_cpu_do_interrupt; + cc->dump_state =3D arm_cpu_dump_state; cpu_class_set_vmsd(cc, &vmstate_arm_cpu); } =20 diff --git a/target-arm/translate.c b/target-arm/translate.c index 2a18ffe..af2aef2 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -10085,9 +10085,11 @@ static const char *cpu_mode_names[16] =3D { "???", "???", "???", "und", "???", "???", "???", "sys" }; =20 -void cpu_dump_state(CPUARMState *env, FILE *f, fprintf_function cpu_fpri= ntf, - int flags) +void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpri= ntf, + int flags) { + ARMCPU *cpu =3D ARM_CPU(cs); + CPUARMState *env =3D &cpu->env; int i; uint32_t psr; =20 diff --git a/target-cris/cpu-qom.h b/target-cris/cpu-qom.h index 03829bd..e08bdb1 100644 --- a/target-cris/cpu-qom.h +++ b/target-cris/cpu-qom.h @@ -76,4 +76,7 @@ static inline CRISCPU *cris_env_get_cpu(CPUCRISState *e= nv) void cris_cpu_do_interrupt(CPUState *cpu); void crisv10_cpu_do_interrupt(CPUState *cpu); =20 +void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags); + #endif diff --git a/target-cris/cpu.c b/target-cris/cpu.c index 67181e5..82271f7 100644 --- a/target-cris/cpu.c +++ b/target-cris/cpu.c @@ -252,6 +252,7 @@ static void cris_cpu_class_init(ObjectClass *oc, void= *data) =20 cc->class_by_name =3D cris_cpu_class_by_name; cc->do_interrupt =3D cris_cpu_do_interrupt; + cc->dump_state =3D cris_cpu_dump_state; } =20 static const TypeInfo cris_cpu_type_info =3D { diff --git a/target-cris/helper.c b/target-cris/helper.c index 466cc2f..aba7537 100644 --- a/target-cris/helper.c +++ b/target-cris/helper.c @@ -53,9 +53,11 @@ void crisv10_cpu_do_interrupt(CPUState *cs) int cpu_cris_handle_mmu_fault(CPUCRISState * env, target_ulong address, = int rw, int mmu_idx) { + CRISCPU *cpu =3D cris_env_get_cpu(env); + env->exception_index =3D 0xaa; env->pregs[PR_EDA] =3D address; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); return 1; } =20 diff --git a/target-cris/translate.c b/target-cris/translate.c index dbcb811..09d0d2b 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -3427,9 +3427,11 @@ void gen_intermediate_code_pc (CPUCRISState *env, = struct TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state (CPUCRISState *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags) { + CRISCPU *cpu =3D CRIS_CPU(cs); + CPUCRISState *env =3D &cpu->env; int i; uint32_t srs; =20 diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index e0ac072..b7c70d6 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -101,4 +101,7 @@ int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunctio= n f, CPUState *cpu, void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list, Error **errp); =20 +void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpri= ntf, + int flags); + #endif diff --git a/target-i386/cpu.c b/target-i386/cpu.c index a7154af..48c062f 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2526,6 +2526,7 @@ static void x86_cpu_common_class_init(ObjectClass *= oc, void *data) cc->reset =3D x86_cpu_reset; =20 cc->do_interrupt =3D x86_cpu_do_interrupt; + cc->dump_state =3D x86_cpu_dump_state; cc->get_arch_id =3D x86_cpu_get_arch_id; cc->get_paging_enabled =3D x86_cpu_get_paging_enabled; #ifndef CONFIG_USER_ONLY diff --git a/target-i386/helper.c b/target-i386/helper.c index 803945d..5e5abe3 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -179,10 +179,11 @@ done: #define DUMP_CODE_BYTES_TOTAL 50 #define DUMP_CODE_BYTES_BACKWARD 20 =20 -void cpu_dump_state(CPUX86State *env, FILE *f, fprintf_function cpu_fpri= ntf, - int flags) +void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpri= ntf, + int flags) { - CPUState *cs =3D CPU(x86_env_get_cpu(env)); + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; int eflags, i, nb; char cc_op_name[32]; static const char *seg_name[6] =3D { "ES", "CS", "SS", "DS", "FS", "= GS" }; diff --git a/target-lm32/cpu-qom.h b/target-lm32/cpu-qom.h index 9571860..5ef884b 100644 --- a/target-lm32/cpu-qom.h +++ b/target-lm32/cpu-qom.h @@ -76,5 +76,7 @@ extern const struct VMStateDescription vmstate_lm32_cpu= ; #endif =20 void lm32_cpu_do_interrupt(CPUState *cpu); +void lm32_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); =20 #endif diff --git a/target-lm32/cpu.c b/target-lm32/cpu.c index 23c05dd..2366152 100644 --- a/target-lm32/cpu.c +++ b/target-lm32/cpu.c @@ -85,6 +85,7 @@ static void lm32_cpu_class_init(ObjectClass *oc, void *= data) cc->reset =3D lm32_cpu_reset; =20 cc->do_interrupt =3D lm32_cpu_do_interrupt; + cc->dump_state =3D lm32_cpu_dump_state; cpu_class_set_vmsd(cc, &vmstate_lm32_cpu); } =20 diff --git a/target-lm32/translate.c b/target-lm32/translate.c index af9ce8c..227a801 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -1141,9 +1141,11 @@ void gen_intermediate_code_pc(CPULM32State *env, s= truct TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state(CPULM32State *env, FILE *f, fprintf_function cpu_fpr= intf, - int flags) +void lm32_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags) { + LM32CPU *cpu =3D LM32_CPU(cs); + CPULM32State *env =3D &cpu->env; int i; =20 if (!env || !f) { diff --git a/target-m68k/cpu-qom.h b/target-m68k/cpu-qom.h index 846aa74..2436c13 100644 --- a/target-m68k/cpu-qom.h +++ b/target-m68k/cpu-qom.h @@ -71,5 +71,7 @@ static inline M68kCPU *m68k_env_get_cpu(CPUM68KState *e= nv) #define ENV_OFFSET offsetof(M68kCPU, env) =20 void m68k_cpu_do_interrupt(CPUState *cpu); +void m68k_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); =20 #endif diff --git a/target-m68k/cpu.c b/target-m68k/cpu.c index 3c65b4e..d501027 100644 --- a/target-m68k/cpu.c +++ b/target-m68k/cpu.c @@ -187,6 +187,7 @@ static void m68k_cpu_class_init(ObjectClass *c, void = *data) =20 cc->class_by_name =3D m68k_cpu_class_by_name; cc->do_interrupt =3D m68k_cpu_do_interrupt; + cc->dump_state =3D m68k_cpu_dump_state; dc->vmsd =3D &vmstate_m68k_cpu; } =20 diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 32b8132..3752094 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -3104,9 +3104,11 @@ void gen_intermediate_code_pc(CPUM68KState *env, T= ranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state(CPUM68KState *env, FILE *f, fprintf_function cpu_fpr= intf, - int flags) +void m68k_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags) { + M68kCPU *cpu =3D M68K_CPU(cs); + CPUM68KState *env =3D &cpu->env; int i; uint16_t sr; CPU_DoubleU u; diff --git a/target-microblaze/cpu-qom.h b/target-microblaze/cpu-qom.h index ce92a4e..3e9c206 100644 --- a/target-microblaze/cpu-qom.h +++ b/target-microblaze/cpu-qom.h @@ -72,5 +72,7 @@ static inline MicroBlazeCPU *mb_env_get_cpu(CPUMBState = *env) #define ENV_OFFSET offsetof(MicroBlazeCPU, env) =20 void mb_cpu_do_interrupt(CPUState *cs); +void mb_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fpri= ntf, + int flags); =20 #endif diff --git a/target-microblaze/cpu.c b/target-microblaze/cpu.c index 404f82c..e8104d1 100644 --- a/target-microblaze/cpu.c +++ b/target-microblaze/cpu.c @@ -138,6 +138,7 @@ static void mb_cpu_class_init(ObjectClass *oc, void *= data) cc->reset =3D mb_cpu_reset; =20 cc->do_interrupt =3D mb_cpu_do_interrupt; + cc->dump_state =3D mb_cpu_dump_state; dc->vmsd =3D &vmstate_mb_cpu; =20 dc->props =3D mb_properties; diff --git a/target-microblaze/helper.c b/target-microblaze/helper.c index 0dd669d..01d4bbf 100644 --- a/target-microblaze/helper.c +++ b/target-microblaze/helper.c @@ -39,8 +39,10 @@ void mb_cpu_do_interrupt(CPUState *cs) int cpu_mb_handle_mmu_fault(CPUMBState * env, target_ulong address, int = rw, int mmu_idx) { + MicroBlazeCPU *cpu =3D mb_env_get_cpu(env); + env->exception_index =3D 0xaa; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); return 1; } =20 diff --git a/target-microblaze/translate.c b/target-microblaze/translate.= c index 06d2346..54f439f 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -1949,9 +1949,11 @@ void gen_intermediate_code_pc (CPUMBState *env, st= ruct TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state (CPUMBState *env, FILE *f, fprintf_function cpu_fpri= ntf, - int flags) +void mb_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprin= tf, + int flags) { + MicroBlazeCPU *cpu =3D MICROBLAZE_CPU(cs); + CPUMBState *env =3D &cpu->env; int i; =20 if (!env || !f) diff --git a/target-mips/cpu-qom.h b/target-mips/cpu-qom.h index 32e3cad..a7ff9e6 100644 --- a/target-mips/cpu-qom.h +++ b/target-mips/cpu-qom.h @@ -75,5 +75,7 @@ static inline MIPSCPU *mips_env_get_cpu(CPUMIPSState *e= nv) #define ENV_OFFSET offsetof(MIPSCPU, env) =20 void mips_cpu_do_interrupt(CPUState *cpu); +void mips_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); =20 #endif diff --git a/target-mips/cpu.c b/target-mips/cpu.c index 5315f7b..b685d39 100644 --- a/target-mips/cpu.c +++ b/target-mips/cpu.c @@ -80,6 +80,7 @@ static void mips_cpu_class_init(ObjectClass *c, void *d= ata) cc->reset =3D mips_cpu_reset; =20 cc->do_interrupt =3D mips_cpu_do_interrupt; + cc->dump_state =3D mips_cpu_dump_state; } =20 static const TypeInfo mips_cpu_type_info =3D { diff --git a/target-mips/translate.c b/target-mips/translate.c index 0a53203..160c0c0 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -15780,9 +15780,11 @@ cpu_mips_check_sign_extensions (CPUMIPSState *en= v, FILE *f, } #endif =20 -void cpu_dump_state (CPUMIPSState *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags) { + MIPSCPU *cpu =3D MIPS_CPU(cs); + CPUMIPSState *env =3D &cpu->env; int i; =20 cpu_fprintf(f, "pc=3D0x" TARGET_FMT_lx " HI=3D0x" TARGET_FMT_lx diff --git a/target-moxie/cpu.c b/target-moxie/cpu.c index f2b0791..3c3932c 100644 --- a/target-moxie/cpu.c +++ b/target-moxie/cpu.c @@ -97,8 +97,9 @@ static void moxie_cpu_class_init(ObjectClass *oc, void = *data) =20 cc->class_by_name =3D moxie_cpu_class_by_name; =20 - cpu_class_set_vmsd(cc, &vmstate_moxie_cpu); cc->do_interrupt =3D moxie_cpu_do_interrupt; + cc->dump_state =3D moxie_cpu_dump_state; + cpu_class_set_vmsd(cc, &vmstate_moxie_cpu); } =20 static void moxielite_initfn(Object *obj) diff --git a/target-moxie/cpu.h b/target-moxie/cpu.h index a9d9ace..374b24a 100644 --- a/target-moxie/cpu.h +++ b/target-moxie/cpu.h @@ -116,6 +116,8 @@ static inline MoxieCPU *moxie_env_get_cpu(CPUMoxieSta= te *env) MoxieCPU *cpu_moxie_init(const char *cpu_model); int cpu_moxie_exec(CPUMoxieState *s); void moxie_cpu_do_interrupt(CPUState *cs); +void moxie_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); void moxie_translate_init(void); int cpu_moxie_signal_handler(int host_signum, void *pinfo, void *puc); diff --git a/target-moxie/helper.c b/target-moxie/helper.c index 5cfe889..ea0788f 100644 --- a/target-moxie/helper.c +++ b/target-moxie/helper.c @@ -110,9 +110,11 @@ void moxie_cpu_do_interrupt(CPUState *env) int cpu_moxie_handle_mmu_fault(CPUMoxieState *env, target_ulong address, int rw, int mmu_idx) { + MoxieCPU *cpu =3D moxie_env_get_cpu(env); + env->exception_index =3D 0xaa; env->debug1 =3D address; - cpu_dump_state(env, stderr, fprintf, 0); + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); return 1; } =20 diff --git a/target-moxie/translate.c b/target-moxie/translate.c index cc02bd3..b0ae38a 100644 --- a/target-moxie/translate.c +++ b/target-moxie/translate.c @@ -74,9 +74,11 @@ static int extract_branch_offset(int opcode) return (((signed short)((opcode & ((1 << 10) - 1)) << 6)) >> 6) << 1; } =20 -void cpu_dump_state(CPUArchState *env, FILE *f, fprintf_function cpu_fpr= intf, - int flags) +void moxie_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags) { + MoxieCPU *cpu =3D MOXIE_CPU(cs); + CPUMoxieState *env =3D &cpu->env; int i; cpu_fprintf(f, "pc=3D0x%08x\n", env->pc); cpu_fprintf(f, "$fp=3D0x%08x $sp=3D0x%08x $r0=3D0x%08x $r1=3D0x%08x\= n", diff --git a/target-openrisc/cpu.c b/target-openrisc/cpu.c index f8703a0..a401706 100644 --- a/target-openrisc/cpu.c +++ b/target-openrisc/cpu.c @@ -149,6 +149,7 @@ static void openrisc_cpu_class_init(ObjectClass *oc, = void *data) =20 cc->class_by_name =3D openrisc_cpu_class_by_name; cc->do_interrupt =3D openrisc_cpu_do_interrupt; + cc->dump_state =3D openrisc_cpu_dump_state; device_class_set_vmsd(dc, &vmstate_openrisc_cpu); } =20 diff --git a/target-openrisc/cpu.h b/target-openrisc/cpu.h index aee7769..80a82df 100644 --- a/target-openrisc/cpu.h +++ b/target-openrisc/cpu.h @@ -347,6 +347,8 @@ OpenRISCCPU *cpu_openrisc_init(const char *cpu_model)= ; void cpu_openrisc_list(FILE *f, fprintf_function cpu_fprintf); int cpu_openrisc_exec(CPUOpenRISCState *s); void openrisc_cpu_do_interrupt(CPUState *cpu); +void openrisc_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); void openrisc_translate_init(void); int cpu_openrisc_handle_mmu_fault(CPUOpenRISCState *env, target_ulong address, diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 0eafd02..c59fd02 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -1814,15 +1814,17 @@ void gen_intermediate_code_pc(CPUOpenRISCState *e= nv, gen_intermediate_code_internal(openrisc_env_get_cpu(env), tb, 1); } =20 -void cpu_dump_state(CPUOpenRISCState *env, FILE *f, - fprintf_function cpu_fprintf, - int flags) +void openrisc_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, + int flags) { + OpenRISCCPU *cpu =3D OPENRISC_CPU(cs); + CPUOpenRISCState *env =3D &cpu->env; int i; - uint32_t *regs =3D env->gpr; + cpu_fprintf(f, "PC=3D%08x\n", env->pc); for (i =3D 0; i < 32; ++i) { - cpu_fprintf(f, "R%02d=3D%08x%c", i, regs[i], + cpu_fprintf(f, "R%02d=3D%08x%c", i, env->gpr[i], (i % 4) =3D=3D 3 ? '\n' : ' '); } } diff --git a/target-ppc/cpu-qom.h b/target-ppc/cpu-qom.h index eb03a00..84ba105 100644 --- a/target-ppc/cpu-qom.h +++ b/target-ppc/cpu-qom.h @@ -101,5 +101,9 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState= *env) PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr); =20 void ppc_cpu_do_interrupt(CPUState *cpu); +void ppc_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fpr= intf, + int flags); +void ppc_cpu_dump_statistics(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 076cdac..3643863 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -9526,15 +9526,17 @@ GEN_SPEOP_LDST(evstwwo, 0x1E, 2), =20 /***********************************************************************= ******/ /* Misc PowerPC helpers */ -void cpu_dump_state (CPUPPCState *env, FILE *f, fprintf_function cpu_fpr= intf, - int flags) +void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpri= ntf, + int flags) { #define RGPL 4 #define RFPL 4 =20 + PowerPCCPU *cpu =3D POWERPC_CPU(cs); + CPUPPCState *env =3D &cpu->env; int i; =20 - cpu_synchronize_state(CPU(ppc_env_get_cpu(env))); + cpu_synchronize_state(cs); =20 cpu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR " TARGET_FMT_lx " XER " TARGET_FMT_lx "\n", @@ -9675,14 +9677,15 @@ void cpu_dump_state (CPUPPCState *env, FILE *f, f= printf_function cpu_fprintf, #undef RFPL } =20 -void cpu_dump_statistics (CPUPPCState *env, FILE*f, fprintf_function cpu= _fprintf, - int flags) +void ppc_cpu_dump_statistics(CPUState *cs, FILE*f, + fprintf_function cpu_fprintf, int flags) { #if defined(DO_PPC_STATISTICS) + PowerPCCPU *cpu =3D POWERPC_CPU(cs); opc_handler_t **t1, **t2, **t3, *handler; int op1, op2, op3; =20 - t1 =3D env->opcodes; + t1 =3D cpu->env.opcodes; for (op1 =3D 0; op1 < 64; op1++) { handler =3D t1[op1]; if (is_indirect_opcode(handler)) { diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 021a31e..0edb336 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -8309,6 +8309,8 @@ static void ppc_cpu_class_init(ObjectClass *oc, voi= d *data) =20 cc->class_by_name =3D ppc_cpu_class_by_name; cc->do_interrupt =3D ppc_cpu_do_interrupt; + cc->dump_state =3D ppc_cpu_dump_state; + cc->dump_statistics =3D ppc_cpu_dump_statistics; } =20 static const TypeInfo ppc_cpu_type_info =3D { diff --git a/target-s390x/cpu-qom.h b/target-s390x/cpu-qom.h index 34d45c2..ec32d21 100644 --- a/target-s390x/cpu-qom.h +++ b/target-s390x/cpu-qom.h @@ -72,5 +72,7 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *= env) #define ENV_OFFSET offsetof(S390CPU, env) =20 void s390_cpu_do_interrupt(CPUState *cpu); +void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fp= rintf, + int flags); =20 #endif diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index 23fe51f..8ec2f9b 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -170,6 +170,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void= *data) cc->reset =3D s390_cpu_reset; =20 cc->do_interrupt =3D s390_cpu_do_interrupt; + cc->dump_state =3D s390_cpu_dump_state; dc->vmsd =3D &vmstate_s390_cpu; } =20 diff --git a/target-s390x/translate.c b/target-s390x/translate.c index f97e431..cd9880e 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -86,9 +86,11 @@ static uint64_t pc_to_link_info(DisasContext *s, uint6= 4_t pc) return pc; } =20 -void cpu_dump_state(CPUS390XState *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void s390_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fpr= intf, + int flags) { + S390CPU *cpu =3D S390_CPU(cs); + CPUS390XState *env =3D &cpu->env; int i; =20 if (env->cc_op > 3) { diff --git a/target-sh4/cpu-qom.h b/target-sh4/cpu-qom.h index f8c80d3..01d1637 100644 --- a/target-sh4/cpu-qom.h +++ b/target-sh4/cpu-qom.h @@ -84,5 +84,7 @@ static inline SuperHCPU *sh_env_get_cpu(CPUSH4State *en= v) #define ENV_OFFSET offsetof(SuperHCPU, env) =20 void superh_cpu_do_interrupt(CPUState *cpu); +void superh_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-sh4/cpu.c b/target-sh4/cpu.c index 898aecd..a7d5213 100644 --- a/target-sh4/cpu.c +++ b/target-sh4/cpu.c @@ -274,6 +274,7 @@ static void superh_cpu_class_init(ObjectClass *oc, vo= id *data) =20 cc->class_by_name =3D superh_cpu_class_by_name; cc->do_interrupt =3D superh_cpu_do_interrupt; + cc->dump_state =3D superh_cpu_dump_state; dc->vmsd =3D &vmstate_sh_cpu; } =20 diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 14fdb8f..292c9e9 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -150,10 +150,11 @@ void sh4_translate_init(void) done_init =3D 1; } =20 -void cpu_dump_state(CPUSH4State * env, FILE * f, - int (*cpu_fprintf) (FILE * f, const char *fmt, ...), - int flags) +void superh_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) { + SuperHCPU *cpu =3D SUPERH_CPU(cs); + CPUSH4State *env =3D &cpu->env; int i; cpu_fprintf(f, "pc=3D0x%08x sr=3D0x%08x pr=3D0x%08x fpscr=3D0x%08x\n= ", env->pc, env->sr, env->pr, env->fpscr); diff --git a/target-sparc/cpu-qom.h b/target-sparc/cpu-qom.h index d4fe89e..97c1ec7 100644 --- a/target-sparc/cpu-qom.h +++ b/target-sparc/cpu-qom.h @@ -76,5 +76,7 @@ static inline SPARCCPU *sparc_env_get_cpu(CPUSPARCState= *env) #define ENV_OFFSET offsetof(SPARCCPU, env) =20 void sparc_cpu_do_interrupt(CPUState *cpu); +void sparc_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-sparc/cpu.c b/target-sparc/cpu.c index 13bb7bb..72700cd 100644 --- a/target-sparc/cpu.c +++ b/target-sparc/cpu.c @@ -660,9 +660,11 @@ static void cpu_print_cc(FILE *f, fprintf_function c= pu_fprintf, #define REGS_PER_LINE 8 #endif =20 -void cpu_dump_state(CPUSPARCState *env, FILE *f, fprintf_function cpu_fp= rintf, - int flags) +void sparc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fp= rintf, + int flags) { + SPARCCPU *cpu =3D SPARC_CPU(cs); + CPUSPARCState *env =3D &cpu->env; int i, x; =20 cpu_fprintf(f, "pc: " TARGET_FMT_lx " npc: " TARGET_FMT_lx "\n", en= v->pc, @@ -771,6 +773,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, voi= d *data) cc->reset =3D sparc_cpu_reset; =20 cc->do_interrupt =3D sparc_cpu_do_interrupt; + cc->dump_state =3D sparc_cpu_dump_state; } =20 static const TypeInfo sparc_cpu_type_info =3D { diff --git a/target-unicore32/cpu-qom.h b/target-unicore32/cpu-qom.h index ba4dee4..7eec448 100644 --- a/target-unicore32/cpu-qom.h +++ b/target-unicore32/cpu-qom.h @@ -61,5 +61,7 @@ static inline UniCore32CPU *uc32_env_get_cpu(CPUUniCore= 32State *env) #define ENV_OFFSET offsetof(UniCore32CPU, env) =20 void uc32_cpu_do_interrupt(CPUState *cpu); +void uc32_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c index 66a1a74..1a97e6b 100644 --- a/target-unicore32/cpu.c +++ b/target-unicore32/cpu.c @@ -133,6 +133,7 @@ static void uc32_cpu_class_init(ObjectClass *oc, void= *data) =20 cc->class_by_name =3D uc32_cpu_class_by_name; cc->do_interrupt =3D uc32_cpu_do_interrupt; + cc->dump_state =3D uc32_cpu_dump_state; dc->vmsd =3D &vmstate_uc32_cpu; } =20 diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 3dc7856..e1fe4e6 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -2113,9 +2113,11 @@ static void cpu_dump_state_ucf64(CPUUniCore32State= *env, FILE *f, #define cpu_dump_state_ucf64(env, file, pr, flags) do { } while (0) #endif =20 -void cpu_dump_state(CPUUniCore32State *env, FILE *f, - fprintf_function cpu_fprintf, int flags) +void uc32_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) { + UniCore32CPU *cpu =3D UNICORE32_CPU(cs); + CPUUniCore32State *env =3D &cpu->env; int i; uint32_t psr; =20 diff --git a/target-xtensa/cpu-qom.h b/target-xtensa/cpu-qom.h index af0ce28..30506cf 100644 --- a/target-xtensa/cpu-qom.h +++ b/target-xtensa/cpu-qom.h @@ -81,5 +81,7 @@ static inline XtensaCPU *xtensa_env_get_cpu(const CPUXt= ensaState *env) #define ENV_OFFSET offsetof(XtensaCPU, env) =20 void xtensa_cpu_do_interrupt(CPUState *cpu); +void xtensa_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); =20 #endif diff --git a/target-xtensa/cpu.c b/target-xtensa/cpu.c index 6e93dd8..b5df321 100644 --- a/target-xtensa/cpu.c +++ b/target-xtensa/cpu.c @@ -102,6 +102,7 @@ static void xtensa_cpu_class_init(ObjectClass *oc, vo= id *data) cc->reset =3D xtensa_cpu_reset; =20 cc->do_interrupt =3D xtensa_cpu_do_interrupt; + cc->dump_state =3D xtensa_cpu_dump_state; dc->vmsd =3D &vmstate_xtensa_cpu; } =20 diff --git a/target-xtensa/op_helper.c b/target-xtensa/op_helper.c index 1037101..4c41de0 100644 --- a/target-xtensa/op_helper.c +++ b/target-xtensa/op_helper.c @@ -368,7 +368,9 @@ void HELPER(wsr_lend)(CPUXtensaState *env, uint32_t v= ) =20 void HELPER(dump_state)(CPUXtensaState *env) { - cpu_dump_state(env, stderr, fprintf, 0); + XtensaCPU *cpu =3D xtensa_env_get_cpu(env); + + cpu_dump_state(CPU(cpu), stderr, fprintf, 0); } =20 void HELPER(waiti)(CPUXtensaState *env, uint32_t pc, uint32_t intlevel) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 06d68db..dcb90a5 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -3014,9 +3014,11 @@ void gen_intermediate_code_pc(CPUXtensaState *env,= TranslationBlock *tb) gen_intermediate_code_internal(env, tb, 1); } =20 -void cpu_dump_state(CPUXtensaState *env, FILE *f, fprintf_function cpu_f= printf, - int flags) +void xtensa_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) { + XtensaCPU *cpu =3D XTENSA_CPU(cs); + CPUXtensaState *env =3D &cpu->env; int i, j; =20 cpu_fprintf(f, "PC=3D%08x\n\n", env->pc); --=20 1.8.1.4