On Wed, Jan 09, 2019 at 07:37:03PM +0800, Leo Yan wrote:
When an exception packet comes, it contains the information for exception number; the exception number indicates the exception types, so from it we can know if the exception is taken for interrupt, system call or other traps, etc.
But exception return packet doesn't contain a valid exception number, so we cannot use the exception number for exception return packet and need to explore other methods to decide exception types for return packet.
The above paragraph is not needed to understand what is going on in this patch.
This patch simply adds a new 'exc_num' field in cs_etm_packet struct,
'exc_num' doesn't exist in struct cs_etm_packet - you called it "exception_number". Moreover there is no point in being this precise in the changelog, all you need to do is mention that you're adding a field in the cs_etm_packet struct.
it records exception number for exception packet.
... it records exception number for exception packet that will then be used to properly identify exception types to the perf synthesize mechanic.
Signed-off-by: Leo Yan leo.yan@linaro.org
.../perf/util/cs-etm-decoder/cs-etm-decoder.c | 20 +++++++++++++++---- .../perf/util/cs-etm-decoder/cs-etm-decoder.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c index 8a19310500d9..05830fe1fb70 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -293,6 +293,7 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder) decoder->packet_buffer[i].last_instr_type = 0; decoder->packet_buffer[i].last_instr_subtype = 0; decoder->packet_buffer[i].last_instr_cond = 0;
decoder->packet_buffer[i].cpu = INT_MIN; }decoder->packet_buffer[i].exception_number = UINT32_MAX;
} @@ -329,6 +330,7 @@ cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder, decoder->packet_buffer[et].last_instr_type = 0; decoder->packet_buffer[et].last_instr_subtype = 0; decoder->packet_buffer[et].last_instr_cond = 0;
- decoder->packet_buffer[et].exception_number = UINT32_MAX;
if (decoder->packet_count == MAX_BUFFER - 1) return OCSD_RESP_WAIT; @@ -404,10 +406,20 @@ cs_etm_decoder__buffer_discontinuity(struct cs_etm_decoder *decoder, static ocsd_datapath_resp_t cs_etm_decoder__buffer_exception(struct cs_etm_decoder *decoder,
const ocsd_generic_trace_elem *elem, const uint8_t trace_chan_id)
-{
- return cs_etm_decoder__buffer_packet(decoder, trace_chan_id,
CS_ETM_EXCEPTION);
+{ int ret = 0;
- struct cs_etm_packet *packet;
- ret = cs_etm_decoder__buffer_packet(decoder, trace_chan_id,
CS_ETM_EXCEPTION);
- if (ret != OCSD_RESP_CONT && ret != OCSD_RESP_WAIT)
return ret;
- packet = &decoder->packet_buffer[decoder->tail];
- packet->exception_number = elem->exception_number;
- return ret;
} static ocsd_datapath_resp_t @@ -441,7 +453,7 @@ static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer( trace_chan_id); break; case OCSD_GEN_TRC_ELEM_EXCEPTION:
resp = cs_etm_decoder__buffer_exception(decoder,
break; case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:resp = cs_etm_decoder__buffer_exception(decoder, elem, trace_chan_id);
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h index 23600e57a215..012b4728a46f 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h @@ -46,6 +46,7 @@ struct cs_etm_packet { u32 last_instr_type; u32 last_instr_subtype; u32 flags;
- u32 exception_number; u8 last_instr_cond; u8 last_instr_taken_branch; u8 last_instr_size;
-- 2.17.1