mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 06:33:34 +00:00
07cf835689
Currently kernel HW tracing infrastrtucture and specifically its SyS-T part treats all source data in the same way. Treating and encoding different trace data sources differently might allow decoding software to make use of e.g. ftrace event ids by converting them to a SyS-T message catalog. The solution is to keep source type stored within stm_source_data structure to allow different handling by stm output/protocol. Currently we only differentiate between STM_USER and STM_FTRACE sources. Signed-off-by: Mikhail Lappo <miklelappo@gmail.com> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20240429130119.1518073-3-alexander.shishkin@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Simple kernel driver to link kernel Ftrace and an STM device
|
|
* Copyright (c) 2016, Linaro Ltd.
|
|
*
|
|
* STM Ftrace will be registered as a trace_export.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/stm.h>
|
|
#include <linux/trace.h>
|
|
|
|
#define STM_FTRACE_NR_CHANNELS 1
|
|
#define STM_FTRACE_CHAN 0
|
|
|
|
static int stm_ftrace_link(struct stm_source_data *data);
|
|
static void stm_ftrace_unlink(struct stm_source_data *data);
|
|
|
|
static struct stm_ftrace {
|
|
struct stm_source_data data;
|
|
struct trace_export ftrace;
|
|
} stm_ftrace = {
|
|
.data = {
|
|
.name = "ftrace",
|
|
.nr_chans = STM_FTRACE_NR_CHANNELS,
|
|
.type = STM_FTRACE,
|
|
.link = stm_ftrace_link,
|
|
.unlink = stm_ftrace_unlink,
|
|
},
|
|
};
|
|
|
|
/**
|
|
* stm_ftrace_write() - write data to STM via 'stm_ftrace' source
|
|
* @buf: buffer containing the data packet
|
|
* @len: length of the data packet
|
|
*/
|
|
static void notrace
|
|
stm_ftrace_write(struct trace_export *export, const void *buf, unsigned int len)
|
|
{
|
|
struct stm_ftrace *stm = container_of(export, struct stm_ftrace, ftrace);
|
|
/* This is called from trace system with preemption disabled */
|
|
unsigned int cpu = smp_processor_id();
|
|
|
|
stm_source_write(&stm->data, STM_FTRACE_CHAN + cpu, buf, len);
|
|
}
|
|
|
|
static int stm_ftrace_link(struct stm_source_data *data)
|
|
{
|
|
struct stm_ftrace *sf = container_of(data, struct stm_ftrace, data);
|
|
|
|
sf->ftrace.write = stm_ftrace_write;
|
|
sf->ftrace.flags = TRACE_EXPORT_FUNCTION | TRACE_EXPORT_EVENT
|
|
| TRACE_EXPORT_MARKER;
|
|
|
|
return register_ftrace_export(&sf->ftrace);
|
|
}
|
|
|
|
static void stm_ftrace_unlink(struct stm_source_data *data)
|
|
{
|
|
struct stm_ftrace *sf = container_of(data, struct stm_ftrace, data);
|
|
|
|
unregister_ftrace_export(&sf->ftrace);
|
|
}
|
|
|
|
static int __init stm_ftrace_init(void)
|
|
{
|
|
int ret;
|
|
|
|
stm_ftrace.data.nr_chans = roundup_pow_of_two(num_possible_cpus());
|
|
ret = stm_source_register_device(NULL, &stm_ftrace.data);
|
|
if (ret)
|
|
pr_err("Failed to register stm_source - ftrace.\n");
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void __exit stm_ftrace_exit(void)
|
|
{
|
|
stm_source_unregister_device(&stm_ftrace.data);
|
|
}
|
|
|
|
module_init(stm_ftrace_init);
|
|
module_exit(stm_ftrace_exit);
|
|
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_DESCRIPTION("stm_ftrace driver");
|
|
MODULE_AUTHOR("Chunyan Zhang <zhang.chunyan@linaro.org>");
|