Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3783708imu; Fri, 18 Jan 2019 17:46:25 -0800 (PST) X-Google-Smtp-Source: ALg8bN7U9HvMejOoBc6JcT4yUVMregb3uByw1ELS3FOdE9vc/Sjm3GdFb3FYRDp5HDZB1LCmltwu X-Received: by 2002:a63:902:: with SMTP id 2mr18812959pgj.219.1547862385893; Fri, 18 Jan 2019 17:46:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547862385; cv=none; d=google.com; s=arc-20160816; b=H/vkjVPGH5yHACt09op9mC3i23i1vsMIvDp04mkT3InCHdnp89GRoZf5ShSrUQseHb EB+oObf3FVINR8i0llo/H40aMgH06WSLfrryRg3j32O9gVZVn9q5VWuHi1k4NoTxWa4U Js9j48eHShUlYwFiM5PLOqNI+s6ixtdAf1t1BqAGi7e44myoB6ivZbqxDGBuPxps2koY 3ZhTKqJxp+WyqxTAt0Y9pBUCGToFoCknVw+MhRClxr7jvis9JqRGSnmu0fiz97EOz1QZ 89318vhyRnBklerycUGCVgjZFuMQSm5NhXnNP6fWyGH7HcCwD/0afx7xX8PseLECAqy0 9P5A== 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=XJIZCAPULyAuE6ru9p7H4wc2p68zHe0RBmLv7q7ns4s=; b=lRYNSo+NZs8lKzeHWVMh0KZMuEXIj4AqdJ0+qJT3Qc/SCSvxdX1lSBIG5TlaCZfr2L 5kJREM3ymawYxCnJcsyvroF+F3OCx00Q8REajJL7+a0hCkLNNCKbTDPXI/dwoEhIZk71 Uv+ZDZ8iwnGOrm5VNbG6cTT9xJMEGJqWom13e/CnG+Wtc7j2PE4SnD4b6oGthZwYqY0K znfP4Fo6AK7khh3T7inKZ/Ahg2Qpiq0NjlrExAib8oxi0iAHyIWgZPBzh1hOwQWR3dL9 qvzRKqTPH99oOuwbL2zUb5H52SaWl2SsayhXqpH5QQdlU6bsCRw5f7u5MsmdL36mSZ3o hseA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=jxwOsEBj; 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 h9si6039582pli.418.2019.01.18.17.45.53; Fri, 18 Jan 2019 17:46:25 -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=jxwOsEBj; 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 S1730156AbfASBoO (ORCPT + 99 others); Fri, 18 Jan 2019 20:44:14 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:33686 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727713AbfASBoN (ORCPT ); Fri, 18 Jan 2019 20:44:13 -0500 Received: by mail-pl1-f195.google.com with SMTP id z23so7114324plo.0 for ; Fri, 18 Jan 2019 17:44:13 -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=XJIZCAPULyAuE6ru9p7H4wc2p68zHe0RBmLv7q7ns4s=; b=jxwOsEBjpjW0GJM/td1qH6zm7wudD+4sCp+8LXIz47JqSIhwAYsVSdJMNFpmXa/Gla gXQ8sbU+tXqH2huWye7ZW+i+yzoLz/8MHpjFQXGqqXrsWCjt/7/K9XlkWQuPD4IwL78R 9GKQY/WlRP/b+G0i5FVvT3xxK9hJP5yXG0u/M= 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=XJIZCAPULyAuE6ru9p7H4wc2p68zHe0RBmLv7q7ns4s=; b=N20tDkKTGjDtx6GosHhxQvCpQMFV4RIN/Sy5O0UDy+cMYHcUMbbY4YHFdylWJ9zW4c ZWgYxbqH+wrkLrgKbJycxiJlwZwi7udKkJVo5LmBompRrrzvSgC80fTuUe69KHS3KpL/ r31nWyjdQJ9FDTKvBnxc095qnjn1NQil7ZRyDNJ8RQTHuZHo1JFBQa7MGRwRdNxUCgbH +ziSO7WFcUKMhlxIDwKAZl+UwsEIHrZ58byY1U3wrdAOyl0y+5aeShOCwd4uAYOIog7Q Bk5pYLbnE4MYsaNIXjSevPmlv5352UKssZUpr7Muf2H25iuZXoP4z1DyUTcpAdP6gt7Z qnKA== X-Gm-Message-State: AJcUukfy47ljqZEH83oRB7+x1pbUzEd7VL0qH3ODyiL5L3CGJ361HRnp zn6e6kkYkaoGRnT/WDThzH9QZQ== X-Received: by 2002:a17:902:b48b:: with SMTP id y11mr20633017plr.200.1547862252857; Fri, 18 Jan 2019 17:44:12 -0800 (PST) Received: from localhost.localdomain (li421-24.members.linode.com. [50.116.3.24]) by smtp.gmail.com with ESMTPSA id d21sm8648436pfo.162.2019.01.18.17.44.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Jan 2019 17:44:12 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Mathieu Poirier , Suzuki K Poulose , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Mike Leach , Robert Walker , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Coresight ML Cc: Leo Yan Subject: [PATCH v6 2/8] perf cs-etm: Set sample flags for instruction range packet Date: Sat, 19 Jan 2019 09:43:41 +0800 Message-Id: <20190119014347.27441-3-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190119014347.27441-1-leo.yan@linaro.org> References: <20190119014347.27441-1-leo.yan@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The perf sample data contains flags to indicate the hardware trace data is belonging to which type branch instruction, thus this can be used to print out the human readable string. Arm CoreSight ETM sample data is missed to set flags and it is always set to zeros, this results in perf tool skips to print string for instruction types. This patch is to set branch instruction flags for instruction range packet. Signed-off-by: Leo Yan --- .../perf/util/cs-etm-decoder/cs-etm-decoder.c | 2 + .../perf/util/cs-etm-decoder/cs-etm-decoder.h | 1 + tools/perf/util/cs-etm.c | 90 ++++++++++++++++++- 3 files changed, 91 insertions(+), 2 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..e98ee49a1527 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].flags = 0; decoder->packet_buffer[i].cpu = INT_MIN; } } @@ -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].flags = 0; if (decoder->packet_count == MAX_BUFFER - 1) return OCSD_RESP_WAIT; 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 7cdd6a9c68a7..23600e57a215 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h @@ -45,6 +45,7 @@ struct cs_etm_packet { u32 instr_count; u32 last_instr_type; u32 last_instr_subtype; + u32 flags; u8 last_instr_cond; u8 last_instr_taken_branch; u8 last_instr_size; diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 27a374ddf661..d05cac5295f1 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -12,6 +12,7 @@ #include #include +#include #include #include "auxtrace.h" @@ -719,7 +720,7 @@ static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq, sample.stream_id = etmq->etm->instructions_id; sample.period = period; sample.cpu = etmq->packet->cpu; - sample.flags = 0; + sample.flags = etmq->prev_packet->flags; sample.insn_len = 1; sample.cpumode = event->sample.header.misc; @@ -778,7 +779,7 @@ static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq) sample.stream_id = etmq->etm->branches_id; sample.period = 1; sample.cpu = etmq->packet->cpu; - sample.flags = 0; + sample.flags = etmq->prev_packet->flags; sample.cpumode = event->sample.header.misc; /* @@ -1107,6 +1108,80 @@ static int cs_etm__end_block(struct cs_etm_queue *etmq) return 0; } +static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq) +{ + struct cs_etm_packet *packet = etmq->packet; + + switch (packet->sample_type) { + case CS_ETM_RANGE: + /* + * Immediate branch instruction without neither link nor + * return flag, it's normal branch instruction within + * the function. + */ + if (packet->last_instr_type == OCSD_INSTR_BR && + packet->last_instr_subtype == OCSD_S_INSTR_NONE) { + packet->flags = PERF_IP_FLAG_BRANCH; + + if (packet->last_instr_cond) + packet->flags |= PERF_IP_FLAG_CONDITIONAL; + } + + /* + * Immediate branch instruction with link (e.g. BL), this is + * branch instruction for function call. + */ + if (packet->last_instr_type == OCSD_INSTR_BR && + packet->last_instr_subtype == OCSD_S_INSTR_BR_LINK) + packet->flags = PERF_IP_FLAG_BRANCH | + PERF_IP_FLAG_CALL; + + /* + * Indirect branch instruction with link (e.g. BLR), this is + * branch instruction for function call. + */ + if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT && + packet->last_instr_subtype == OCSD_S_INSTR_BR_LINK) + packet->flags = PERF_IP_FLAG_BRANCH | + PERF_IP_FLAG_CALL; + + /* + * Indirect branch instruction with subtype of + * OCSD_S_INSTR_V7_IMPLIED_RET, this is explicit hint for + * function return for A32/T32. + */ + if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT && + packet->last_instr_subtype == OCSD_S_INSTR_V7_IMPLIED_RET) + packet->flags = PERF_IP_FLAG_BRANCH | + PERF_IP_FLAG_RETURN; + + /* + * Indirect branch instruction without link (e.g. BR), usually + * this is used for function return, especially for functions + * within dynamic link lib. + */ + if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT && + packet->last_instr_subtype == OCSD_S_INSTR_NONE) + packet->flags = PERF_IP_FLAG_BRANCH | + PERF_IP_FLAG_RETURN; + + /* Return instruction for function return. */ + if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT && + packet->last_instr_subtype == OCSD_S_INSTR_V8_RET) + packet->flags = PERF_IP_FLAG_BRANCH | + PERF_IP_FLAG_RETURN; + break; + case CS_ETM_DISCONTINUITY: + case CS_ETM_EXCEPTION: + case CS_ETM_EXCEPTION_RET: + case CS_ETM_EMPTY: + default: + break; + } + + return 0; +} + static int cs_etm__run_decoder(struct cs_etm_queue *etmq) { struct cs_etm_auxtrace *etm = etmq->etm; @@ -1158,6 +1233,17 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) */ break; + /* + * Since packet addresses are swapped in packet + * handling within below switch() statements, + * thus setting sample flags must be called + * prior to switch() statement to use address + * information before packets swapping. + */ + err = cs_etm__set_sample_flags(etmq); + if (err < 0) + break; + switch (etmq->packet->sample_type) { case CS_ETM_RANGE: /* -- 2.17.1