]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/um/os-Linux/skas/process.c
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq
[linux-2.6-omap-h63xx.git] / arch / um / os-Linux / skas / process.c
index d36c89c24a45c5df05a652f88dc26901577bb19b..172ad8f72e12e71af5d2b1463a3ec3af272095ed 100644 (file)
@@ -55,7 +55,7 @@ static int ptrace_dump_regs(int pid)
  * Signals that are OK to receive in the stub - we'll just continue it.
  * SIGWINCH will happen when UML is inside a detached screen.
  */
-#define STUB_SIG_MASK (1 << SIGVTALRM)
+#define STUB_SIG_MASK ((1 << SIGVTALRM) | (1 << SIGWINCH))
 
 /* Signals that the stub will finish with - anything else is an error */
 #define STUB_DONE_MASK (1 << SIGTRAP)
@@ -115,6 +115,14 @@ void get_skas_faultinfo(int pid, struct faultinfo * fi)
                               sizeof(struct ptrace_faultinfo));
        }
        else {
+               unsigned long fpregs[FP_SIZE];
+
+               err = get_fp_registers(pid, fpregs);
+               if (err < 0) {
+                       printk(UM_KERN_ERR "save_fp_registers returned %d\n",
+                              err);
+                       fatal_sigsegv();
+               }
                err = ptrace(PTRACE_CONT, pid, 0, SIGSEGV);
                if (err) {
                        printk(UM_KERN_ERR "Failed to continue stub, pid = %d, "
@@ -128,6 +136,13 @@ void get_skas_faultinfo(int pid, struct faultinfo * fi)
                 * the stub stack page. We just have to copy it.
                 */
                memcpy(fi, (void *)current_stub_stack(), sizeof(*fi));
+
+               err = put_fp_registers(pid, fpregs);
+               if (err < 0) {
+                       printk(UM_KERN_ERR "put_fp_registers returned %d\n",
+                              err);
+                       fatal_sigsegv();
+               }
        }
 }
 
@@ -341,7 +356,7 @@ void userspace(struct uml_pt_regs *regs)
        int local_using_sysemu;
 
        if (getitimer(ITIMER_VIRTUAL, &timer))
-               printk("Failed to get itimer, errno = %d\n", errno);
+               printk(UM_KERN_ERR "Failed to get itimer, errno = %d\n", errno);
        nsecs = timer.it_value.tv_sec * UM_NSEC_PER_SEC +
                timer.it_value.tv_usec * UM_NSEC_PER_USEC;
        nsecs += os_nsecs();
@@ -388,7 +403,7 @@ void userspace(struct uml_pt_regs *regs)
 
                if (WIFSTOPPED(status)) {
                        int sig = WSTOPSIG(status);
-                       switch(sig) {
+                       switch (sig) {
                        case SIGSEGV:
                                if (PTRACE_FULL_FAULTINFO ||
                                    !ptrace_faultinfo) {
@@ -427,7 +442,7 @@ void userspace(struct uml_pt_regs *regs)
                                unblock_signals();
                                break;
                        default:
-                               printk(UM_KERN_ERR "userspace - child stopped "
+                               printk(UM_KERN_ERR "userspace - child stopped "
                                       "with signal %d\n", sig);
                                fatal_sigsegv();
                        }
@@ -641,7 +656,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
         * after returning to the jumper.
         */
        n = setjmp(initial_jmpbuf);
-       switch(n) {
+       switch (n) {
        case INIT_JMP_NEW_THREAD:
                (*switch_buf)[0].JB_IP = (unsigned long) new_thread_handler;
                (*switch_buf)[0].JB_SP = (unsigned long) stack +