File:  [MW Coherent from dump] / coherent / b / bin / db / db.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:36 2019 UTC (7 years, 2 months ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

/*
 * db/db.h
 * A debugger.
 * Header file.
 */

#define	VERSION	"4.1.9"			/* Version number		*/

/* Use or ignore function prototypes. */
#ifdef	PROTO_OK
#define	__(args)	args		/* Use prototype info		*/
#else
#define	__(args)	()		/* Prototype info disappears	*/
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <l.out.h>
#include <coff.h>		/* header bug: must follow l.out.h */
#include <sys/reg.h>
#include <ieeefp.h>		/* header bug: must follow <sys/reg.h> */
#include <sys/types.h>
#include "mdb.h"
/* #include "mdbdefs.h"		#included below, after type definitions */

/*
 * Print much too much debug output if DEBUG.
 * Turning the "dbprintf((...));" calls into "printf();" as needed
 * is more useful in practice.
 */
#if	DEBUG
#define	dbprintf(args)	printf args
#else
#define	dbprintf(args)
#endif

/* Print ptrace calls if DBPTRACE. */
#if	DBPTRACE
#define	ptrace(cmd, id, loc, val)	dbptrace((cmd), (id), (loc), (val))
#endif

#define	OLD_CORE	1	/* Support both core formats, just for now */

#define	PROMPT	"db: "			/* default interactive prompt	*/

/* Values for file_type. */
#define	LOUT_FILE	1
#define	COFF_FILE	2
#define	IS_LOUT	(file_type == LOUT_FILE)
#define	IS_COFF	(file_type == COFF_FILE)
#define	IS_OBJ	(file_type == LOUT_FILE || file_type == COFF_FILE)

/* Adjustible manifest constants. */
#define	ARGSIZE	20			/* Max number of args for ':e'	*/
#define	CCSSIZE	8			/* C compiler symbol size	*/
#define COMSIZE	128			/* Command sequence size	*/
#define DISSIZE	64			/* Terminal display size	*/
#define FORSIZE	64			/* Segment format size		*/
#define MISSIZE	256			/* Miscellaneous buffer size	*/
#define	NHASH	64			/* Number of SYM hash buckets	*/
#define NBPT	16			/* Number of breakpoints	*/
#define VALSIZE	10			/* Number of expressions allowed */

/* Single step modes. */
#define SNULL	0			/* Do nothing, :e		*/
#define SSTEP	1			/* Single step, :s		*/
#define SCONT	2			/* Continuous step, :sc		*/
#define SCALL	3			/* Continuous step at call	*/
#define SWAIT	4			/* Step to function return	*/

/* Values for reg_flag; larger values must be superset of smaller. */
#define	R_INVALID	0		/* Registers not read yet	*/
#define	R_SOME		1		/* Registers PC, FP, SP, signo read */
#define	R_GEN		2		/* General registers read	*/
#define	R_ALL		3		/* Registers all read		*/

/* Breakpoint table. */
typedef struct	b_st	{
	int	b_flag;			/* Flag word			*/
	ADDR_T	b_badd;			/* Breakpoint address		*/
	ADDR_T	b_rfpt;			/* Return frame pointer		*/
	ADDR_T	b_sfpt;			/* Single continue frame pointer */
	char	*b_bcom;		/* Breakpoint command		*/
	char	*b_rcom;		/* Return command		*/
	BIN	b_bins;			/* Replaced instruction		*/
} BPT;
/* Breakpoint flags. */
#define BBPT	0x01			/* Ordinary (:b)		*/
#define BRET	0x02			/* Return (:br)			*/
#define BSIN	0x04			/* Single step at call (:sc)	*/

/*
 * Segment definitions.
 * This is a vestige of PDP-11 architecture
 * which has no business living in the machine-independent code.
 */
#define NSEGS	3			/* Number of segments		*/
#define DSEG	0			/* Data				*/
#define ISEG	1			/* Instructions			*/
#define USEG	2			/* User				*/
#define	DSPACE	seg_map[DSEG]		/* Data space			*/
#define ISPACE	seg_map[ISEG]		/* Instruction space		*/
#define USPACE	seg_map[USEG]		/* User area			*/
#define	SEG_NONE -1			/* None of the above		*/

/*
 * Segmentation map.
 * This tells db how to map an address in a given segment
 * into an offset in the program file, in the core file,
 * or in the child process.
 */
typedef struct	map	{
	struct	map	*m_next;	/* Pointer to next		*/
	ADDR_T	m_base;			/* Segment base			*/
	ADDR_T	m_bend;			/* Segment end			*/
	off_t	m_offt;			/* Offset			*/
	int	m_segi;			/* Segment index		*/
	int	m_flag;			/* Flag: program, core, child	*/
} MAP;
/* Map flags. */
#define	MAP_PROG	0		/* Segment in program file	*/
#define	MAP_CORE	1		/* Segment in core file		*/
#define	MAP_CHILD	2		/* Segment in child process	*/

/*
 * Symbol.
 */
typedef struct	sym	{
	struct	sym	*s_next;	/* Hash chain link		*/
	ADDR_T		s_addr;		/* Value			*/
	char		s_segn;		/* Segment			*/
	char		s_id[1];	/* Name				*/
} SYM;

/*
 * Default file names.
 */
#define DEFLT_OBJ	"l.out"		/* object file			*/
#define DEFLT_OBJ2	"a.out"		/* object file if l.out not found */
#define DEFLT_AUX	"core"		/* auxiliary file		*/

/*
 * Value descriptor.
 * A VAL can represent no value (flag==VNULL);
 * an lvalue (flag==VSEGN), i.e. a segment and an ADDR_T address; or
 * a long rvalue (flag==0).
 * In a few places (e.g. "*<number>?"), an rvalue gets coerced to an lvalue,
 * with the segment either implied or invented.
 */
typedef struct	val	{
	unsigned char	v_flag;		/* Flag word			*/
	unsigned char	v_segn;		/* Segment number		*/
	long		v_nval;		/* Value			*/
} VAL;
/* Value flags. */
#define VNULL	1			/* Value is null		*/
#define VSEGN	2			/* Value has known segment	*/

/*
 * Input stack.
 */
typedef	struct	inp	{
	struct	inp	*i_next;	/* Pointer to next		*/
	int		i_type;		/* Type of input		*/
	union	{
		FILE	*i_filp;	/* File pointer			*/
		char	*i_strp;	/* String pointer		*/
	} i_u;
} INP;
/* Input types. */
#define IFILE	1			/* File I/O			*/
#define ICORE	2			/* Core I/O			*/

/* Simple routines implemented as macros. */
#ifdef	NOCANON
#define	getb(segn, bp, n)	getputb((segn), (bp), (n), 0)
#define	putb(segn, bp, n)	getputb((segn), (bp), (n), 1)
#endif
#define	nfree(cp)	free(cp)
#define	nvalue(vp)	((vp)->v_flag & VNULL)
#define	printx		printf
#define	putx(c)		putchar(c)
#define	ungetn(c)	ungotc = (c)

/*
 * Function prototypes.
 */
/* db1.c */
extern	int	main		__((int argc, char *argv[]));
extern	void	arm_sigint	__((void));
extern	void	canlout		__((void));
extern	void	initialize	__((void));
extern	void	leave		__((void));
extern	FILE	*openfile	__((char *name, int rflag));
extern	void	set_core	__((char *name));
extern	void	set_file	__((char *name));
extern	void	set_prog 	__((char *name, int flag));
extern	void	setup		__((int argc, char *argv[]));
extern	int	testint		__((void));
extern	void	usage		__((void));

/* db2.c */
extern	MAP	*map_addr	__((int s, ADDR_T addr));
extern	void	map_clear	__((int s, MAP *endp));
extern	void	map_init	__((void));
extern	void	map_print	__((void));
extern	void	map_set		__((int s, ADDR_T base, ADDR_T size, \
				   off_t offt, int flag));

/* db3.c */
extern	int	command		__((VAL *vp));
extern	char	*conform	__((char *sp, int s, int t1, int t2));
extern	int	display		__((int s, int n));
extern	void	execute		__((char *cmd));
extern	void	flushb		__((ADDR_T addr));
extern	void	helpinfo	__((int flag));
extern	char	*gettime	__((char *sp, int s));
extern	char	*printable	__((char *sp, int c));
extern	void	process		__((void));
extern	void	request		__((void));
extern	int	runfile		__((void));
extern	char	*save_cmd	__((char *buf, char *s));
extern	int	setdata		__((int segn, ADDR_T a));
extern	int	syscall		__((void));

/* db4.c */
extern	int	bpt_del		__((int t, ADDR_T addr));
extern	void	bpt_init	__((void));
extern	void	bpt_display	__((void));
extern	void	bpt_print	__((int t, ADDR_T a, char *cmd));
extern	int	bpt_set		__((int f, ADDR_T addr, ADDR_T fp, char *cmd));

/* db5.c */
extern	int	expr		__((VAL *left, int wall));
extern	int	expr_list	__((VAL vlist[]));
extern	int	lextoken	__((VAL *vp));
extern	ADDR_T	lvalue		__((VAL *vp, ADDR_T v));
#if	0
extern	int	nvalue		__((VAL *vp));
#endif
extern	int	readval		__((VAL *vp, int c));
extern	int	readvar		__((VAL	*vp, int c));
extern	long	rvalue		__((VAL *vp, long v));
extern	void	unlex		__((int c));
extern	int	val_segn	__((VAL *vp));

/* db6.c */
extern	SYM	*findsym	__((int s, ADDR_T addr));
extern	int	hash		__((char *id));
extern	int	is_special	__((SYM *sp));
extern	int	is_symbol	__((SYM *sp));
extern	void	new_sym		__((char *id, ADDR_T addr, int s));
extern	int	read_coff_sym	__((void));
extern	int	read_lout_sym	__((long symseek));
extern	char	*read_strtab	__((void));
extern	char	*symName	__((SYMENT *sym, char *strtab));
extern	int	symval		__((VAL *vp));

/* db7.c */
extern	void	add_input	__((int type, char *cp));
#ifndef	NOCANON
extern	void	canon		__((char *bp, unsigned int n));
#endif
extern	char	*cvt_addr	__((char *buf, int s, ADDR_T addr));
#ifndef	NOCANON
extern	int	getb		__((int segn, char *bp, unsigned int n));
#endif
extern	int	getf		__((FILE *fp, char *bp, int n));
extern	void	getline		__((char *cp));
extern	int	getn		__((void));
extern	int	getputb		__((int segn, char *bp, unsigned int n, int d));
extern	char	*nalloc		__((int n, char *msg));
#if	0
extern	void	nfree		__((char *cp));
#endif
extern	void	panic		__((char *arg1, ...));
extern	void	printb		__((ADDR_T addr));
extern	int	printe		__((char *msg));
extern	int	printr		__((char *arg1, ...));
#if	0
extern	void	printx		__((char *arg1, ...));
#endif
extern	void	putaddr		__((int s, ADDR_T addr));
#ifndef	NOCANON
extern	int	putb		__((int segn, char *bp, unsigned int n));
#endif
extern	int	putf		__((FILE *fp, char *bp, int n));
#if	0
extern	void	putx		__((int c));
#endif
#if	0
extern	void	ungetn		__((int c));
#endif

/* db8.c */
extern	int	getp		__((int f, ADDR_T a, char *bp, int n));
extern	void	killc		__((void));
extern	int	putp		__((int f, ADDR_T a, char *bp, int n));
extern	int	runc		__((void));
extern	int	startc		__((char **argv, char *ifn, char *ofn, int aflag));
extern	int	waitc		__((void));
#if	DBPTRACE
extern	int	dbptrace	__((int cmd, int pid, int loc, int val));
#endif

/*
 * Global variables, defined in db0.c.
 */
extern	ADDR_T	add;			/* Address used by getb		*/
extern	char	*addr_fmt;		/* ADDR_T format for printf	*/
extern	int	aop_size;		/* Default address/operand size	*/
extern	BPT	bpt[NBPT];		/* Breakpoint table		*/
#ifndef	NOCANON
extern	int	cantype;		/* Canonization type		*/
#endif
extern	char	*cfn;			/* Core file name		*/
extern	FILE	*cfp;			/* Core file pointer		*/
extern	FILEHDR	coff_hdr;		/* COFF file header		*/
extern	int	cseg;			/* Current segment		*/
extern	ADDR_T	dot;			/* Current address		*/
extern	MAP	*endpure;		/* End of pure area		*/
extern	int	execflag;		/* Program is in execution	*/
extern	int	file_type;		/* LOUT_FILE or COFF_FILE	*/
extern	INP	*inpp;			/* Input pointer		*/
extern	int	intflag;		/* Interrupt count		*/
extern	char	*lasterr;		/* Last error			*/
extern	struct ldheader	ldh;		/* l.out header			*/
extern	char	*lfn;			/* l.out file name		*/
extern	FILE	*lfp;			/* l.out file pointer		*/
extern	char	miscbuf[MISSIZE];	/* Miscellaneous buffer		*/
extern	int	modsize;		/* Size of last display mode	*/
extern	long	nsyms;			/* Number of symbols		*/
extern	ADDR_T	old_add;		/* Previous address		*/
extern	int	pid;			/* Current process id		*/
extern	char	*prompt;		/* Interactive command prompt	*/
extern	int	reg_flag;		/* R_INVALID, R_SOME, R_GEN, R_ALL */
extern	int	rflag;			/* Read only flag		*/
extern	char	seg_format[NSEGS][FORSIZE]; /* Segment formats		*/
extern	MAP	*seg_map[NSEGS];	/* Segment descriptors		*/
extern	char	*seg_name[NSEGS];	/* Segment names		*/
extern	int	sflag;			/* Don't read symbol table	*/
extern	FILE	*sfp;			/* Symbol table file pointer	*/
extern	char	*step_cmd;		/* Command for single step	*/
extern	int	step_count;		/* Single step count		*/
extern	int	step_mode;		/* Single step mode		*/
extern	int	step_prev;		/* Last mode run (if single)	*/
extern	SYM	*symhash[NHASH];	/* SYM table hash buckets	*/
extern	int	ungotc;			/* Ungot character		*/

/*
 * Define functions and globals defined in machine-dependent code.
 * This must follow the type definitions above.
 */
#include "mdbdefs.h"

/*
 * Functions and variables in /lib/libc.a.
 */
extern	char	*ctime();
extern	char	*signame[];		/* Signal names			*/

/* end of db/db.h */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.