mirror of
https://github.com/hardkernel/linux.git
synced 2026-04-11 07:28:10 +09:00
This patch adds the required mechanic to quickly lookup the CPU number
associated with a traceID. That way the CPU that executed the code
conveyed by a decoded packet can be identified, without having to
do unecessary translations.
Using this new functionality the "cs-trace-disasm.py" script is
enhanced to output the file and CPU number the code has been
executed on:
FILE: /lib/aarch64-linux-gnu/ld-2.21.so CPU: 3
7fab57fd80: 910003e0 mov x0, sp
7fab57fd84: 94000d53 bl 7fab5832d0 <free@plt+0x3790>
FILE: /lib/aarch64-linux-gnu/ld-2.21.so CPU: 3
7fab5832d0: d11203ff sub sp, sp, #0x480
FILE: /lib/aarch64-linux-gnu/ld-2.21.so CPU: 3
7fab5832d4: a9ba7bfd stp x29, x30, [sp,#-96]!
7fab5832d8: 910003fd mov x29, sp
7fab5832dc: a90363f7 stp x23, x24, [sp,#48]
7fab5832e0: 9101e3b7 add x23, x29, #0x78
7fab5832e4: a90573fb stp x27, x28, [sp,#80]
7fab5832e8: a90153f3 stp x19, x20, [sp,#16]
7fab5832ec: aa0003fb mov x27, x0
7fab5832f0: 910a82e1 add x1, x23, #0x2a0
7fab5832f4: a9025bf5 stp x21, x22, [sp,#32]
7fab5832f8: a9046bf9 stp x25, x26, [sp,#64]
7fab5832fc: 910102e0 add x0, x23, #0x40
7fab583300: f800841f str xzr, [x0],#8
7fab583304: eb01001f cmp x0, x1
7fab583308: 54ffffc1 b.ne 7fab583300 <free@plt+0x37c0>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
/*
|
|
* Copyright(C) 2015 Linaro Limited. All rights reserved.
|
|
* Author: Mathieu Poirier <mathieu.poirier@linaro.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published by
|
|
* the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef INCLUDE__UTIL_PERF_CS_ETM_H__
|
|
#define INCLUDE__UTIL_PERF_CS_ETM_H__
|
|
|
|
#include "util/event.h"
|
|
#include "util/intlist.h"
|
|
#include "util/session.h"
|
|
|
|
/* Versionning header in case things need tro change in the future. That way
|
|
* decoding of old snapshot is still possible.
|
|
*/
|
|
enum {
|
|
/* Starting with 0x0 */
|
|
CS_HEADER_VERSION_0,
|
|
/* PMU->type (32 bit), total # of CPUs (32 bit) */
|
|
CS_PMU_TYPE_CPUS,
|
|
CS_ETM_SNAPSHOT,
|
|
CS_HEADER_VERSION_0_MAX,
|
|
};
|
|
|
|
/* Beginning of header common to both ETMv3 and V4 */
|
|
enum {
|
|
CS_ETM_MAGIC,
|
|
CS_ETM_CPU,
|
|
};
|
|
|
|
/* ETMv3/PTM metadata */
|
|
enum {
|
|
/* Dynamic, configurable parameters */
|
|
CS_ETM_ETMCR = CS_ETM_CPU + 1,
|
|
CS_ETM_ETMTRACEIDR,
|
|
/* RO, taken from sysFS */
|
|
CS_ETM_ETMCCER,
|
|
CS_ETM_ETMIDR,
|
|
CS_ETM_PRIV_MAX,
|
|
};
|
|
|
|
/* ETMv4 metadata */
|
|
enum {
|
|
/* Dynamic, configurable parameters */
|
|
CS_ETMV4_TRCCONFIGR = CS_ETM_CPU + 1,
|
|
CS_ETMV4_TRCTRACEIDR,
|
|
/* RO, taken from sysFS */
|
|
CS_ETMV4_TRCIDR0,
|
|
CS_ETMV4_TRCIDR1,
|
|
CS_ETMV4_TRCIDR2,
|
|
CS_ETMV4_TRCIDR8,
|
|
CS_ETMV4_TRCAUTHSTATUS,
|
|
CS_ETMV4_PRIV_MAX,
|
|
};
|
|
|
|
/* RB tree for quick conversion between traceID and CPUs */
|
|
struct intlist *traceid_list;
|
|
|
|
#define KiB(x) ((x) * 1024)
|
|
#define MiB(x) ((x) * 1024 * 1024)
|
|
|
|
#define CS_ETM_HEADER_SIZE (CS_HEADER_VERSION_0_MAX * sizeof(u64))
|
|
|
|
static const u64 __perf_cs_etmv3_magic = 0x3030303030303030ULL;
|
|
static const u64 __perf_cs_etmv4_magic = 0x4040404040404040ULL;
|
|
#define CS_ETMV3_PRIV_SIZE (CS_ETM_PRIV_MAX * sizeof(u64))
|
|
#define CS_ETMV4_PRIV_SIZE (CS_ETMV4_PRIV_MAX * sizeof(u64))
|
|
|
|
int cs_etm__process_auxtrace_info(union perf_event *event,
|
|
struct perf_session *session);
|
|
|
|
#endif
|