cregit-Linux how code gets into the kernel

Release 4.14 arch/sh/oprofile/backtrace.c

Directory: arch/sh/oprofile
/*
 * SH specific backtracing code for oprofile
 *
 * Copyright 2007 STMicroelectronics Ltd.
 *
 * Author: Dave Peverley <dpeverley@mpc-data.co.uk>
 *
 * Based on ARM oprofile backtrace code by Richard Purdie and in turn, i386
 * oprofile backtrace code by John Levon, David Smith
 *
 * 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.
 *
 */
#include <linux/oprofile.h>
#include <linux/sched.h>
#include <linux/kallsyms.h>
#include <linux/mm.h>
#include <asm/unwinder.h>
#include <asm/ptrace.h>
#include <linux/uaccess.h>
#include <asm/sections.h>
#include <asm/stacktrace.h>


static int backtrace_stack(void *data, char *name) { /* Yes, we want all stacks */ return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Matt Fleming18100.00%1100.00%
Total18100.00%1100.00%


static void backtrace_address(void *data, unsigned long addr, int reliable) { unsigned int *depth = data; if ((*depth)--) oprofile_add_trace(addr); }

Contributors

PersonTokensPropCommitsCommitProp
Matt Fleming37100.00%1100.00%
Total37100.00%1100.00%

static struct stacktrace_ops backtrace_ops = { .stack = backtrace_stack, .address = backtrace_address, }; /* Limit to stop backtracing too far. */ static int backtrace_limit = 20;
static unsigned long * user_backtrace(unsigned long *stackaddr, struct pt_regs *regs) { unsigned long buf_stack; /* Also check accessibility of address */ if (!access_ok(VERIFY_READ, stackaddr, sizeof(unsigned long))) return NULL; if (__copy_from_user_inatomic(&buf_stack, stackaddr, sizeof(unsigned long))) return NULL; /* Quick paranoia check */ if (buf_stack & 3) return NULL; oprofile_add_trace(buf_stack); stackaddr++; return stackaddr; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Peverley82100.00%1100.00%
Total82100.00%1100.00%


void sh_backtrace(struct pt_regs * const regs, unsigned int depth) { unsigned long *stackaddr; /* * Paranoia - clip max depth as we could get lost in the weeds. */ if (depth > backtrace_limit) depth = backtrace_limit; stackaddr = (unsigned long *)kernel_stack_pointer(regs); if (!user_mode(regs)) { if (depth) unwind_stack(NULL, regs, stackaddr, &backtrace_ops, &depth); return; } while (depth-- && (stackaddr != NULL)) stackaddr = user_backtrace(stackaddr, regs); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Peverley8086.02%125.00%
Matt Fleming1010.75%250.00%
Paul Mundt33.23%125.00%
Total93100.00%4100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Dave Peverley19067.38%120.00%
Matt Fleming8831.21%240.00%
Paul Mundt31.06%120.00%
Linus Torvalds10.35%120.00%
Total282100.00%5100.00%
Directory: arch/sh/oprofile
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.