• Fwd: BUGREPORT: ___dpmi_get_raw_mode_switch_addr() modifies SI register

    From [via djgpp@delorie.com]" @21:1/5 to All on Tue Aug 2 10:07:39 2022
    The 'djgpp' mailing list is more active - forwarding this to it:

    ---------- Forwarded message ----------
    From: "lostxwind (lostxwind@163.com) [via djgpp-workers@delorie.com]" <djgpp-workers@delorie.com>
    Date: Mon, 1 Aug 2022 06:12:26 +0800 (CST)
    Subject: Re:BUGREPORT: ___dpmi_get_raw_mode_switch_addr() modifies SI
    register and doesn't save it
    To: djgpp-workers@delorie.com

    Hi,

    I was trying to issue a bug report on delorie official site (https://www.delorie.com/djgpp/bugs/create.cgi) but failed as the
    database is closed. So I tried to contact you through email.

    BUGREPROT:

    BACKGROUND:
    ___dpmi_get_raw_mode_switch_addr() is needed to switch modes for some
    reason, instead of the __dpmi_simulate_real_mode_* class.
    SYMPTOM:
    Random crashes involving switch between real(/v86) mode and protected mode. REASON:
    I found variables or function parameters corrupted after calling ___dpmi_get_raw_mode_switch_addr().
    After reading the source code, I believe that the implementation of ___dpmi_get_raw_mode_switch_addr() has missed a single line that saves
    the ESI register.
    src\libc\dpmi\api\d0306.S, line 2-line 4.

    code before fix:
    #define USE_EBX
    #define USE_EDI
    #include "dpmidefs.h"

    possible fix:
    #define USE_EBX
    #define USE_EDI
    #define USE_ESI
    #include "dpmidefs.h"

    Current workaround without bugfix:
    Write a alternative implementation;
    Or wrap the function call with asm that pushl/popl %esi.

    Thanks,
    crazii

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Stefan Ring@21:1/5 to All on Sat Aug 6 08:52:20 2022
    src\libc\dpmi\api\d0306.S, line 2-line 4.

    code before fix:
    #define USE_EBX
    #define USE_EDI
    #include "dpmidefs.h"

    possible fix:
    #define USE_EBX
    #define USE_EDI
    #define USE_ESI
    #include "dpmidefs.h"

    Yes, looks very reasonable, given that the DPMI call explicitly changes (e)si.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From [via djgpp@delorie.com]" @21:1/5 to djgpp@delorie.com on Sun Aug 7 07:14:22 2022
    On 8/6/22, Stefan Ring (stefanrin@gmail.com) [via djgpp@delorie.com] <djgpp@delorie.com> wrote:
    src\libc\dpmi\api\d0306.S, line 2-line 4.

    code before fix:
    #define USE_EBX
    #define USE_EDI
    #include "dpmidefs.h"

    possible fix:
    #define USE_EBX
    #define USE_EDI
    #define USE_ESI
    #include "dpmidefs.h"

    Yes, looks very reasonable, given that the DPMI call explicitly changes (e)si.

    OK then, is the following patch OK to apply?

    ___dpmi_get_raw_mode_switch_addr: push/pop esi.

    Reference issue: https://www.delorie.com/djgpp/mail-archives/browse.cgi?p=djgpp/2022/08/02/03:07:56

    Index: src/libc/dpmi/api/d0306.S ===================================================================
    RCS file: /cvs/djgpp/djgpp/src/libc/dpmi/api/d0306.S,v
    retrieving revision 1.1
    diff -u -p -r1.1 d0306.S
    --- src/libc/dpmi/api/d0306.S 12 Mar 1995 04:52:56 -0000 1.1
    +++ src/libc/dpmi/api/d0306.S 7 Aug 2022 04:08:36 -0000
    @@ -1,6 +1,7 @@
    /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
    #define USE_EBX
    #define USE_EDI
    +#define USE_ESI
    #include "dpmidefs.h"

    .text

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From [via djgpp@delorie.com]" @21:1/5 to All on Sun Aug 7 08:24:44 2022
    From: "Ozkan Sezer (sezeroz@gmail.com) [via djgpp@delorie.com]" <djgpp@delorie.com>
    Date: Sun, 7 Aug 2022 07:14:22 +0300

    On 8/6/22, Stefan Ring (stefanrin@gmail.com) [via djgpp@delorie.com] <djgpp@delorie.com> wrote:
    src\libc\dpmi\api\d0306.S, line 2-line 4.

    code before fix:
    #define USE_EBX
    #define USE_EDI
    #include "dpmidefs.h"

    possible fix:
    #define USE_EBX
    #define USE_EDI
    #define USE_ESI
    #include "dpmidefs.h"

    Yes, looks very reasonable, given that the DPMI call explicitly changes (e)si.

    OK then, is the following patch OK to apply?

    Yes, thanks.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From [via djgpp@delorie.com]" @21:1/5 to djgpp@delorie.com on Sun Aug 7 08:38:42 2022
    On 8/7/22, Eli Zaretskii (eliz@gnu.org) [via djgpp@delorie.com] <djgpp@delorie.com> wrote:
    From: "Ozkan Sezer (sezeroz@gmail.com) [via djgpp@delorie.com]"
    <djgpp@delorie.com>
    Date: Sun, 7 Aug 2022 07:14:22 +0300

    On 8/6/22, Stefan Ring (stefanrin@gmail.com) [via djgpp@delorie.com]
    <djgpp@delorie.com> wrote:
    src\libc\dpmi\api\d0306.S, line 2-line 4.

    code before fix:
    #define USE_EBX
    #define USE_EDI
    #include "dpmidefs.h"

    possible fix:
    #define USE_EBX
    #define USE_EDI
    #define USE_ESI
    #include "dpmidefs.h"

    Yes, looks very reasonable, given that the DPMI call explicitly changes
    (e)si.

    OK then, is the following patch OK to apply?

    Yes, thanks.


    Applied: https://www.delorie.com/bin/cvsweb.cgi/djgpp/src/libc/dpmi/api/d0306.S

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)