]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/x86_64/ia32/ia32_signal.c
[PATCH] ata_piix: add a couple of flags
[karo-tx-linux.git] / arch / x86_64 / ia32 / ia32_signal.c
index 66e2821533db70d6607f580eab2bff3c501c8ea4..e0a92439f6342a350d45feaca527ed5b9e9e3426 100644 (file)
@@ -353,7 +353,6 @@ ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, struct _fpstate_ia32 __
                 struct pt_regs *regs, unsigned int mask)
 {
        int tmp, err = 0;
-       u32 eflags;
 
        tmp = 0;
        __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
@@ -378,10 +377,7 @@ ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, struct _fpstate_ia32 __
        err |= __put_user(current->thread.trap_no, &sc->trapno);
        err |= __put_user(current->thread.error_code, &sc->err);
        err |= __put_user((u32)regs->rip, &sc->eip);
-       eflags = regs->eflags;
-       if (current->ptrace & PT_PTRACED)
-               eflags &= ~TF_MASK;
-       err |= __put_user((u32)eflags, &sc->eflags);
+       err |= __put_user((u32)regs->eflags, &sc->eflags);
        err |= __put_user((u32)regs->rsp, &sc->esp_at_signal);
 
        tmp = save_i387_ia32(current, fpstate, regs, 0);
@@ -425,7 +421,11 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
                rsp = (unsigned long) ka->sa.sa_restorer;
        }
 
-       return (void __user *)((rsp - frame_size) & -8UL);
+       rsp -= frame_size;
+       /* Align the stack pointer according to the i386 ABI,
+        * i.e. so that on function entry ((sp + 4) & 15) == 0. */
+       rsp = ((rsp + 4) & -16ul) - 4;
+       return (void __user *) rsp;
 }
 
 int ia32_setup_frame(int sig, struct k_sigaction *ka,
@@ -501,13 +501,9 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
        regs->ss = __USER32_DS; 
 
        set_fs(USER_DS);
-       if (regs->eflags & TF_MASK) {
-               if (current->ptrace & PT_PTRACED) {
-                       ptrace_notify(SIGTRAP);
-               } else {
-                       regs->eflags &= ~TF_MASK;
-               }
-       }
+    regs->eflags &= ~TF_MASK;
+    if (test_thread_flag(TIF_SINGLESTEP))
+        ptrace_notify(SIGTRAP);
 
 #if DEBUG_SIG
        printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
@@ -601,13 +597,9 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        regs->ss = __USER32_DS; 
 
        set_fs(USER_DS);
-       if (regs->eflags & TF_MASK) {
-               if (current->ptrace & PT_PTRACED) {
-                       ptrace_notify(SIGTRAP);
-               } else {
-                       regs->eflags &= ~TF_MASK;
-               }
-       }
+    regs->eflags &= ~TF_MASK;
+    if (test_thread_flag(TIF_SINGLESTEP))
+        ptrace_notify(SIGTRAP);
 
 #if DEBUG_SIG
        printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",