diff options
author | Jeff Dike <jdike@addtoit.com> | 2007-08-31 02:56:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-08-31 04:42:22 -0400 |
commit | d1254b12c93e1e586137a2ffef71fd33cf273f35 (patch) | |
tree | b122f08030c920608996eb52cce1068030ffd3b6 /arch | |
parent | c7ec16da5adc1c1b341b2a83bde7add17dcf811a (diff) |
uml: fix x86_64 core dump crash
Stop UML crashing when trying to dump a process core on x86_64. This is the
minimal fix to stop the crash - more things are broken here, and patches are
forthcoming.
The immediate thing to do is define ELF_CORE_COPY_REGS and
ELF_CORE_COPY_FPREGS. Defining ELF_CORE_COPY_FPREGS allows dump_fpu to go
away. It is defined in terms of save_fp_registers, so that needs to be added.
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/um/os-Linux/sys-x86_64/registers.c | 15 | ||||
-rw-r--r-- | arch/um/sys-x86_64/ptrace.c | 6 |
2 files changed, 15 insertions, 6 deletions
diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c index e6fc2179d1bc..9467315b8059 100644 --- a/arch/um/os-Linux/sys-x86_64/registers.c +++ b/arch/um/os-Linux/sys-x86_64/registers.c | |||
@@ -4,6 +4,7 @@ | |||
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <errno.h> | 6 | #include <errno.h> |
7 | #include <sys/ptrace.h> | ||
7 | #include <string.h> | 8 | #include <string.h> |
8 | #include "ptrace_user.h" | 9 | #include "ptrace_user.h" |
9 | #include "uml-config.h" | 10 | #include "uml-config.h" |
@@ -17,6 +18,20 @@ | |||
17 | static unsigned long exec_regs[MAX_REG_NR]; | 18 | static unsigned long exec_regs[MAX_REG_NR]; |
18 | static unsigned long exec_fp_regs[HOST_FP_SIZE]; | 19 | static unsigned long exec_fp_regs[HOST_FP_SIZE]; |
19 | 20 | ||
21 | int save_fp_registers(int pid, unsigned long *fp_regs) | ||
22 | { | ||
23 | if(ptrace(PTRACE_GETFPREGS, pid, 0, fp_regs) < 0) | ||
24 | return -errno; | ||
25 | return 0; | ||
26 | } | ||
27 | |||
28 | int restore_fp_registers(int pid, unsigned long *fp_regs) | ||
29 | { | ||
30 | if(ptrace(PTRACE_SETFPREGS, pid, 0, fp_regs) < 0) | ||
31 | return -errno; | ||
32 | return 0; | ||
33 | } | ||
34 | |||
20 | void init_thread_registers(union uml_pt_regs *to) | 35 | void init_thread_registers(union uml_pt_regs *to) |
21 | { | 36 | { |
22 | memcpy(to->skas.regs, exec_regs, sizeof(to->skas.regs)); | 37 | memcpy(to->skas.regs, exec_regs, sizeof(to->skas.regs)); |
diff --git a/arch/um/sys-x86_64/ptrace.c b/arch/um/sys-x86_64/ptrace.c index 55b66e09a98c..1970d78aa528 100644 --- a/arch/um/sys-x86_64/ptrace.c +++ b/arch/um/sys-x86_64/ptrace.c | |||
@@ -156,12 +156,6 @@ int is_syscall(unsigned long addr) | |||
156 | return(instr == 0x050f); | 156 | return(instr == 0x050f); |
157 | } | 157 | } |
158 | 158 | ||
159 | int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu ) | ||
160 | { | ||
161 | panic("dump_fpu"); | ||
162 | return(1); | ||
163 | } | ||
164 | |||
165 | int get_fpregs(unsigned long buf, struct task_struct *child) | 159 | int get_fpregs(unsigned long buf, struct task_struct *child) |
166 | { | 160 | { |
167 | panic("get_fpregs"); | 161 | panic("get_fpregs"); |