[Bug 23323] World of Warcraft crashes upon login after 3.3.5 patch.

wine-bugs at winehq.org wine-bugs at winehq.org
Sun Jun 27 19:03:45 CDT 2010


http://bugs.winehq.org/show_bug.cgi?id=23323





--- Comment #98 from Stefan <stefan.demharter at gmx.net>  2010-06-27 19:03:44 ---
(In reply to comment #95)
> Thanks, Stefan, your patch works like a charm!  Kernel 2.6.34 + Wine 1.2-rc5,
> now working.
> 
> Would you mind explaining a bit what the problem was, how it affected Wine, and
> how your patch fixes it?
> I am very curious :)

Hi Devin,

after I had found the problematic commit I compared the code before the commit
with the current code. As I don't know what the code does I did trial-and-error
runs on the differences to create a minimal patch solving the issue for me.


I'll show the difference in the problematic code fragment:

The code fragment before the commit:

        if (condition & DR_STEP) {
                if (!user_mode(regs))
                        goto clear_TF_reenable;
        }

        si_code = get_si_code(condition);
        /* Ok, finally something we can handle */
        send_sigtrap(tsk, regs, error_code, si_code);
...
clear_TF_reenable:
        set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
        regs->flags &= ~X86_EFLAGS_TF;
        preempt_conditional_cli(regs);
        return;

The code fragment in the current kernel:

        if ((dr6 & DR_STEP) && !user_mode(regs)) {
                tsk->thread.debugreg6 &= ~DR_STEP;
                set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
                regs->flags &= ~X86_EFLAGS_TF;
        }
        si_code = get_si_code(tsk->thread.debugreg6);
        if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS))
                send_sigtrap(tsk, regs, error_code, si_code);
        preempt_conditional_cli(regs);

Note, that the variable "condition" was renamed to "dr6" in the new code.
As you can see the two "if"-conditions of the first code fragment are equal to
the "if"-condition of the second one. But in the first code fragment the
program jumps to the end of the function and "get_si_code"/"send_sigtrap" are
never called whereas in the second code fragment "get_si_code" is always and
"send_sigtrap" may be called.

Furthermore, if you just look at the code after the "if"-case you can see:
"send_sigtrap" is always called in the first code fragment whereas it only is
called in the second one if a certain a condition is fulfilled.


My patch more or less restores the old behaviour. I.e.
"get_si_code"/"send_sigtrap" are never called in the if-case and are always
called in the else-case.


As I said initially, I don't really know what the kernel code does here.
So I can't tell you how and why this affects wine.
Neither can I tell you if this patch fixes the issue in the right way.
Nevertheless I hope this satifies your curiosity a little bit ;)

Maybe a good starting point for further investigations is
http://lkml.org/lkml/2009/12/17/462 which has some discussion about the same
commit and a similar patch (which doesn't work for me as mentioned in my
previous post).


Regards,
Stefan

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the wine-bugs mailing list