|
@@ -924,8 +924,14 @@ static int cs_etm__flush(struct cs_etm_queue *etmq)
|
|
|
int err = 0;
|
|
|
struct cs_etm_packet *tmp;
|
|
|
|
|
|
+ if (!etmq->prev_packet)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /* Handle start tracing packet */
|
|
|
+ if (etmq->prev_packet->sample_type == CS_ETM_EMPTY)
|
|
|
+ goto swap_packet;
|
|
|
+
|
|
|
if (etmq->etm->synth_opts.last_branch &&
|
|
|
- etmq->prev_packet &&
|
|
|
etmq->prev_packet->sample_type == CS_ETM_RANGE) {
|
|
|
/*
|
|
|
* Generate a last branch event for the branches left in the
|
|
@@ -944,6 +950,10 @@ static int cs_etm__flush(struct cs_etm_queue *etmq)
|
|
|
|
|
|
etmq->period_instructions = 0;
|
|
|
|
|
|
+ }
|
|
|
+
|
|
|
+swap_packet:
|
|
|
+ if (etmq->etm->synth_opts.last_branch) {
|
|
|
/*
|
|
|
* Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
|
|
|
* the next incoming packet.
|
|
@@ -1023,6 +1033,13 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
|
|
|
*/
|
|
|
cs_etm__flush(etmq);
|
|
|
break;
|
|
|
+ case CS_ETM_EMPTY:
|
|
|
+ /*
|
|
|
+ * Should not receive empty packet,
|
|
|
+ * report error.
|
|
|
+ */
|
|
|
+ pr_err("CS ETM Trace: empty packet\n");
|
|
|
+ return -EINVAL;
|
|
|
default:
|
|
|
break;
|
|
|
}
|