it appers that either i386das and i386inst are misnamed, or they
are listed incorrectly in /sys/src/libmach/8db.c.  since at least [v7]db
follow the same pattern, i'm pretty sure the header file is wrong.
 also i believe the setting of errstr() in i386das and i386inst is incorrect.
(for a demonstration, try asm(stackaddress) on a running 386 executable.
you'll get a few bytes of unprintable garbage.)

- erik


Machdata i386mach =
{
        {0xCC, 0, 0, 0},        /* break point: INT 3 */
        1,                      /* break point size */

        leswab,                 /* convert short to local byte order */
        leswal,                 /* convert long to local byte order */
        leswav,                 /* convert vlong to local byte order */
        i386trace,              /* C traceback */
        i386frame,              /* frame finder */
        i386excep,              /* print exception */
        0,                      /* breakpoint fixup */
        leieeesftos,            /* single precision float printer */
        leieeedftos,            /* double precision float printer */
        i386foll,               /* following addresses */
>>      i386inst,               /* print instruction */
>>      i386das,                /* dissembler */
        i386instlen,            /* instruction size calculation */
};

yet

/sys/include/mach.h:202,219
struct  Machdata {              /* Machine-dependent debugger support */
        uchar   bpinst[4];                      /* break point instr. */
        short   bpsize;                         /* size of break point instr. */

        ushort  (*swab)(ushort);                /* ushort to local byte order */
        ulong   (*swal)(ulong);                 /* ulong to local byte order */
        uvlong  (*swav)(uvlong);                /* uvlong to local byte order */
        int     (*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback 
*/
        uvlong  (*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame 
finder */
        char*   (*excep)(Map*, Rgetter);        /* last exception */
        ulong   (*bpfix)(uvlong);               /* breakpoint fixup */
        int     (*sftos)(char*, int, void*);    /* single precision float */
        int     (*dftos)(char*, int, void*);    /* double precision float */
        int     (*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
>>      int     (*das)(Map*, uvlong, char, char*, int); /* symbolic disassembly 
>> */
>>      int     (*hexinst)(Map*, uvlong, char*, int);   /* hex disassembly */
        int     (*instsize)(Map*, uvlong);      /* instruction size */
};

Reply via email to