wine ptrace trouble

Peter Beutner p.beutner at gmx.net
Tue Oct 25 09:27:08 CDT 2005


Jesse Allen schrieb:
> Thanks for the links.  Now we need to determine what has and hasn't
> changed since.  Luckily I've kept most of the information I gathered
> originally.
> [..]

thx for all the infos.
I managed to track down the missing pieces in the kernel. The mentioned ptrace fix wasnt
applied to the ia32 emulation code under x86_64. I already send a patch to lkml:
http://lkml.org/lkml/2005/10/24/198

A attach the patch again in case anyone wants to try it.


-------------- next part --------------
Be more careful with TF handling to fix some copy protection codes in Wine

patch originally for i386 by Linus, then ported to x86_64 by Andi Kleen
see [PATCH] x86_64: Some fixes for single step handling
commit: be61bff789fe44bfb6d9282d8f7eccc860bdcfb6

But it was never applied to the ia32 emulation code which breaks again some
copy-protection schemes under wine when running on x86_64.

Signed-off-by: Peter Beutner <p.beutner at gmx.net>

--- linux-2.6/arch/x86_64/ia32/ia32_signal.c.old	2005-10-25 00:52:29.000000000 +0200
+++ linux-2.6/arch/x86_64/ia32/ia32_signal.c	2005-10-25 00:52:59.000000000 +0200
@@ -353,7 +353,6 @@ ia32_setup_sigcontext(struct sigcontext_
 		 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_
 	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);
@@ -505,13 +501,9 @@ int ia32_setup_frame(int sig, struct k_s
 	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",
@@ -605,13 +597,9 @@ int ia32_setup_rt_frame(int sig, struct 
 	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",


More information about the wine-devel mailing list