diff options
Diffstat (limited to 'arch/xtensa/oprofile')
-rw-r--r-- | arch/xtensa/oprofile/Makefile | 10 | ||||
-rw-r--r-- | arch/xtensa/oprofile/backtrace.c | 27 | ||||
-rw-r--r-- | arch/xtensa/oprofile/init.c | 26 |
3 files changed, 63 insertions, 0 deletions
diff --git a/arch/xtensa/oprofile/Makefile b/arch/xtensa/oprofile/Makefile new file mode 100644 index 000000000..f559b9ffb --- /dev/null +++ b/arch/xtensa/oprofile/Makefile @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_OPROFILE) += oprofile.o + +DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \ + oprof.o cpu_buffer.o buffer_sync.o \ + event_buffer.o oprofile_files.o \ + oprofilefs.o oprofile_stats.o \ + timer_int.o ) + +oprofile-y := $(DRIVER_OBJS) init.o backtrace.o diff --git a/arch/xtensa/oprofile/backtrace.c b/arch/xtensa/oprofile/backtrace.c new file mode 100644 index 000000000..8f952034e --- /dev/null +++ b/arch/xtensa/oprofile/backtrace.c @@ -0,0 +1,27 @@ +/** + * @file backtrace.c + * + * @remark Copyright 2008 Tensilica Inc. + * Copyright (C) 2015 Cadence Design Systems Inc. + * @remark Read the file COPYING + * + */ + +#include <linux/oprofile.h> +#include <asm/ptrace.h> +#include <asm/stacktrace.h> + +static int xtensa_backtrace_cb(struct stackframe *frame, void *data) +{ + oprofile_add_trace(frame->pc); + return 0; +} + +void xtensa_backtrace(struct pt_regs * const regs, unsigned int depth) +{ + if (user_mode(regs)) + xtensa_backtrace_user(regs, depth, xtensa_backtrace_cb, NULL); + else + xtensa_backtrace_kernel(regs, depth, xtensa_backtrace_cb, + xtensa_backtrace_cb, NULL); +} diff --git a/arch/xtensa/oprofile/init.c b/arch/xtensa/oprofile/init.c new file mode 100644 index 000000000..a67eea379 --- /dev/null +++ b/arch/xtensa/oprofile/init.c @@ -0,0 +1,26 @@ +/** + * @file init.c + * + * @remark Copyright 2008 Tensilica Inc. + * @remark Read the file COPYING + * + */ + +#include <linux/kernel.h> +#include <linux/oprofile.h> +#include <linux/errno.h> +#include <linux/init.h> + + +extern void xtensa_backtrace(struct pt_regs *const regs, unsigned int depth); + +int __init oprofile_arch_init(struct oprofile_operations *ops) +{ + ops->backtrace = xtensa_backtrace; + return -ENODEV; +} + + +void oprofile_arch_exit(void) +{ +} |