Skip to content

gcc build: XMScopy varargs call doesn't work as expected #171

@ecm-pushbx

Description

@ecm-pushbx

This is XMScopy, a varargs function that's called with the contents for an XMS move structure:

freecom/shell/cswapc.c

Lines 97 to 125 in e24bd7e

#ifdef __GNUC__
__attribute__((noinline))
#endif
static int XMScopy(
long length, ...
/* short shandle,
long soffset,
short dhandle,
long doffset */
)
{
assert(XMSdriverAdress);
/* asm push si;
asm lea si,length
asm mov ah,0bh; */
#if defined(__TURBOC__)
_SI = (unsigned)&length;
_AH = 0xb;
XMSrequest();
/* asm pop si; */
return _AX; /* shut up warning */
#elif defined(__GNUC__)
return XMSrequest(0xb00, 0, &length);
#else
return XMSdriverAdress(0xb00, 0, &length);
#endif
}

However, in my gcc build this doesn't work. Here's an excerpt from debugging:

-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A72 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B67 NV UP EI PL NZ AC PO NC
C00F:0B67 36C706D00F0100    mov     word [ss:0FD0], 0001           SS:0FD0=0000
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A72 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B6E NV UP EI PL NZ AC PO NC
C00F:0B6E 36C606C60F02      mov     byte [ss:0FC6], 02               SS:0FC6=01
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A72 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B74 NV UP EI PL NZ AC PO NC
C00F:0B74 837EE600          cmp     word [bp-1A], +00              SS:3A76=0622
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A72 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B78 NV UP EI PL NZ NA PE NC
C00F:0B78 7421              jz      0B9B                            not jumping
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A72 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B7A NV UP EI PL NZ NA PE NC
C00F:0B7A 06                push    es
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A70 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B7B NV UP EI PL NZ NA PE NC
C00F:0B7B 06                push    es
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A6E BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B7C NV UP EI PL NZ NA PE NC
C00F:0B7C FF76EA            push    word [bp-16]                   SS:3A7A=0001
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A6C BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B7F NV UP EI PL NZ NA PE NC
C00F:0B7F FF76E4            push    word [bp-1C]                   SS:3A74=F34C
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A6A BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B82 NV UP EI PL NZ NA PE NC
C00F:0B82 06                push    es
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A68 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B83 NV UP EI PL NZ NA PE NC
C00F:0B83 06                push    es
-
AX=0001 BX=C001 CX=6220 DX=0000 SP=3A66 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B84 NV UP EI PL NZ NA PE NC
C00F:0B84 91                xchg    ax, cx
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A66 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B85 NV UP EI PL NZ NA PE NC
C00F:0B85 16                push    ss
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A64 BP=3A90 SI=C00F DI=1D60
DS=C00F ES=0000 SS=CE18 CS=C00F IP=0B86 NV UP EI PL NZ NA PE NC
C00F:0B86 1F                pop     ds
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A66 BP=3A90 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=0B87 NV UP EI PL NZ NA PE NC
C00F:0B87 E86BFE            call    09F5
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A64 BP=3A90 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09F5 NV UP EI PL NZ NA PE NC
C00F:09F5 56                push    si
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A62 BP=3A90 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09F6 NV UP EI PL NZ NA PE NC
C00F:09F6 55                push    bp
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A60 BP=3A90 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09F7 NV UP EI PL NZ NA PE NC
C00F:09F7 89E5              mov     bp, sp
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A60 BP=3A60 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09F9 NV UP EI PL NZ NA PE NC
C00F:09F9 52                push    dx
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A5E BP=3A60 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09FA NV UP EI PL NZ NA PE NC
C00F:09FA 50                push    ax
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A5C BP=3A60 SI=C00F DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09FB NV UP EI PL NZ NA PE NC
C00F:09FB 8D76FC            lea     si, [bp-04]
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A5C BP=3A60 SI=3A5C DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=09FE NV UP EI PL NZ NA PE NC
C00F:09FE 31D2              xor     dx, dx
-
AX=6220 BX=C001 CX=0001 DX=0000 SP=3A5C BP=3A60 SI=3A5C DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=0A00 NV UP EI PL ZR NA PE NC
C00F:0A00 B8000B            mov     ax, 0B00
-
AX=0B00 BX=C001 CX=0001 DX=0000 SP=3A5C BP=3A60 SI=3A5C DI=1D60
DS=CE18 ES=0000 SS=CE18 CS=C00F IP=0A03 NV UP EI PL ZR NA PE NC
C00F:0A03 2EFF1EC008        call    far [cs:08C0]             CS:08C0=F000:F685
-dw ds:si l 10
header     0    2    4    6    8    A    C    E    0123456789ABCDEF
CE18:3A50                     -          6220 0000              b..
CE18:3A60  3A90 C00F 0B8A 0000-0000 F34C           .:........L.
-

Note the lea si, [bp-04] which points not at the function parameters on the stack but rather at a local variable initialised from the length parameter.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions