Root/
Source at commit 0de2b2b3be81048189a32f7a3d3ba0ba9ec817b6 created 11 years 11 months ago. By Maarten ter Huurne, MIPS: JZ4740: Fixed value for round robin constant. | |
---|---|
1 | /* |
2 | * arch/sh/kernel/stacktrace.c |
3 | * |
4 | * Stack trace management functions |
5 | * |
6 | * Copyright (C) 2006 - 2008 Paul Mundt |
7 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive |
10 | * for more details. |
11 | */ |
12 | #include <linux/sched.h> |
13 | #include <linux/stacktrace.h> |
14 | #include <linux/thread_info.h> |
15 | #include <linux/module.h> |
16 | #include <asm/unwinder.h> |
17 | #include <asm/ptrace.h> |
18 | #include <asm/stacktrace.h> |
19 | |
20 | static int save_stack_stack(void *data, char *name) |
21 | { |
22 | return 0; |
23 | } |
24 | |
25 | /* |
26 | * Save stack-backtrace addresses into a stack_trace buffer. |
27 | */ |
28 | static void save_stack_address(void *data, unsigned long addr, int reliable) |
29 | { |
30 | struct stack_trace *trace = data; |
31 | |
32 | if (!reliable) |
33 | return; |
34 | |
35 | if (trace->skip > 0) { |
36 | trace->skip--; |
37 | return; |
38 | } |
39 | |
40 | if (trace->nr_entries < trace->max_entries) |
41 | trace->entries[trace->nr_entries++] = addr; |
42 | } |
43 | |
44 | static const struct stacktrace_ops save_stack_ops = { |
45 | .stack = save_stack_stack, |
46 | .address = save_stack_address, |
47 | }; |
48 | |
49 | void save_stack_trace(struct stack_trace *trace) |
50 | { |
51 | unsigned long *sp = (unsigned long *)current_stack_pointer; |
52 | |
53 | unwind_stack(current, NULL, sp, &save_stack_ops, trace); |
54 | if (trace->nr_entries < trace->max_entries) |
55 | trace->entries[trace->nr_entries++] = ULONG_MAX; |
56 | } |
57 | EXPORT_SYMBOL_GPL(save_stack_trace); |
58 | |
59 | static void |
60 | save_stack_address_nosched(void *data, unsigned long addr, int reliable) |
61 | { |
62 | struct stack_trace *trace = (struct stack_trace *)data; |
63 | |
64 | if (!reliable) |
65 | return; |
66 | |
67 | if (in_sched_functions(addr)) |
68 | return; |
69 | |
70 | if (trace->skip > 0) { |
71 | trace->skip--; |
72 | return; |
73 | } |
74 | |
75 | if (trace->nr_entries < trace->max_entries) |
76 | trace->entries[trace->nr_entries++] = addr; |
77 | } |
78 | |
79 | static const struct stacktrace_ops save_stack_ops_nosched = { |
80 | .stack = save_stack_stack, |
81 | .address = save_stack_address_nosched, |
82 | }; |
83 | |
84 | void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) |
85 | { |
86 | unsigned long *sp = (unsigned long *)tsk->thread.sp; |
87 | |
88 | unwind_stack(current, NULL, sp, &save_stack_ops_nosched, trace); |
89 | if (trace->nr_entries < trace->max_entries) |
90 | trace->entries[trace->nr_entries++] = ULONG_MAX; |
91 | } |
92 | EXPORT_SYMBOL_GPL(save_stack_trace_tsk); |
93 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9