diff options
Diffstat (limited to 'arch/um/os-Linux')
| -rw-r--r-- | arch/um/os-Linux/registers.c | 9 | ||||
| -rw-r--r-- | arch/um/os-Linux/skas/mem.c | 2 | ||||
| -rw-r--r-- | arch/um/os-Linux/skas/process.c | 19 | 
3 files changed, 27 insertions, 3 deletions
diff --git a/arch/um/os-Linux/registers.c b/arch/um/os-Linux/registers.c index 830fe6a1518..b866b9e3bef 100644 --- a/arch/um/os-Linux/registers.c +++ b/arch/um/os-Linux/registers.c @@ -8,6 +8,8 @@  #include <string.h>  #include <sys/ptrace.h>  #include "sysdep/ptrace.h" +#include "sysdep/ptrace_user.h" +#include "registers.h"  int save_registers(int pid, struct uml_pt_regs *regs)  { @@ -32,6 +34,7 @@ int restore_registers(int pid, struct uml_pt_regs *regs)  /* This is set once at boot time and not changed thereafter */  static unsigned long exec_regs[MAX_REG_NR]; +static unsigned long exec_fp_regs[FP_SIZE];  int init_registers(int pid)  { @@ -42,10 +45,14 @@ int init_registers(int pid)  		return -errno;  	arch_init_registers(pid); +	get_fp_registers(pid, exec_fp_regs);  	return 0;  } -void get_safe_registers(unsigned long *regs) +void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)  {  	memcpy(regs, exec_regs, sizeof(exec_regs)); + +	if (fp_regs) +		memcpy(fp_regs, exec_fp_regs, sizeof(exec_fp_regs));  } diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c index d261f170d12..e771398be5f 100644 --- a/arch/um/os-Linux/skas/mem.c +++ b/arch/um/os-Linux/skas/mem.c @@ -39,7 +39,7 @@ static unsigned long syscall_regs[MAX_REG_NR];  static int __init init_syscall_regs(void)  { -	get_safe_registers(syscall_regs); +	get_safe_registers(syscall_regs, NULL);  	syscall_regs[REGS_IP_INDEX] = STUB_CODE +  		((unsigned long) &batch_syscall_stub -  		 (unsigned long) &__syscall_stub_start); diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index d6e0a2234b8..dee0e8cf8ad 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -373,6 +373,9 @@ void userspace(struct uml_pt_regs *regs)  		if (ptrace(PTRACE_SETREGS, pid, 0, regs->gp))  			fatal_sigsegv(); +		if (put_fp_registers(pid, regs->fp)) +			fatal_sigsegv(); +  		/* Now we set local_using_sysemu to be used for one loop */  		local_using_sysemu = get_using_sysemu(); @@ -399,6 +402,12 @@ void userspace(struct uml_pt_regs *regs)  			fatal_sigsegv();  		} +		if (get_fp_registers(pid, regs->fp)) { +			printk(UM_KERN_ERR "userspace -  get_fp_registers failed, " +			       "errno = %d\n", errno); +			fatal_sigsegv(); +		} +  		UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */  		if (WIFSTOPPED(status)) { @@ -457,10 +466,11 @@ void userspace(struct uml_pt_regs *regs)  }  static unsigned long thread_regs[MAX_REG_NR]; +static unsigned long thread_fp_regs[FP_SIZE];  static int __init init_thread_regs(void)  { -	get_safe_registers(thread_regs); +	get_safe_registers(thread_regs, thread_fp_regs);  	/* Set parent's instruction pointer to start of clone-stub */  	thread_regs[REGS_IP_INDEX] = STUB_CODE +  				(unsigned long) stub_clone_handler - @@ -503,6 +513,13 @@ int copy_context_skas0(unsigned long new_stack, int pid)  		return err;  	} +	err = put_fp_registers(pid, thread_fp_regs); +	if (err < 0) { +		printk(UM_KERN_ERR "copy_context_skas0 : put_fp_registers " +		       "failed, pid = %d, err = %d\n", pid, err); +		return err; +	} +  	/* set a well known return code for detection of child write failure */  	child_data->err = 12345678;  | 
