cregit-Linux how code gets into the kernel

Release 4.10 arch/mips/kernel/stacktrace.c

Directory: arch/mips/kernel
/*
 * Stack trace management functions
 *
 *  Copyright (C) 2006 Atsushi Nemoto <anemo@mba.ocn.ne.jp>
 */
#include <linux/sched.h>
#include <linux/stacktrace.h>
#include <linux/export.h>
#include <asm/stacktrace.h>

/*
 * Save stack-backtrace addresses into a stack_trace buffer:
 */

static void save_raw_context_stack(struct stack_trace *trace, unsigned long reg29, int savesched) { unsigned long *sp = (unsigned long *)reg29; unsigned long addr; while (!kstack_end(sp)) { addr = *sp++; if (__kernel_text_address(addr) && (savesched || !in_sched_functions(addr))) { if (trace->skip > 0) trace->skip--; else trace->entries[trace->nr_entries++] = addr; if (trace->nr_entries >= trace->max_entries) break; } } }

Contributors

PersonTokensPropCommitsCommitProp
atsushi nemotoatsushi nemoto9387.74%266.67%
aaro koskinenaaro koskinen1312.26%133.33%
Total106100.00%3100.00%


static void save_context_stack(struct stack_trace *trace, struct task_struct *tsk, struct pt_regs *regs, int savesched) { unsigned long sp = regs->regs[29]; #ifdef CONFIG_KALLSYMS unsigned long ra = regs->regs[31]; unsigned long pc = regs->cp0_epc; if (raw_show_trace || !__kernel_text_address(pc)) { unsigned long stack_page = (unsigned long)task_stack_page(tsk); if (stack_page && sp >= stack_page && sp <= stack_page + THREAD_SIZE - 32) save_raw_context_stack(trace, sp, savesched); return; } do { if (savesched || !in_sched_functions(pc)) { if (trace->skip > 0) trace->skip--; else trace->entries[trace->nr_entries++] = pc; if (trace->nr_entries >= trace->max_entries) break; } pc = unwind_stack(tsk, &sp, pc, &ra); } while (pc); #else save_raw_context_stack(trace, sp, savesched); #endif }

Contributors

PersonTokensPropCommitsCommitProp
atsushi nemotoatsushi nemoto16786.53%466.67%
aaro koskinenaaro koskinen199.84%116.67%
ken chenken chen73.63%116.67%
Total193100.00%6100.00%

/* * Save stack-backtrace addresses into a stack_trace buffer. */
void save_stack_trace(struct stack_trace *trace) { save_stack_trace_tsk(current, trace); }

Contributors

PersonTokensPropCommitsCommitProp
atsushi nemotoatsushi nemoto952.94%150.00%
ken chenken chen847.06%150.00%
Total17100.00%2100.00%

EXPORT_SYMBOL_GPL(save_stack_trace);
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) { struct pt_regs dummyregs; struct pt_regs *regs = &dummyregs; WARN_ON(trace->nr_entries || !trace->max_entries); if (tsk != current) { regs->regs[29] = tsk->thread.reg29; regs->regs[31] = 0; regs->cp0_epc = tsk->thread.reg31; } else prepare_frametrace(regs); save_context_stack(trace, tsk, regs, tsk == current); }

Contributors

PersonTokensPropCommitsCommitProp
ken chenken chen5758.16%133.33%
atsushi nemotoatsushi nemoto3737.76%133.33%
aaro koskinenaaro koskinen44.08%133.33%
Total98100.00%3100.00%

EXPORT_SYMBOL_GPL(save_stack_trace_tsk);

Overall Contributors

PersonTokensPropCommitsCommitProp
atsushi nemotoatsushi nemoto31772.21%440.00%
ken chenken chen7817.77%110.00%
aaro koskinenaaro koskinen368.20%110.00%
ingo molnaringo molnar40.91%110.00%
heiko carstensheiko carstens20.46%110.00%
ralf baechleralf baechle10.23%110.00%
paul gortmakerpaul gortmaker10.23%110.00%
Total439100.00%10100.00%
Directory: arch/mips/kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.