[PATCH] uml: initialize process FP registers properly
We weren't making sure that we initialized the FP registers of new processes to sane values. This patch also moves some defines in the affected area closer to where they are used. Signed-off-by: Jeff Dike <jdike@addtoit.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:

committed by
Linus Torvalds

parent
43b00fdbb1
commit
e2216feb37
@@ -310,16 +310,12 @@ void userspace(union uml_pt_regs *regs)
|
||||
}
|
||||
}
|
||||
}
|
||||
#define INIT_JMP_NEW_THREAD 0
|
||||
#define INIT_JMP_REMOVE_SIGSTACK 1
|
||||
#define INIT_JMP_CALLBACK 2
|
||||
#define INIT_JMP_HALT 3
|
||||
#define INIT_JMP_REBOOT 4
|
||||
|
||||
int copy_context_skas0(unsigned long new_stack, int pid)
|
||||
{
|
||||
int err;
|
||||
unsigned long regs[MAX_REG_NR];
|
||||
unsigned long regs[HOST_FRAME_SIZE];
|
||||
unsigned long fp_regs[HOST_FP_SIZE];
|
||||
unsigned long current_stack = current_stub_stack();
|
||||
struct stub_data *data = (struct stub_data *) current_stack;
|
||||
struct stub_data *child_data = (struct stub_data *) new_stack;
|
||||
@@ -334,7 +330,7 @@ int copy_context_skas0(unsigned long new_stack, int pid)
|
||||
.timer = ((struct itimerval)
|
||||
{ { 0, 1000000 / hz() },
|
||||
{ 0, 1000000 / hz() }})});
|
||||
get_safe_registers(regs);
|
||||
get_safe_registers(regs, fp_regs);
|
||||
|
||||
/* Set parent's instruction pointer to start of clone-stub */
|
||||
regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE +
|
||||
@@ -350,6 +346,11 @@ int copy_context_skas0(unsigned long new_stack, int pid)
|
||||
panic("copy_context_skas0 : PTRACE_SETREGS failed, "
|
||||
"pid = %d, errno = %d\n", pid, errno);
|
||||
|
||||
err = ptrace_setfpregs(pid, fp_regs);
|
||||
if(err < 0)
|
||||
panic("copy_context_skas0 : PTRACE_SETFPREGS failed, "
|
||||
"pid = %d, errno = %d\n", pid, errno);
|
||||
|
||||
/* set a well known return code for detection of child write failure */
|
||||
child_data->err = 12345678;
|
||||
|
||||
@@ -457,6 +458,12 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
|
||||
set_signals(flags);
|
||||
}
|
||||
|
||||
#define INIT_JMP_NEW_THREAD 0
|
||||
#define INIT_JMP_REMOVE_SIGSTACK 1
|
||||
#define INIT_JMP_CALLBACK 2
|
||||
#define INIT_JMP_HALT 3
|
||||
#define INIT_JMP_REBOOT 4
|
||||
|
||||
void thread_wait(void *sw, void *fb)
|
||||
{
|
||||
sigjmp_buf buf, **switch_buf = sw, *fork_buf;
|
||||
|
Reference in New Issue
Block a user