diff options
Diffstat (limited to 'include/asm-i386/unwind.h')
-rw-r--r-- | include/asm-i386/unwind.h | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/include/asm-i386/unwind.h b/include/asm-i386/unwind.h index 5031d693b89d..43c70c3de2f9 100644 --- a/include/asm-i386/unwind.h +++ b/include/asm-i386/unwind.h | |||
@@ -1,98 +1,6 @@ | |||
1 | #ifndef _ASM_I386_UNWIND_H | 1 | #ifndef _ASM_I386_UNWIND_H |
2 | #define _ASM_I386_UNWIND_H | 2 | #define _ASM_I386_UNWIND_H |
3 | 3 | ||
4 | /* | ||
5 | * Copyright (C) 2002-2006 Novell, Inc. | ||
6 | * Jan Beulich <jbeulich@novell.com> | ||
7 | * This code is released under version 2 of the GNU GPL. | ||
8 | */ | ||
9 | |||
10 | #ifdef CONFIG_STACK_UNWIND | ||
11 | |||
12 | #include <linux/sched.h> | ||
13 | #include <asm/fixmap.h> | ||
14 | #include <asm/ptrace.h> | ||
15 | #include <asm/uaccess.h> | ||
16 | |||
17 | struct unwind_frame_info | ||
18 | { | ||
19 | struct pt_regs regs; | ||
20 | struct task_struct *task; | ||
21 | unsigned call_frame:1; | ||
22 | }; | ||
23 | |||
24 | #define UNW_PC(frame) (frame)->regs.eip | ||
25 | #define UNW_SP(frame) (frame)->regs.esp | ||
26 | #ifdef CONFIG_FRAME_POINTER | ||
27 | #define UNW_FP(frame) (frame)->regs.ebp | ||
28 | #define FRAME_RETADDR_OFFSET 4 | ||
29 | #define FRAME_LINK_OFFSET 0 | ||
30 | #define STACK_BOTTOM(tsk) STACK_LIMIT((tsk)->thread.esp0) | ||
31 | #define STACK_TOP(tsk) ((tsk)->thread.esp0) | ||
32 | #else | ||
33 | #define UNW_FP(frame) ((void)(frame), 0) | ||
34 | #endif | ||
35 | #define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1)) | ||
36 | |||
37 | #define UNW_REGISTER_INFO \ | ||
38 | PTREGS_INFO(eax), \ | ||
39 | PTREGS_INFO(ecx), \ | ||
40 | PTREGS_INFO(edx), \ | ||
41 | PTREGS_INFO(ebx), \ | ||
42 | PTREGS_INFO(esp), \ | ||
43 | PTREGS_INFO(ebp), \ | ||
44 | PTREGS_INFO(esi), \ | ||
45 | PTREGS_INFO(edi), \ | ||
46 | PTREGS_INFO(eip) | ||
47 | |||
48 | #define UNW_DEFAULT_RA(raItem, dataAlign) \ | ||
49 | ((raItem).where == Memory && \ | ||
50 | !((raItem).value * (dataAlign) + 4)) | ||
51 | |||
52 | static inline void arch_unw_init_frame_info(struct unwind_frame_info *info, | ||
53 | /*const*/ struct pt_regs *regs) | ||
54 | { | ||
55 | if (user_mode_vm(regs)) | ||
56 | info->regs = *regs; | ||
57 | else { | ||
58 | memcpy(&info->regs, regs, offsetof(struct pt_regs, esp)); | ||
59 | info->regs.esp = (unsigned long)®s->esp; | ||
60 | info->regs.xss = __KERNEL_DS; | ||
61 | } | ||
62 | } | ||
63 | |||
64 | static inline void arch_unw_init_blocked(struct unwind_frame_info *info) | ||
65 | { | ||
66 | memset(&info->regs, 0, sizeof(info->regs)); | ||
67 | info->regs.eip = info->task->thread.eip; | ||
68 | info->regs.xcs = __KERNEL_CS; | ||
69 | __get_user(info->regs.ebp, (long *)info->task->thread.esp); | ||
70 | info->regs.esp = info->task->thread.esp; | ||
71 | info->regs.xss = __KERNEL_DS; | ||
72 | info->regs.xds = __USER_DS; | ||
73 | info->regs.xes = __USER_DS; | ||
74 | } | ||
75 | |||
76 | extern asmlinkage int arch_unwind_init_running(struct unwind_frame_info *, | ||
77 | asmlinkage int (*callback)(struct unwind_frame_info *, | ||
78 | void *arg), | ||
79 | void *arg); | ||
80 | |||
81 | static inline int arch_unw_user_mode(const struct unwind_frame_info *info) | ||
82 | { | ||
83 | #if 0 /* This can only work when selector register and EFLAGS saves/restores | ||
84 | are properly annotated (and tracked in UNW_REGISTER_INFO). */ | ||
85 | return user_mode_vm(&info->regs); | ||
86 | #else | ||
87 | return info->regs.eip < PAGE_OFFSET | ||
88 | || (info->regs.eip >= __fix_to_virt(FIX_VDSO) | ||
89 | && info->regs.eip < __fix_to_virt(FIX_VDSO) + PAGE_SIZE) | ||
90 | || info->regs.esp < PAGE_OFFSET; | ||
91 | #endif | ||
92 | } | ||
93 | |||
94 | #else | ||
95 | |||
96 | #define UNW_PC(frame) ((void)(frame), 0) | 4 | #define UNW_PC(frame) ((void)(frame), 0) |
97 | #define UNW_SP(frame) ((void)(frame), 0) | 5 | #define UNW_SP(frame) ((void)(frame), 0) |
98 | #define UNW_FP(frame) ((void)(frame), 0) | 6 | #define UNW_FP(frame) ((void)(frame), 0) |
@@ -102,6 +10,4 @@ static inline int arch_unw_user_mode(const void *info) | |||
102 | return 0; | 10 | return 0; |
103 | } | 11 | } |
104 | 12 | ||
105 | #endif | ||
106 | |||
107 | #endif /* _ASM_I386_UNWIND_H */ | 13 | #endif /* _ASM_I386_UNWIND_H */ |