Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2658272imu; Sat, 10 Nov 2018 21:04:10 -0800 (PST) X-Google-Smtp-Source: AJdET5diJQGnRV+LwhyU2GFs/6BLdOqrThFyxlNJzkz4JhBIyN25Jpo0BjR5exWfwY4+nFNHsqlY X-Received: by 2002:a17:902:4083:: with SMTP id c3-v6mr15263293pld.181.1541912650300; Sat, 10 Nov 2018 21:04:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541912650; cv=none; d=google.com; s=arc-20160816; b=KA35jrbhNngLDx9ZTH688dUbpPW1INIiUJjKPlowok5McbkmZp19Dsa3LPuJTv5Bkv aErTWN7empfA1zXek1LinUYyTVdD/c9n7c7y5n8IiMjkmCuLL19VcgZ+YfSh2oV7nOcu zHzTEwVyJXC7rpcEGZqmxKdEK5Ne1Ig+kqPH7tKf6jITO5sDvVwBRNlkvPIWUvaDU668 9C9dDljvZCwIDYvLp5HuEsFkcE3C3t9nVdCQqQeeGQJsDx/Mpzc6N3SbmTX/1blFuxuX 2BA/Zs/hm3x3Y5idAweK+4mD2df0FgefYCd3ho+5eduH/dkABQsID2k+H/gIW9zTHcAw gURg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=r42JAcC4xD23EwVm77cfqI4lnpyXT4DHtW2OTOkNuyQ=; b=Qfs8QT6dMdmBnjV2oWl5kM6SeeGE7AFZFl0CPdqCz8ub795byKjO6MonCIOfkJ04i+ bdcxpGLG0CEWxUnVwVj5aoGNOwpANL9jg7VR8UkcTHuhqgdf3M9l5ydGzFQ/1ek4WVWK +YUrjqLX5m04daMDZwkx/rflVctnIl867wXOIinvuxEVVgr3jBp2eXbQXR5B0WBwJMeR 7iy0r3JHfZUQ7uaI51bbEqaAFhrx6Q76peMrPiT5eizoTn3zj+fvpeso29v88q+gLkAr ESxvWzQpK6jQSUHMMdJxUPYpVqs6dRhzMfG9BRIiv5DdV/sDPqxvgBUm92dGg6LPxgg9 1ebw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Q3mp1ml1; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f8-v6si14747739pln.368.2018.11.10.21.03.54; Sat, 10 Nov 2018 21:04:10 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Q3mp1ml1; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727602AbeKKOrz (ORCPT + 99 others); Sun, 11 Nov 2018 09:47:55 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:34333 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727184AbeKKOrz (ORCPT ); Sun, 11 Nov 2018 09:47:55 -0500 Received: by mail-wr1-f67.google.com with SMTP id j26-v6so5850046wre.1 for ; Sat, 10 Nov 2018 21:00:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=r42JAcC4xD23EwVm77cfqI4lnpyXT4DHtW2OTOkNuyQ=; b=Q3mp1ml16u22ZjAMIb4zMwp256Th9H6BpIP4qB3YeOb/Mfi2BNQ176XUbKAr8Il5K/ S+kS0uAZM8212ozC+aBjVVRdM2OdWXq5wzXFGXzCYPNknA6E/16eT+Gv/TVqYt/iz/hl muYb2k/CcP6Tad/U+AHQsBszd0NXTvL3ona8A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=r42JAcC4xD23EwVm77cfqI4lnpyXT4DHtW2OTOkNuyQ=; b=tfXFgyyFmMUXD6oonb5+Uf30qChLAN+/HTAnKyjjgs1iHM9tcfK/G3zIwbbAu4rdz+ 60Ou/+5QeXo+58GFwz7EbRkbTIR5pQrgiRKxKJFCImbEmmJiP3kLGtJ04nPspsQcaHf1 Ryr6w8mVOZ4mzHOm9Z8ckwGYwRTnN20NsmvRlAoUZjLRtcfCanqFB7rfaZnGsZP3+i6I dLa7Slg6Rg9NWD5eLiQyy39w77jj+89bxRUaac64I3bAEtg6wKkwv3etunLY0oixCDb+ AfdfvIp5xN+Iexijm2FU2NEGhQbaxs7RvNGW89DJJsmGK09Pe6Fp82c1HNhahWcRt0rJ K4nA== X-Gm-Message-State: AGRZ1gKXlsLHTjiaEL0yFqIWeTUtthnCFAuztp+trxa8aZpbC9slsyrH QyFwCKGhDDWUzB0X/5rcptvO+9zk12/+hQ== X-Received: by 2002:adf:f24d:: with SMTP id b13-v6mr12334822wrp.142.1541912425654; Sat, 10 Nov 2018 21:00:25 -0800 (PST) Received: from localhost.localdomain ([209.250.228.18]) by smtp.gmail.com with ESMTPSA id t187-v6sm4463802wmt.45.2018.11.10.21.00.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Nov 2018 21:00:24 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Mathieu Poirier , Alexander Shishkin , Jiri Olsa , Namhyung Kim , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Mike Leach , Robert Walker , Al Grant , Coresight ML Cc: Leo Yan Subject: [PATCH v1 4/5] perf cs-etm: Generate branch sample for exception packet Date: Sun, 11 Nov 2018 12:59:42 +0800 Message-Id: <1541912383-19915-5-git-send-email-leo.yan@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1541912383-19915-1-git-send-email-leo.yan@linaro.org> References: <1541912383-19915-1-git-send-email-leo.yan@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The exception packet appears as one element with 'elem_type' == OCSD_GEN_TRC_ELEM_EXCEPTION or OCSD_GEN_TRC_ELEM_EXCEPTION_RET, which present for exception entry and exit respectively. The decoder set packet fields 'packet->exc' and 'packet->exc_ret' to indicate the exception packets; but exception packets don't have dedicated sample type and shares the same sample type CS_ETM_RANGE with normal instruction packets. As result, the exception packets are taken as normal instruction packets and this introduces confusion to mix different packet types. Furthermore, these instruction range packets will be processed for branch sample only when 'packet->last_instr_taken_branch' is true, otherwise they will be omitted, this can introduce mess for exception and exception returning due we don't have complete address range info for context switching. To process exception packets properly, this patch introduce two new sample type: CS_ETM_EXCEPTION and CS_ETM_EXCEPTION_RET; for these two kind packets, they will be handled by cs_etm__exception(). The func cs_etm__exception() forces to set previous CS_ETM_RANGE packet flag 'prev_packet->last_instr_taken_branch' to true, this matches well with the program flow when the exception is trapped from user space to kernel space, no matter if the most recent flow has branch taken or not; this is also safe for returning to user space after exception handling. After exception packets have their own sample type, the packet fields 'packet->exc' and 'packet->exc_ret' aren't needed anymore, so remove them. Signed-off-by: Leo Yan --- tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 26 +++++++++++++++++------ tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 4 ++-- tools/perf/util/cs-etm.c | 28 +++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 8 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 9d52727..b8cb7a3e 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -269,8 +269,6 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder) decoder->packet_buffer[i].instr_count = 0; decoder->packet_buffer[i].last_instr_taken_branch = false; decoder->packet_buffer[i].last_instr_size = 0; - decoder->packet_buffer[i].exc = false; - decoder->packet_buffer[i].exc_ret = false; decoder->packet_buffer[i].cpu = INT_MIN; } } @@ -298,8 +296,6 @@ cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder, decoder->packet_buffer[et].sample_type = sample_type; decoder->packet_buffer[et].isa = CS_ETM_ISA_UNKNOWN; - decoder->packet_buffer[et].exc = false; - decoder->packet_buffer[et].exc_ret = false; decoder->packet_buffer[et].cpu = *((int *)inode->priv); decoder->packet_buffer[et].start_addr = CS_ETM_INVAL_ADDR; decoder->packet_buffer[et].end_addr = CS_ETM_INVAL_ADDR; @@ -384,6 +380,22 @@ cs_etm_decoder__buffer_trace_on(struct cs_etm_decoder *decoder, CS_ETM_TRACE_ON); } +static ocsd_datapath_resp_t +cs_etm_decoder__buffer_exception(struct cs_etm_decoder *decoder, + const uint8_t trace_chan_id) +{ + return cs_etm_decoder__buffer_packet(decoder, trace_chan_id, + CS_ETM_EXCEPTION); +} + +static ocsd_datapath_resp_t +cs_etm_decoder__buffer_exception_ret(struct cs_etm_decoder *decoder, + const uint8_t trace_chan_id) +{ + return cs_etm_decoder__buffer_packet(decoder, trace_chan_id, + CS_ETM_EXCEPTION_RET); +} + static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer( const void *context, const ocsd_trc_index_t indx __maybe_unused, @@ -411,10 +423,12 @@ static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer( trace_chan_id); break; case OCSD_GEN_TRC_ELEM_EXCEPTION: - decoder->packet_buffer[decoder->tail].exc = true; + resp = cs_etm_decoder__buffer_exception(decoder, + trace_chan_id); break; case OCSD_GEN_TRC_ELEM_EXCEPTION_RET: - decoder->packet_buffer[decoder->tail].exc_ret = true; + resp = cs_etm_decoder__buffer_exception_ret(decoder, + trace_chan_id); break; case OCSD_GEN_TRC_ELEM_PE_CONTEXT: case OCSD_GEN_TRC_ELEM_EO_TRACE: 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 a38c97c..0d1c18d 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h @@ -27,6 +27,8 @@ enum cs_etm_sample_type { CS_ETM_RANGE = 1 << 0, CS_ETM_TRACE_ON = 1 << 1, CS_ETM_TRACE_OFF = 1 << 2, + CS_ETM_EXCEPTION = 1 << 3, + CS_ETM_EXCEPTION_RET = 1 << 4, }; enum cs_etm_isa { @@ -44,8 +46,6 @@ struct cs_etm_packet { u32 instr_count; u8 last_instr_taken_branch; u8 last_instr_size; - u8 exc; - u8 exc_ret; int cpu; }; diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 2a0cef9..455f132 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -961,6 +961,25 @@ static int cs_etm__sample(struct cs_etm_queue *etmq) return 0; } +static int cs_etm__exception(struct cs_etm_queue *etmq) +{ + /* + * When the exception packet is inserted, whether the last instruction + * in previous range packet is taken branch or not, we need to force + * to set 'prev_packet->last_instr_taken_branch' to true. This ensures + * to generate branch sample for the instruction range before the + * exception is trapped to kernel or before the exception returning. + * + * The exception packet includes the dummy address values, so don't + * swap PACKET with PREV_PACKET. This keeps PREV_PACKET to be useful + * for generating instruction and branch samples. + */ + if (etmq->prev_packet->sample_type == CS_ETM_RANGE) + etmq->prev_packet->last_instr_taken_branch = true; + + return 0; +} + static int cs_etm__flush(struct cs_etm_queue *etmq, bool new_packet) { int err = 0; @@ -1090,6 +1109,15 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) */ cs_etm__sample(etmq); break; + case CS_ETM_EXCEPTION: + case CS_ETM_EXCEPTION_RET: + /* + * If the exception packet is coming, + * make sure the previous instruction + * range packet to be handled properly. + */ + cs_etm__exception(etmq); + break; case CS_ETM_TRACE_ON: case CS_ETM_TRACE_OFF: /* -- 2.7.4