From: chrisw@osdl.org Date: Wed, 27 Apr 2005 18:22:41 +0000 (-0700) Subject: [PATCH] add patches from DaveM: sparc-fix-PTRACE_CONT.patch sparc64-fixcopy_siginfo_t... X-Git-Tag: v2.6.11.9~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=34a51031de55df55badb43735047f02c91bc0e6b;p=thirdparty%2Fkernel%2Fstable-queue.git [PATCH] add patches from DaveM: sparc-fix-PTRACE_CONT.patch sparc64-fixcopy_siginfo_to_user32.patch sparc64-use-message-queue-compat.patch --- diff --git a/review/sparc-fix-PTRACE_CONT.patch b/review/sparc-fix-PTRACE_CONT.patch new file mode 100644 index 00000000000..63691ddda6c --- /dev/null +++ b/review/sparc-fix-PTRACE_CONT.patch @@ -0,0 +1,78 @@ +From stable-bounces@linux.kernel.org Sun Apr 17 17:12:13 2005 +Date: Sun, 17 Apr 2005 17:06:41 -0700 +From: "David S. Miller" +To: stable@kernel.org +Subject: [PATCH] sparc: Fix PTRACE_CONT bogosity + +SunOS aparently had this weird PTRACE_CONT semantic which +we copied. If the addr argument is something other than +1, it sets the process program counter to whatever that +value is. + +This is different from every other Linux architecture, which +don't do anything with the addr and data args. + +This difference in particular breaks the Linux native GDB support +for fork and vfork tracing on sparc and sparc64. + +There is no interest in running SunOS binaries using this weird +PTRACE_CONT behavior, so just delete it so we behave like other +platforms do. + +From: "David S. Miller" +Signed-off-by: Chris Wright +--- + +===== arch/sparc/kernel/ptrace.c 1.22 vs edited ===== +--- 1.22/arch/sparc/kernel/ptrace.c 2005-03-13 15:29:55 -08:00 ++++ edited/arch/sparc/kernel/ptrace.c 2005-04-13 22:37:33 -07:00 +@@ -530,18 +530,6 @@ + pt_error_return(regs, EIO); + goto out_tsk; + } +- if (addr != 1) { +- if (addr & 3) { +- pt_error_return(regs, EINVAL); +- goto out_tsk; +- } +-#ifdef DEBUG_PTRACE +- printk ("Original: %08lx %08lx\n", child->thread.kregs->pc, child->thread.kregs->npc); +- printk ("Continuing with %08lx %08lx\n", addr, addr+4); +-#endif +- child->thread.kregs->pc = addr; +- child->thread.kregs->npc = addr + 4; +- } + + if (request == PTRACE_SYSCALL) + set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); +===== arch/sparc64/kernel/ptrace.c 1.24 vs edited ===== +--- 1.24/arch/sparc64/kernel/ptrace.c 2005-02-10 19:06:44 -08:00 ++++ edited/arch/sparc64/kernel/ptrace.c 2005-04-16 20:52:21 -07:00 +@@ -514,25 +563,6 @@ + pt_error_return(regs, EIO); + goto out_tsk; + } +- if (addr != 1) { +- unsigned long pc_mask = ~0UL; +- +- if ((child->thread_info->flags & _TIF_32BIT) != 0) +- pc_mask = 0xffffffff; +- +- if (addr & 3) { +- pt_error_return(regs, EINVAL); +- goto out_tsk; +- } +-#ifdef DEBUG_PTRACE +- printk ("Original: %016lx %016lx\n", +- child->thread_info->kregs->tpc, +- child->thread_info->kregs->tnpc); +- printk ("Continuing with %016lx %016lx\n", addr, addr+4); +-#endif +- child->thread_info->kregs->tpc = (addr & pc_mask); +- child->thread_info->kregs->tnpc = ((addr + 4) & pc_mask); +- } + + if (request == PTRACE_SYSCALL) { + set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); + + diff --git a/review/sparc64-fixcopy_siginfo_to_user32.patch b/review/sparc64-fixcopy_siginfo_to_user32.patch new file mode 100644 index 00000000000..40ab8037dbc --- /dev/null +++ b/review/sparc64-fixcopy_siginfo_to_user32.patch @@ -0,0 +1,37 @@ +From stable-bounces@linux.kernel.org Sun Apr 17 17:10:52 2005 +Date: Sun, 17 Apr 2005 17:05:19 -0700 +From: "David S. Miller" +To: stable@kernel.org +Subject: [PATCH] sparc64: Fix copy_sigingo_to_user32() + +From: jurij@wooyd.org + +Because this routine was not filling in the siginfo +values for si_band and si_fd, this broke applications +trying to actually get at this data. + +This makes the sparc64 code in line with PowerPC64's +implementation, which already gets it right. + +Signed-off-by: David S. Miller +Signed-off-by: Chris Wright +--- + +===== arch/sparc64/kernel/signal32.c 1.52 vs edited ===== +--- 1.52/arch/sparc64/kernel/signal32.c 2005-03-13 15:29:47 -08:00 ++++ edited/arch/sparc64/kernel/signal32.c 2005-04-17 14:37:13 -07:00 +@@ -192,9 +192,12 @@ + err |= __put_user(from->si_uid, &to->si_uid); + break; + case __SI_FAULT >> 16: +- case __SI_POLL >> 16: + err |= __put_user(from->si_trapno, &to->si_trapno); + err |= __put_user((unsigned long)from->si_addr, &to->si_addr); ++ break; ++ case __SI_POLL >> 16: ++ err |= __put_user(from->si_band, &to->si_band); ++ err |= __put_user(from->si_fd, &to->si_fd); + break; + case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ + case __SI_MESGQ >> 16: + diff --git a/review/sparc64-use-message-queue-compat.patch b/review/sparc64-use-message-queue-compat.patch new file mode 100644 index 00000000000..cf962d407f4 --- /dev/null +++ b/review/sparc64-use-message-queue-compat.patch @@ -0,0 +1,27 @@ +From stable-bounces@linux.kernel.org Sun Apr 17 17:11:32 2005 +Date: Sun, 17 Apr 2005 17:05:59 -0700 +From: "David S. Miller" +To: stable@kernel.org +Subject: [PATCH]: sparc64: use message queue compat syscalls + +A couple message queue system call entries for compat tasks +were not using the necessary compat_sys_*() functions, causing +some glibc test cases to fail. + +From: "David S. Miller" +Signed-off-by: Chris Wright +--- + +===== arch/sparc64/kernel/systbls.S 1.69 vs edited ===== +--- 1.69/arch/sparc64/kernel/systbls.S 2005-01-14 11:56:05 -08:00 ++++ edited/arch/sparc64/kernel/systbls.S 2005-04-11 15:09:49 -07:00 +@@ -75,7 +75,7 @@ + /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun + .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy + /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink +- .word sys_mq_timedsend, sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid ++ .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid + /*280*/ .word sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl + + #endif /* CONFIG_COMPAT */ +