diff options
Diffstat (limited to 'arch/um/os-Linux/skas/process.c')
| -rw-r--r-- | arch/um/os-Linux/skas/process.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index d6e0a2234b86..dee0e8cf8ad0 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) | |||
| 373 | if (ptrace(PTRACE_SETREGS, pid, 0, regs->gp)) | 373 | if (ptrace(PTRACE_SETREGS, pid, 0, regs->gp)) |
| 374 | fatal_sigsegv(); | 374 | fatal_sigsegv(); |
| 375 | 375 | ||
| 376 | if (put_fp_registers(pid, regs->fp)) | ||
| 377 | fatal_sigsegv(); | ||
| 378 | |||
| 376 | /* Now we set local_using_sysemu to be used for one loop */ | 379 | /* Now we set local_using_sysemu to be used for one loop */ |
| 377 | local_using_sysemu = get_using_sysemu(); | 380 | local_using_sysemu = get_using_sysemu(); |
| 378 | 381 | ||
| @@ -399,6 +402,12 @@ void userspace(struct uml_pt_regs *regs) | |||
| 399 | fatal_sigsegv(); | 402 | fatal_sigsegv(); |
| 400 | } | 403 | } |
| 401 | 404 | ||
| 405 | if (get_fp_registers(pid, regs->fp)) { | ||
| 406 | printk(UM_KERN_ERR "userspace - get_fp_registers failed, " | ||
| 407 | "errno = %d\n", errno); | ||
| 408 | fatal_sigsegv(); | ||
| 409 | } | ||
| 410 | |||
| 402 | UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */ | 411 | UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */ |
| 403 | 412 | ||
| 404 | if (WIFSTOPPED(status)) { | 413 | if (WIFSTOPPED(status)) { |
| @@ -457,10 +466,11 @@ void userspace(struct uml_pt_regs *regs) | |||
| 457 | } | 466 | } |
| 458 | 467 | ||
| 459 | static unsigned long thread_regs[MAX_REG_NR]; | 468 | static unsigned long thread_regs[MAX_REG_NR]; |
| 469 | static unsigned long thread_fp_regs[FP_SIZE]; | ||
| 460 | 470 | ||
| 461 | static int __init init_thread_regs(void) | 471 | static int __init init_thread_regs(void) |
| 462 | { | 472 | { |
| 463 | get_safe_registers(thread_regs); | 473 | get_safe_registers(thread_regs, thread_fp_regs); |
| 464 | /* Set parent's instruction pointer to start of clone-stub */ | 474 | /* Set parent's instruction pointer to start of clone-stub */ |
| 465 | thread_regs[REGS_IP_INDEX] = STUB_CODE + | 475 | thread_regs[REGS_IP_INDEX] = STUB_CODE + |
| 466 | (unsigned long) stub_clone_handler - | 476 | (unsigned long) stub_clone_handler - |
| @@ -503,6 +513,13 @@ int copy_context_skas0(unsigned long new_stack, int pid) | |||
| 503 | return err; | 513 | return err; |
| 504 | } | 514 | } |
| 505 | 515 | ||
| 516 | err = put_fp_registers(pid, thread_fp_regs); | ||
| 517 | if (err < 0) { | ||
| 518 | printk(UM_KERN_ERR "copy_context_skas0 : put_fp_registers " | ||
| 519 | "failed, pid = %d, err = %d\n", pid, err); | ||
| 520 | return err; | ||
| 521 | } | ||
| 522 | |||
| 506 | /* set a well known return code for detection of child write failure */ | 523 | /* set a well known return code for detection of child write failure */ |
| 507 | child_data->err = 12345678; | 524 | child_data->err = 12345678; |
| 508 | 525 | ||
