From patchwork Mon Dec 10 08:53:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 153249 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp3327457ljp; Mon, 10 Dec 2018 00:53:48 -0800 (PST) X-Google-Smtp-Source: AFSGD/Xfhd3WDd14dX9RAWjY69mrhavEa9T/m6/8m6nMKVM6l03rmmKMJEq7zTlb87EYp0M/kjwL X-Received: by 2002:a63:a611:: with SMTP id t17mr10005335pge.338.1544432028767; Mon, 10 Dec 2018 00:53:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544432028; cv=none; d=google.com; s=arc-20160816; b=zBP5PLvxRRQPLO6HwMr1rSZpg5XQiQZxPtl05cCiRHO5WRD5bsQzgSWmCHujvjTJe2 vIzMXXZcia3qMVROonzaA3u6ExwRt611V9DASbSdpoul+IOQBNw14skLD38raUYoBlhN ztqlyfROnspfUkHCuxTMayV4UtyPXRS6WaI7066NE6CD1YQhoyaPn6HMDpBd8rsk3ySj qfaNrHvd0UJXcJsXWruDmhAcIlOa9RRSO30KVtXWng51JZtCqqJbAQn60m2v2MQpPQoD BgFbvyJCOc10k6Eu1RCH6lf1rgyRhzy2hz9dg0OeOWgkgueTPjapRS2+nIvtsBVqKdRG rJng== 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=wBtMgTL4LtL1DJrDKLwYryYgavh17FPkWFnVB2zuBc4=; b=oIHnzNOh1jPh33izRC6BzatK82YLkHhTF9MVn4lfLK9bVfxHEcjCXTDOlkbNRrFATZ HOonLk468FBP85/2YdjAZQ4WK+XhcfwA29fe9l/8g76DI1o8sUiQJQUyO5L4lHdFF6Mv KRzjZx2udL4gRRx5gmO78XIuLTN+aJuRs2+AENLFKmltR37+rIwXaKE9TqBfP2i1Vp/g IKalHZVfKwpkZcbegMyNEzZ7JU7uNzzjBSlaxXHV/Z0kV9xgpM6K7Rl2mv2fNKSPk/A6 gQd/numLkTsyEHGNDCoev/ScdyW3kCabp2/yq1bMOeC1BIb5y/me70DoM3/zqGRuxP1W qtDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=SI4u3PnH; 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 a1si9324340pgk.495.2018.12.10.00.53.48; Mon, 10 Dec 2018 00:53:48 -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=SI4u3PnH; 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 S1726792AbeLJIxr (ORCPT + 31 others); Mon, 10 Dec 2018 03:53:47 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:36701 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726636AbeLJIxq (ORCPT ); Mon, 10 Dec 2018 03:53:46 -0500 Received: by mail-wm1-f65.google.com with SMTP id a18so10323864wmj.1 for ; Mon, 10 Dec 2018 00:53:45 -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=wBtMgTL4LtL1DJrDKLwYryYgavh17FPkWFnVB2zuBc4=; b=SI4u3PnHj0Ui8XvRsfTuB45S23mQBOET1nXbqq/Bxyi3qN9cmVj7zPjDBUN9FobUek XTkNuZ1a43RxLCzfSRnVAu2CmK0uYFHdZrobMzJy7ViVGhKerzXwji7OYQW4N5xjGwiA rXX/0NY1aDmOJN/WaMgxeWi1GCVYKRhH7L1rQ= 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=wBtMgTL4LtL1DJrDKLwYryYgavh17FPkWFnVB2zuBc4=; b=nJXwUsQuoovTULJKkbtV8ACG7cOHDnOFr0pLAMWsUMoe3wRDzaNCdrZ5NCdO9Yiooq itncuwBEYx5bvL0+GVtDGx6MJofnEBiVN2/LRA7TSKOeNRpm9FCrhC+HAvcd+znaczSl kZWnrlamL6N77NDopiRlV2k3e95uVjXxkU3F6mWh76Kd6I9+tEOb0huzA14jblXzKmrA QgC82QCed9Zaj7hcXMgbXfX9+Ps+Lrk6D1jtOSVcAu0RhmVSaS5KkJ0/HvrWVYtWmC0u rVQuiXjT7RutTDDHP/NZM9Lfh85ixq51FFNP/BqBuo+87jGFqgCsb8rLRVHBFsqgjN4Y m2Ew== X-Gm-Message-State: AA+aEWZCcFIMEo1ZEdsInEPlLO8BsrTgzq1qZRMRaARJ8q/KIYOWy5kt kse1V4rcnxQ8EcxCHaTdOUZJsg== X-Received: by 2002:a1c:6382:: with SMTP id x124-v6mr10361482wmb.145.1544432024892; Mon, 10 Dec 2018 00:53:44 -0800 (PST) Received: from localhost.localdomain ([209.250.228.18]) by smtp.gmail.com with ESMTPSA id m4sm9097351wml.2.2018.12.10.00.53.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 10 Dec 2018 00:53:44 -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, Coresight ML Cc: Leo Yan , Mike Leach , Robert Walker Subject: [PATCH v2 6/6] perf cs-etm: Generate branch sample for exception packet Date: Mon, 10 Dec 2018 16:53:01 +0800 Message-Id: <1544431981-24144-7-git-send-email-leo.yan@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544431981-24144-1-git-send-email-leo.yan@linaro.org> References: <1544431981-24144-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. Cc: Mathieu Poirier Cc: Mike Leach Cc: Robert Walker 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(-) -- 2.7.4 Reviewed-by: Mathieu Poirier 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 bcb5c98..6d89d0e 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -291,8 +291,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; } } @@ -320,8 +318,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; @@ -398,6 +394,22 @@ cs_etm_decoder__buffer_discontinuity(struct cs_etm_decoder *decoder, CS_ETM_DISCONTINUITY); } +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, @@ -426,10 +438,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_ADDR_NACC: 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 a272317..a6407d4 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h @@ -26,6 +26,8 @@ enum cs_etm_sample_type { CS_ETM_EMPTY, CS_ETM_RANGE, CS_ETM_DISCONTINUITY, + CS_ETM_EXCEPTION, + CS_ETM_EXCEPTION_RET, }; enum cs_etm_isa { @@ -43,8 +45,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 cea3158..27a374d 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -1000,6 +1000,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) { int err = 0; @@ -1148,6 +1167,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_DISCONTINUITY: /* * Discontinuity in trace, flush