[comp.os.minix] Minix Debugger for ATARI ST

bds@lzaz.ATT.COM (B.SZABLAK) (12/22/88)

echo x - mdb.1
gres '^X' '' > mdb.1 << '/'
XCOMMAND
X   mdb(1)	- MINIX Debugger
X
XINVOCATION
X   mdb [<executable> [<link file>]]
X
XEXPLANATION
X   Mdb provides a means of debugging minix programs. It supports symbolic
X   debugging if a "link file" exists; the link file is the output of the
X   ACK linker: ld. The arguments to mdb are:
X
X	<executable>	- The MINIX executable file. Defaults to "a.out".
X	<link file>	- The MINIX link file. Defaults to none.
X
X   Once started, mdb will display a command prompt: '*'. A command may
X   be entered in the following form:
X
X	[<expression>][<command> [<argument>]]
X
X   <expression> is a symbolic expression representing a location
X   in memory or a register, and should be in the form:
X
X	[<value> [+|- <value>]]
X
X   A <value> may be a symbol, a register, or a constant.
X   The symbol may be any external symbol found in the link file, or "_start"
X   if no link file is specified. "_start" represents the beginning address
X   of the program. A register is specified by a '$' followed by the
X   register's name, while a constant may be either an octal, decimal or hex
X   unsigned long integer expressed using standard C notation (no 'L' suffix
X   should be used). A character constant is represented by a single quote
X   followed by the character.
X
X   Not all commands use an address, but those that do have a default
X   value of the current program counter with the exception of the continue
X   command: 'c' and 'C'. Not all commands use an argument
X   list, but those that do default to an empty list. If the argument
X   contains a semi-colon (';'), then except for the breakpoint
X   command ('b') the string following the semi-colon is assumed to be a
X   new command.
X
X   Following is the list of valid commands. When mdb is first started,
X   no process is active. Most of the following commands require an active
X   process which may be created using the run ('r') command.
X
X	! - If the exclaimation point begins the command line then the
X	    MINIX program that follows it is executed. The default
X	    command is "/bin/sh". Note: full path names are required.
X
X		Example: * !vi mdb.c
X
X	    If the expression preceeding the exclaimation point is a
X	    valid data address, then the arguments specify how to modify
X	    its contents. The argument is to be in the form:
X		[<constant>] [<size>] [<expression>]
X	    and are interpreted as: "fill the data space starting at the
X	    specified address with <constant> values given by <expression>
X	    and are of size byte ('b'), half word ('h', i.e. short),
X	    or long word ('l')." The default value of constant is 1, of
X	    size is 'h', and of expression is 0.
X
X		Example: * _buf ! 20b 'a
X
X	T - This command prints the current active function in the program with
X	    its arguments.
X
X		Example: * T
X
X	t - This command prints the current function invocation
X	    heirarchy with their arguments.
X
X		Example: * t
X
X	/ - This command prints the values starting at the address
X	    specified. The argument is to be in the form:
X		[<constant>][<size>][<format>]
X	    format may have the values:
X		a - Displays characters until a zero value is found
X		    (<constant> and <size> are ignored).
X		c - Displays <constant> values as characters.
X		d - Displays <constant> values as signed decimal numbers.
X		i - Disassembles <constant> instructions (<size> ignored).
X		I - Disassembles <constant> instructions (<size> ignored).
X		o - Displays <constant> vlaues as octal numbers.
X		s - Displays characters until a zero value is found
X		    starting at the address contained at the location
X		    specified (<constant> and <size> are ignored).
X		u - Displays <constant> vlaues as unsigned decimal numbers.
X		x - Displays <constant> vlaues as hexadecimal numbers.
X
X		Example: * $a6-2/hx
X
X	x - This command prints the registers and the instructions
X	    starting at the specified address. An optional constant
X	    argument limits the number of instructions printed.
X
X		Example: * x
X
X	X - This command prints the instructions starting at the specified
X	    address. An optional constant argument limits the number of
X	    instructions printed.
X
X		Example: * _start X 10
X
X	R - This command starts a process using the executable given
X	    as mbd's first argument. The process will have no arguments
X	    and will be stopped prior to executing any instructions.
X
X		Example: * R
X
X	r - This command starts a process using the executable given
X	    as mbd's first argument. The process will be given the
X	    arguments on the command line up to the first semi-colon.
X	    If no arguments are specifed, then the arguments supplied
X	    with the last 'r' command are used. The processes' standard
X	    input and output may be redirected. The process will be
X	    stopped prior to executing any instructions.
X
X		Example: * r 3 <input >output
X
X	C - This command results in the stopped process being restarted
X	    with a pending signal specfied by the constant argument.
X	    A breakpoint is placed at the address specified if one is
X	    not already there, and if placed it is deleted when the
X	    process stops for any reason. No default address is assumed.
X
X		Example: * C 2
X
X	c - This command results in the stopped process being restarted
X	    with all pending signals canceled. A breakpoint is placed
X	    at the address specified if one is not already there, and
X	    if placed it is deleted when the process stops for any reason.
X	    No default address is assumed.
X
X		Example: * _func+4 c
X
X	I - This command results in the stopped process executing
X	    instructions in single step mode. The number of instructions
X	    executed is given in the constant argument. The signal
X	    that stopped the process will be sent when execution begins.
X
X		Example: * I 10
X
X
X	i - This command results in the stopped process executing
X	    instructions in single step mode. The number of instructions
X	    executed is given in the constant argument. All pending
X	    signals are canceled before execution begins.
X
X		Example: * i 10
X
X	M - This command results in the stopped process resuming
X	    execution until the long word at the location specified by the
X	    address is modified or until the number of instructions
X	    specified in the obtional constant argument are executed.
X	    The default number is 65,536. Each executed instruction is
X	    displayed prior to execution.
X
X		Example: * _var M 100
X
X	m - This command results in the stopped process resuming
X	    execution until the long word at the location specified by the
X	    address is modified or until the number of instructions
X	    specified in the obtional constant argument are executed.
X	    The default number is 65,536.
X
X		Example: * _var m
X
X	k - This command results in the current active process being
X	    terminated.
X
X		Example: * k
X
X	B - This command results in all the currently active breakpoints
X	    being listed.
X
X		Example: * B
X
X	b - This command results in a breakpoint being placed at the
X	    location specified by the address in program space. The
X	    string that follows the command contains the command(s) that
X	    are executed when the breakpoint is hit. It is recommended
X	    that breakpoints be placed at an offset of 4 bytes from the
X	    function entry point to permit a valid frame to be set up
X	    for back-tracing.
X
X		Example: * _func+4 b t;_var/lx
X
X	d - This command results in the breakpoint at the address
X	    specified being deleted.
X
X		Example: * _func+4 d
X
X	D - This command results in all breakpoints being deleted.
X
X		Example: * D
X
X	q - This command results in the currently active process being
X	    terminated and mdb exiting.
X
X		Example: * q
X
XRESULTS
X   Mdb's exit status is always zero.
X
XREFERENCES
X   ptrace(2)
/
echo x - user.h
gres '^X' '' > user.h << '/'
X#include "h/type.h"
X#include "h/const.h"
X#include "kernel/type.h"
X#include "kernel/const.h"
X#undef printf
X
Xstruct proc {
X#ifdef i8088
X  int p_reg[NR_REGS];		/* process' registers */
X#endif
X#ifdef ATARI_ST
X  long p_reg[NR_REGS];		/* process' registers */
X#endif
X  int *p_sp;			/* stack pointer */
X  struct pc_psw p_pcpsw;	/* pc and psw as pushed by interrupt */
X#ifdef i8088
X  int *p_splimit;		/* lowest legal stack value */
X#endif
X#ifdef ATARI_ST
X  int *p_splow;			/* lowest observed stack value */
X  int p_trap;			/* trap type (only low byte) */
X#endif
X  int p_flags;			/* P_SLOT_FREE, SENDING, RECEIVING, etc. */
X  struct mem_map p_map[NR_SEGS];/* memory map */
X#ifdef ATARI_ST
X  phys_clicks p_shadow;		/* set if shadowed process image */
X  int p_nflips;			/* statistics */
X  char p_physio;		/* cannot be (un)shadowed now if set */
X#endif
X  int p_pid;			/* process id passed in from MM */
X
X  real_time user_time;		/* user time in ticks */
X  real_time sys_time;		/* sys time in ticks */
X  real_time child_utime;	/* cumulative user time of children */
X  real_time child_stime;	/* cumulative sys time of children */
X  real_time p_alarm;		/* time of next alarm in ticks, or 0 */
X
X  struct proc *p_callerq;	/* head of list of procs wishing to send */
X  struct proc *p_sendlink;	/* link to next proc wishing to send */
X  message *p_messbuf;		/* pointer to message buffer */
X  int p_getfrom;		/* from whom does process want to receive? */
X
X  struct proc *p_nextready;	/* pointer to next ready process */
X  int p_pending;		/* bit map for pending signals 1-16 */
X};
/
echo x - strtol.c
gres '^X' '' > strtol.c << '/'
Xlong 
Xstrtol(s, p, base)
X	char	*s, **p;
X{
X	long	r;
X	int	sign, digit, hexlow, hexup, c;
X
X	r = 0L;
X	sign = 0;
X	while (*s == ' ' || *s == '\t') ++s;
X	if (*s == '-')
X	{
X		sign = 1;
X		++s;
X	}
X	if (base == 0)
X	{
X		if (*s == '0') base = (s[1] == 'x' || s[1] == 'X') ? 16 : 8;
X		else base = 10;
X	}
X	if (*s == '0' && (s[1] == 'x' || s[1] == 'X') && base == 16) s += 2;
X	digit = (base <= 10) ? (base + '0' - 1) : '9';
X	hexlow = 'a' + base - 10;
X	hexup = 'A' + base - 10;
X	for (c = *s ; ; c = *++s)
X	{
X		if (c >= '0' && c <= digit) c = c - '0';
X		else if (c >= 'a' && c < hexlow) c = c - 'a' + 10;
X		else if (c >= 'A' && c < hexup)	c = c - 'A' + 10;
X		else
X		{
X			if (p != 0) *p = s;
X			return sign ? -r : r;
X		}
X		r = r * base + c;
X	}
X}/
echo x - makefile
gres '^X' '' > makefile << '/'
XCFLAGS=-DATARI_ST -I/usr/src -T/usr/tmp
XOBJS=mdb.o mdbexp.o mdbdis.o strtol.o
XLD=/usr/lib/ld
XCV=/usr/lib/cv
XLIB=/usr/lib/libc.a /usr/lib/end.o
X
Xmdb: $(OBJS)
X	$(LD) -o $*.out -c /usr/lib/crtso.o $(OBJS) $(LIB)
X	$(CV) $*.out $@
X	chmem =10000 $@
/
echo x - out.h
gres '^X' '' > out.h << '/'
X/*
X * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
X * See the copyright notice in the file "../Copyright".
X */
X/*
X * output format for ACK assemblers
X */
X#ifndef ushort
X#define ushort	unsigned short
X#endif ushort
X
Xstruct outhead {
X	ushort 	oh_magic;	/* magic number */
X	ushort 	oh_stamp;	/* version stamp */
X	ushort	oh_flags;	/* several format flags */
X	ushort	oh_nsect;	/* number of outsect structures */
X	ushort	oh_nrelo;	/* number of outrelo structures */
X	ushort	oh_nname;	/* number of outname structures */
X	long	oh_nemit;	/* sum of all os_flen */
X	long	oh_nchar;	/* size of string area */
X};
X
X#define O_MAGIC	0x0201		/* magic number of output file */
X#define	O_STAMP	0		/* version stamp */
X#define MAXSECT	64		/* Maximum number of sections */
X
X#define	HF_LINK	0x0004		/* unresolved references left */
X#define	HF_8086	0x0008		/* os_base specially encoded */
X
Xstruct outsect {
X	long 	os_base;	/* startaddress in machine */
X	long	os_size;	/* section size in machine */
X	long	os_foff;	/* startaddress in file */
X	long	os_flen;	/* section size in file */
X	long	os_lign;	/* section alignment */
X};
X
Xstruct outrelo {
X	char	or_type;	/* type of reference */
X	char	or_sect;	/* referencing section */
X	ushort	or_nami;	/* referenced symbol index */
X	long	or_addr;	/* referencing address */
X};
X
Xstruct outname {
X	union {
X	  char	*on_ptr;	/* symbol name (in core) */
X	  long	on_off;		/* symbol name (in file) */
X	}	on_u;
X#define on_mptr	on_u.on_ptr
X#define on_foff	on_u.on_off
X	ushort	on_type;	/* symbol type */
X	ushort	on_desc;	/* debug info */
X	long	on_valu;	/* symbol value */
X};
X
X/*
X * relocation type bits
X */
X#define RELSZ	0x07		/* relocation length */
X#define RELO1	   1		/* 1 byte */
X#define RELO2	   2		/* 2 bytes */
X#define RELO4	   4		/* 4 bytes */
X#define RELPC	0x08		/* pc relative */
X#define RELBR	0x10		/* High order byte lowest address. */
X#define RELWR	0x20		/* High order word lowest address. */
X
X/*
X * section type bits and fields
X */
X#define S_TYP	0x007F		/* undefined, absolute or relative */
X#define S_EXT	0x0080		/* external flag */
X#define S_ETC	0x7F00		/* for symbolic debug, bypassing 'as' */
X
X/*
X * S_TYP field values
X */
X#define S_UND	0x0000		/* undefined item */
X#define S_ABS	0x0001		/* absolute item */
X#define S_MIN	0x0002		/* first user section */
X#define S_MAX	S_TYP		/* last user section */
X
X/*
X * S_ETC field values
X */
X#define S_SCT	0x0100		/* section names */
X#define S_LIN	0x0200		/* hll source line item */
X#define S_FIL	0x0300		/* hll source file item */
X#define S_MOD	0x0400		/* ass source file item */
X#define S_COM	0x1000		/* Common name. */
X
X/*
X * structure format strings
X */
X#define SF_HEAD		"22222244"
X#define SF_SECT		"44444"
X#define SF_RELO		"1124"
X#define SF_NAME		"4224"
X
X/*
X * structure sizes (bytes in file; add digits in SF_*)
X */
X#define SZ_HEAD		20
X#define SZ_SECT		20
X#define SZ_RELO		8
X#define SZ_NAME		12
X
X/*
X * file access macros
X */
X#define BADMAGIC(x)	((x).oh_magic!=O_MAGIC)
X#define OFF_SECT(x)	SZ_HEAD
X#define OFF_EMIT(x)	(OFF_SECT(x) + ((long)(x).oh_nsect * SZ_SECT))
X#define OFF_RELO(x)	(OFF_EMIT(x) + (x).oh_nemit)
X#define OFF_NAME(x)	(OFF_RELO(x) + ((long)(x).oh_nrelo * SZ_RELO))
X#define OFF_CHAR(x)	(OFF_NAME(x) + ((long)(x).oh_nname * SZ_NAME))
/