aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-10-06 11:10:08 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-11-09 00:16:22 -0500
commit7d2f551f6dc933f87933e906e48583169bbc7c27 (patch)
treeee596f27147a2a8e280a95d4b8ba41c5914a0ec8 /arch
parent0f6ed63b170778b9c93fb0ae4017f110c9ee6416 (diff)
restore 32bit aout coredump
just getting rid of bitrot Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/ia32/ia32_aout.c70
1 files changed, 36 insertions, 34 deletions
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c
index bae3aba95b15..80361c00fb64 100644
--- a/arch/x86/ia32/ia32_aout.c
+++ b/arch/x86/ia32/ia32_aout.c
@@ -25,6 +25,7 @@
25#include <linux/personality.h> 25#include <linux/personality.h>
26#include <linux/init.h> 26#include <linux/init.h>
27#include <linux/jiffies.h> 27#include <linux/jiffies.h>
28#include <linux/perf_event.h>
28 29
29#include <asm/uaccess.h> 30#include <asm/uaccess.h>
30#include <asm/pgalloc.h> 31#include <asm/pgalloc.h>
@@ -33,14 +34,18 @@
33#include <asm/ia32.h> 34#include <asm/ia32.h>
34 35
35#undef WARN_OLD 36#undef WARN_OLD
36#undef CORE_DUMP /* definitely broken */
37 37
38static int load_aout_binary(struct linux_binprm *); 38static int load_aout_binary(struct linux_binprm *);
39static int load_aout_library(struct file *); 39static int load_aout_library(struct file *);
40 40
41#ifdef CORE_DUMP 41#ifdef CONFIG_COREDUMP
42static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, 42static int aout_core_dump(struct coredump_params *);
43 unsigned long limit); 43
44static unsigned long get_dr(int n)
45{
46 struct perf_event *bp = current->thread.ptrace_bps[n];
47 return bp ? bp->hw.info.address : 0;
48}
44 49
45/* 50/*
46 * fill in the user structure for a core dump.. 51 * fill in the user structure for a core dump..
@@ -48,6 +53,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
48static void dump_thread32(struct pt_regs *regs, struct user32 *dump) 53static void dump_thread32(struct pt_regs *regs, struct user32 *dump)
49{ 54{
50 u32 fs, gs; 55 u32 fs, gs;
56 memset(dump, 0, sizeof(*dump));
51 57
52/* changed the size calculations - should hopefully work better. lbt */ 58/* changed the size calculations - should hopefully work better. lbt */
53 dump->magic = CMAGIC; 59 dump->magic = CMAGIC;
@@ -57,15 +63,12 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump)
57 dump->u_dsize = ((unsigned long) 63 dump->u_dsize = ((unsigned long)
58 (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT; 64 (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
59 dump->u_dsize -= dump->u_tsize; 65 dump->u_dsize -= dump->u_tsize;
60 dump->u_ssize = 0; 66 dump->u_debugreg[0] = get_dr(0);
61 dump->u_debugreg[0] = current->thread.debugreg0; 67 dump->u_debugreg[1] = get_dr(1);
62 dump->u_debugreg[1] = current->thread.debugreg1; 68 dump->u_debugreg[2] = get_dr(2);
63 dump->u_debugreg[2] = current->thread.debugreg2; 69 dump->u_debugreg[3] = get_dr(3);
64 dump->u_debugreg[3] = current->thread.debugreg3;
65 dump->u_debugreg[4] = 0;
66 dump->u_debugreg[5] = 0;
67 dump->u_debugreg[6] = current->thread.debugreg6; 70 dump->u_debugreg[6] = current->thread.debugreg6;
68 dump->u_debugreg[7] = current->thread.debugreg7; 71 dump->u_debugreg[7] = current->thread.ptrace_dr7;
69 72
70 if (dump->start_stack < 0xc0000000) { 73 if (dump->start_stack < 0xc0000000) {
71 unsigned long tmp; 74 unsigned long tmp;
@@ -74,24 +77,24 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump)
74 dump->u_ssize = tmp >> PAGE_SHIFT; 77 dump->u_ssize = tmp >> PAGE_SHIFT;
75 } 78 }
76 79
77 dump->regs.bx = regs->bx; 80 dump->regs.ebx = regs->bx;
78 dump->regs.cx = regs->cx; 81 dump->regs.ecx = regs->cx;
79 dump->regs.dx = regs->dx; 82 dump->regs.edx = regs->dx;
80 dump->regs.si = regs->si; 83 dump->regs.esi = regs->si;
81 dump->regs.di = regs->di; 84 dump->regs.edi = regs->di;
82 dump->regs.bp = regs->bp; 85 dump->regs.ebp = regs->bp;
83 dump->regs.ax = regs->ax; 86 dump->regs.eax = regs->ax;
84 dump->regs.ds = current->thread.ds; 87 dump->regs.ds = current->thread.ds;
85 dump->regs.es = current->thread.es; 88 dump->regs.es = current->thread.es;
86 savesegment(fs, fs); 89 savesegment(fs, fs);
87 dump->regs.fs = fs; 90 dump->regs.fs = fs;
88 savesegment(gs, gs); 91 savesegment(gs, gs);
89 dump->regs.gs = gs; 92 dump->regs.gs = gs;
90 dump->regs.orig_ax = regs->orig_ax; 93 dump->regs.orig_eax = regs->orig_ax;
91 dump->regs.ip = regs->ip; 94 dump->regs.eip = regs->ip;
92 dump->regs.cs = regs->cs; 95 dump->regs.cs = regs->cs;
93 dump->regs.flags = regs->flags; 96 dump->regs.eflags = regs->flags;
94 dump->regs.sp = regs->sp; 97 dump->regs.esp = regs->sp;
95 dump->regs.ss = regs->ss; 98 dump->regs.ss = regs->ss;
96 99
97#if 1 /* FIXME */ 100#if 1 /* FIXME */
@@ -107,7 +110,7 @@ static struct linux_binfmt aout_format = {
107 .module = THIS_MODULE, 110 .module = THIS_MODULE,
108 .load_binary = load_aout_binary, 111 .load_binary = load_aout_binary,
109 .load_shlib = load_aout_library, 112 .load_shlib = load_aout_library,
110#ifdef CORE_DUMP 113#ifdef CONFIG_COREDUMP
111 .core_dump = aout_core_dump, 114 .core_dump = aout_core_dump,
112#endif 115#endif
113 .min_coredump = PAGE_SIZE 116 .min_coredump = PAGE_SIZE
@@ -122,7 +125,7 @@ static void set_brk(unsigned long start, unsigned long end)
122 vm_brk(start, end - start); 125 vm_brk(start, end - start);
123} 126}
124 127
125#ifdef CORE_DUMP 128#ifdef CONFIG_COREDUMP
126/* 129/*
127 * These are the only things you should do on a core-file: use only these 130 * These are the only things you should do on a core-file: use only these
128 * macros to write out all the necessary info. 131 * macros to write out all the necessary info.
@@ -131,14 +134,14 @@ static void set_brk(unsigned long start, unsigned long end)
131#include <linux/coredump.h> 134#include <linux/coredump.h>
132 135
133#define DUMP_WRITE(addr, nr) \ 136#define DUMP_WRITE(addr, nr) \
134 if (!dump_write(file, (void *)(addr), (nr))) \ 137 if (!dump_write(cprm->file, (void *)(addr), (nr))) \
135 goto end_coredump; 138 goto end_coredump;
136 139
137#define DUMP_SEEK(offset) \ 140#define DUMP_SEEK(offset) \
138 if (!dump_seek(file, offset)) \ 141 if (!dump_seek(cprm->file, offset)) \
139 goto end_coredump; 142 goto end_coredump;
140 143
141#define START_DATA() (u.u_tsize << PAGE_SHIFT) 144#define START_DATA(u) (u.u_tsize << PAGE_SHIFT)
142#define START_STACK(u) (u.start_stack) 145#define START_STACK(u) (u.start_stack)
143 146
144/* 147/*
@@ -151,8 +154,7 @@ static void set_brk(unsigned long start, unsigned long end)
151 * dumping of the process results in another error.. 154 * dumping of the process results in another error..
152 */ 155 */
153 156
154static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, 157static int aout_core_dump(struct coredump_params *cprm)
155 unsigned long limit)
156{ 158{
157 mm_segment_t fs; 159 mm_segment_t fs;
158 int has_dumped = 0; 160 int has_dumped = 0;
@@ -164,19 +166,19 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
164 has_dumped = 1; 166 has_dumped = 1;
165 strncpy(dump.u_comm, current->comm, sizeof(current->comm)); 167 strncpy(dump.u_comm, current->comm, sizeof(current->comm));
166 dump.u_ar0 = offsetof(struct user32, regs); 168 dump.u_ar0 = offsetof(struct user32, regs);
167 dump.signal = signr; 169 dump.signal = cprm->siginfo->si_signo;
168 dump_thread32(regs, &dump); 170 dump_thread32(cprm->regs, &dump);
169 171
170 /* 172 /*
171 * If the size of the dump file exceeds the rlimit, then see 173 * If the size of the dump file exceeds the rlimit, then see
172 * what would happen if we wrote the stack, but not the data 174 * what would happen if we wrote the stack, but not the data
173 * area. 175 * area.
174 */ 176 */
175 if ((dump.u_dsize + dump.u_ssize + 1) * PAGE_SIZE > limit) 177 if ((dump.u_dsize + dump.u_ssize + 1) * PAGE_SIZE > cprm->limit)
176 dump.u_dsize = 0; 178 dump.u_dsize = 0;
177 179
178 /* Make sure we have enough room to write the stack and data areas. */ 180 /* Make sure we have enough room to write the stack and data areas. */
179 if ((dump.u_ssize + 1) * PAGE_SIZE > limit) 181 if ((dump.u_ssize + 1) * PAGE_SIZE > cprm->limit)
180 dump.u_ssize = 0; 182 dump.u_ssize = 0;
181 183
182 /* make sure we actually have a data and stack area to dump */ 184 /* make sure we actually have a data and stack area to dump */