From 281acb494fbf9490b86aa7c6e8593e9639335b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Tue, 15 Feb 2022 10:09:29 +0100 Subject: [PATCH] store t32/a32 mode when tracing arm This stores, for each frame, the information whether thumb mode is used, so tools reading the traces will be able to select the right disassembler to use for each individual instruction when interworking code is traced. --- include/trace_consts.h | 2 +- include/tracewrap.h | 2 +- target/arm/helper.h | 1 + target/arm/trace_helper.c | 4 ++++ target/arm/translate.c | 4 ++++ tracewrap.c | 7 +++++++ 6 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/trace_consts.h b/include/trace_consts.h index 8010118eca96..cb08f746bb11 100644 --- a/include/trace_consts.h +++ b/include/trace_consts.h @@ -10,4 +10,4 @@ const uint64_t bfd_machine_offset = 24LL; const uint64_t num_trace_frames_offset = 32LL; const uint64_t toc_offset_offset = 40LL; const uint64_t first_frame_offset = 48LL; -const uint64_t out_trace_version = 2LL; +const uint64_t out_trace_version = 3LL; diff --git a/include/tracewrap.h b/include/tracewrap.h index c7760c934fcb..c23eb22b9330 100644 --- a/include/tracewrap.h +++ b/include/tracewrap.h @@ -9,7 +9,6 @@ #include "frame.piqi.pb-c.h" - /** initializes trace subsystem. All pointers are owned by the caller. @@ -39,6 +38,7 @@ void qemu_trace_init(const char *filename, const char *targetname, char **target_envp); void qemu_trace_newframe(target_ulong addr, int tread_id); void qemu_trace_add_operand(OperandInfo *oi, int inout); +void qemu_trace_set_mode(const char *mode_str); void qemu_trace_endframe(CPUArchState *env, target_ulong pc, target_ulong size); void qemu_trace_finish(uint32_t exit_code); diff --git a/target/arm/helper.h b/target/arm/helper.h index 6d35c9143781..fa039c2f6368 100644 --- a/target/arm/helper.h +++ b/target/arm/helper.h @@ -73,6 +73,7 @@ DEF_HELPER_3(trace_cpsr_write, void, env, i32, i32) DEF_HELPER_1(trace_cpsr_read, i32, env) DEF_HELPER_1(log_read_cpsr, void, env) DEF_HELPER_1(log_store_cpsr, void, env) +DEF_HELPER_1(trace_mode, void, ptr) #endif //HAS_TRACEWRAP DEF_HELPER_3(v7m_msr, void, env, i32, i32) diff --git a/target/arm/trace_helper.c b/target/arm/trace_helper.c index aba0e7cff1bb..5b73895ed4a3 100644 --- a/target/arm/trace_helper.c +++ b/target/arm/trace_helper.c @@ -260,3 +260,7 @@ void HELPER(trace_st64)(CPUARMState *env, uint64_t val, uint32_t addr, uint32_t OperandInfo *oi = load_store_mem(addr, 1, &val, len); qemu_trace_add_operand(oi, 0x2); } + +void HELPER(trace_mode)(void *mode) { + qemu_trace_set_mode(mode); +} diff --git a/target/arm/translate.c b/target/arm/translate.c index d3844b60aa0b..611383bedeed 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -67,6 +67,7 @@ static const char * const regnames[] = #ifdef HAS_TRACEWRAP +#include /* Set to 1 if cpsr contents have already been written for the current instruction. */ static int loaded_cpsr = 0; /* Set to 1 if an instruction affects cpsr. */ @@ -2672,6 +2673,9 @@ static inline void gen_trace_newframe(DisasContext *s) TCGv t = tcg_const_i32(s->pc_curr); gen_helper_trace_newframe(t); tcg_temp_free(t); + TCGv_ptr mt = tcg_const_ptr(s->thumb ? FRAME_MODE_ARM_T32 : FRAME_MODE_ARM_A32); + gen_helper_trace_mode(mt); + tcg_temp_free_ptr(mt); trace_instr_state_reset(); } diff --git a/tracewrap.c b/tracewrap.c index cde3a2530b56..a6d96a0e1326 100644 --- a/tracewrap.c +++ b/tracewrap.c @@ -317,6 +317,13 @@ void qemu_trace_add_operand(OperandInfo *oi, int inout) { ol->elem[ol->n_elem - 1] = oi; } +void qemu_trace_set_mode(const char *mode_str) { + if (!open_frame) { + return; + } + g_frame->std_frame->mode = (char *)mode_str; +} + void qemu_trace_endframe(CPUArchState *env, target_ulong pc, target_ulong size) { int i = 0; StdFrame *sframe = g_frame->std_frame;