Hi,
Anyone looked at 2.6.11-rc1 for the host? Some more ptrace cleanups
happened there, and one of the changes conflicts with the sysemu code in
the skas-v7 patch for 2.6.10. To me it's not clear how to solve that
conflict as I'm not familier with the sysemu stuff and how these tree
trace flags (syscall, sysemu, singlestep) play together ...
The conflicting changeset is attached below for reference. There are
also some more ptrace changes (for singlestep) which might need fixups
in sysemu.
Gerd
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2005/01/01 12:24:01-08:00 [EMAIL PROTECTED]
# x86: common send_sigtrap helper for debug event SIGTRAP's,
# and use that for system call single-step events.
#
# This one also gets the user mode test right, and makes sure
# the siginfo is not leaking any stack contents.
#
# include/asm-i386/ptrace.h
# 2005/01/01 12:23:50-08:00 [EMAIL PROTECTED] +2 -0
# x86: common send_sigtrap helper for debug event SIGTRAP's,
# and use that for system call single-step events.
#
# This one also gets the user mode test right, and makes sure
# the siginfo is not leaking any stack contents.
#
# arch/i386/kernel/traps.c
# 2005/01/01 12:23:50-08:00 [EMAIL PROTECTED] +1 -13
# x86: common send_sigtrap helper for debug event SIGTRAP's,
# and use that for system call single-step events.
#
# This one also gets the user mode test right, and makes sure
# the siginfo is not leaking any stack contents.
#
# arch/i386/kernel/ptrace.c
# 2005/01/01 12:23:50-08:00 [EMAIL PROTECTED] +27 -5
# x86: common send_sigtrap helper for debug event SIGTRAP's,
# and use that for system call single-step events.
#
# This one also gets the user mode test right, and makes sure
# the siginfo is not leaking any stack contents.
#
diff -Nru a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c
--- a/arch/i386/kernel/ptrace.c 2005-01-21 12:08:33 +01:00
+++ b/arch/i386/kernel/ptrace.c 2005-01-21 12:08:33 +01:00
@@ -553,6 +553,24 @@
return ret;
}
+void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int
error_code)
+{
+ struct siginfo info;
+
+ tsk->thread.trap_no = 1;
+ tsk->thread.error_code = error_code;
+
+ memset(&info, 0, sizeof(info));
+ info.si_signo = SIGTRAP;
+ info.si_code = TRAP_BRKPT;
+
+ /* User-mode eip? */
+ info.si_addr = user_mode(regs) ? (void __user *) regs->eip : NULL;
+
+ /* Send us the fakey SIGTRAP */
+ force_sig_info(SIGTRAP, &info, tsk);
+}
+
/* notification of system call entry/exit
* - triggered by current->work.syscall_trace
*/
@@ -568,15 +586,19 @@
audit_syscall_exit(current, regs->eax);
}
- if (!test_thread_flag(TIF_SYSCALL_TRACE) &&
- !test_thread_flag(TIF_SINGLESTEP))
- return;
if (!(current->ptrace & PT_PTRACED))
return;
+
+ /* Fake a debug trap */
+ if (test_thread_flag(TIF_SINGLESTEP))
+ send_sigtrap(current, regs, 0);
+
+ if (!test_thread_flag(TIF_SYSCALL_TRACE))
+ return;
+
/* the 0x80 provides a way for the tracing parent to distinguish
between a syscall stop and SIGTRAP delivery */
- ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) &&
- !test_thread_flag(TIF_SINGLESTEP) ? 0x80 : 0));
+ ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ? 0x80 :
0));
/*
* this isn't the same as continuing with a signal, but it will do
diff -Nru a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
--- a/arch/i386/kernel/traps.c 2005-01-21 12:08:33 +01:00
+++ b/arch/i386/kernel/traps.c 2005-01-21 12:08:33 +01:00
@@ -682,7 +682,6 @@
{
unsigned int condition;
struct task_struct *tsk = current;
- siginfo_t info;
__asm__ __volatile__("movl %%db6,%0" : "=r" (condition));
@@ -723,18 +722,7 @@
}
/* Ok, finally something we can handle */
- tsk->thread.trap_no = 1;
- tsk->thread.error_code = error_code;
- info.si_signo = SIGTRAP;
- info.si_errno = 0;
- info.si_code = TRAP_BRKPT;
-
- /* If this is a kernel mode trap, save the user PC on entry to
- * the kernel, that's what the debugger can make sense of.
- */
- info.si_addr = ((regs->xcs & 3) == 0) ? (void __user *)tsk->thread.eip
- : (void __user *)regs->eip;
- force_sig_info(SIGTRAP, &info, tsk);
+ send_sigtrap(tsk, regs, error_code);
/* Disable additional traps. They'll be re-enabled when
* the signal is delivered.
diff -Nru a/include/asm-i386/ptrace.h b/include/asm-i386/ptrace.h
--- a/include/asm-i386/ptrace.h 2005-01-21 12:08:33 +01:00
+++ b/include/asm-i386/ptrace.h 2005-01-21 12:08:33 +01:00
@@ -55,6 +55,8 @@
#define PTRACE_SET_THREAD_AREA 26
#ifdef __KERNEL__
+struct task_struct;
+extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int
error_code);
#define user_mode(regs) ((VM_MASK & (regs)->eflags) || (3 & (regs)->xcs))
#define instruction_pointer(regs) ((regs)->eip)
#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel