Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
um
sysrq_32.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2001 - 2003 Jeff Dike (
[email protected]
)
3
* Licensed under the GPL
4
*/
5
6
#include <linux/kernel.h>
7
#include <
linux/smp.h
>
8
#include <linux/sched.h>
9
#include <
linux/kallsyms.h
>
10
#include <asm/ptrace.h>
11
#include <
asm/sysrq.h
>
12
13
/* This is declared by <linux/sched.h> */
14
void
show_regs
(
struct
pt_regs
*
regs
)
15
{
16
printk
(
"\n"
);
17
printk
(
"EIP: %04lx:[<%08lx>] CPU: %d %s"
,
18
0xffff &
PT_REGS_CS
(regs),
PT_REGS_IP
(regs),
19
smp_processor_id
(),
print_tainted
());
20
if
(
PT_REGS_CS
(regs) & 3)
21
printk
(
" ESP: %04lx:%08lx"
, 0xffff &
PT_REGS_SS
(regs),
22
PT_REGS_SP
(regs));
23
printk
(
" EFLAGS: %08lx\n %s\n"
,
PT_REGS_EFLAGS
(regs),
24
print_tainted
());
25
printk
(
"EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n"
,
26
PT_REGS_AX
(regs),
PT_REGS_BX
(regs),
27
PT_REGS_CX
(regs),
PT_REGS_DX
(regs));
28
printk
(
"ESI: %08lx EDI: %08lx EBP: %08lx"
,
29
PT_REGS_SI
(regs),
PT_REGS_DI
(regs),
PT_REGS_BP
(regs));
30
printk
(
" DS: %04lx ES: %04lx\n"
,
31
0xffff &
PT_REGS_DS
(regs),
32
0xffff &
PT_REGS_ES
(regs));
33
34
show_trace
(
NULL
, (
unsigned
long
*) ®s);
35
}
36
37
/* Copied from i386. */
38
static
inline
int
valid_stack_ptr(
struct
thread_info
*
tinfo
,
void
*
p
)
39
{
40
return
p > (
void
*)tinfo &&
41
p < (
void
*)tinfo +
THREAD_SIZE
- 3;
42
}
43
44
/* Adapted from i386 (we also print the address we read from). */
45
static
inline
unsigned
long
print_context_stack
(
struct
thread_info
*tinfo,
46
unsigned
long
*
stack
,
unsigned
long
ebp)
47
{
48
unsigned
long
addr
;
49
50
#ifdef CONFIG_FRAME_POINTER
51
while
(valid_stack_ptr(tinfo, (
void
*)ebp)) {
52
addr = *(
unsigned
long
*)(ebp + 4);
53
printk
(
"%08lx: [<%08lx>]"
, ebp + 4, addr);
54
print_symbol(
" %s"
, addr);
55
printk
(
"\n"
);
56
ebp = *(
unsigned
long
*)ebp;
57
}
58
#else
59
while
(valid_stack_ptr(tinfo, stack)) {
60
addr = *
stack
;
61
if
(
__kernel_text_address
(addr)) {
62
printk
(
"%08lx: [<%08lx>]"
, (
unsigned
long
) stack, addr);
63
print_symbol(
" %s"
, addr);
64
printk
(
"\n"
);
65
}
66
stack++;
67
}
68
#endif
69
return
ebp;
70
}
71
72
void
show_trace
(
struct
task_struct
*
task
,
unsigned
long
* stack)
73
{
74
unsigned
long
ebp;
75
struct
thread_info
*
context
;
76
77
/* Turn this into BUG_ON if possible. */
78
if
(!stack) {
79
stack = (
unsigned
long
*) &stack;
80
printk
(
"show_trace: got NULL stack, implicit assumption task == current"
);
81
WARN_ON
(1);
82
}
83
84
if
(!task)
85
task =
current
;
86
87
if
(task !=
current
) {
88
ebp = (
unsigned
long
)
KSTK_EBP
(task);
89
}
else
{
90
asm
(
"movl %%ebp, %0"
:
"=r"
(ebp) : );
91
}
92
93
context = (
struct
thread_info
*)
94
((
unsigned
long
)stack & (~(THREAD_SIZE - 1)));
95
print_context_stack
(context, stack, ebp);
96
97
printk
(
"\n"
);
98
}
99
Generated on Thu Jan 10 2013 13:21:52 for Linux Kernel by
1.8.2