diff --git a/commands/Makefile b/commands/Makefile index 3cae84cb1..f67b01405 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -16,13 +16,13 @@ SUBDIR= add_route arp ash at backup basename btrace \ less loadkeys loadramdisk logger look lp \ lpd lspci mail MAKEDEV \ mesg mined mkfifo \ - mount mt netconf nice acknm nohup \ + mount mt netconf nice nohup \ nonamed od paste patch \ ping postinstall poweroff pr prep printroot \ profile progressbar pr_routes ps pwdauth \ ramdisk rarpd rawspeed rcp readclock \ reboot remsync rev rget rlogin \ - rotate rsh rshd service setup shar acksize \ + rotate rsh rshd service setup shar \ sleep slip spell split sprofalyze sprofdiff srccrc \ stty svclog svrctl swifi synctree sysenv \ syslogd tail tcpd tcpdp tcpstat tee telnet \ diff --git a/commands/acknm/Makefile b/commands/acknm/Makefile deleted file mode 100644 index 45bc16fbc..000000000 --- a/commands/acknm/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PROG= acknm -MAN= - -.include diff --git a/commands/acknm/acknm.c b/commands/acknm/acknm.c deleted file mode 100644 index cb043fffe..000000000 --- a/commands/acknm/acknm.c +++ /dev/null @@ -1,226 +0,0 @@ -/* nm - print name list. Author: Dick van Veen */ - -/* Dick van Veen: veench@cs.vu.nl */ - -#include -#include -#include -#include -#include -#include -#include - -/* Read the name list in memory, sort it, and print it. */ - -/* Nm [-gnopru] [file] ... - * - * flags: - * -d address in decimal - * -g print only external symbols. - * -n sort numerically rather than alphabetically. - * -o prepend file name to each line rather than only once. - * -p don't sort, pint n symbol-table order. - * -r sort in reverse order. - * -u print only undefined symbols. - * - * - when no file name is present, a.out is assumed. - * - * NOTE: no archives are supported because assembly files don't - * have symbol tables. - * - */ - -#define A_OUT "a.out" - -int d_flag; -int g_flag; -int n_flag; -int o_flag; -int p_flag; -int r_flag; -int u_flag; - -char io_buf[BUFSIZ]; /* io buffer */ -struct exec header; /* header of a.out file */ -int stbl_elems; /* #elements in symbol table */ - -int main(int argc, char **argv); -int nm_sort(const void *tmp_stbl1, const void *tmp_stbl2); -void nm(char *file); -int read_header(int fd); -void nm_print(char *file, struct nlist *stbl); - -int main(argc, argv) -int argc; -char **argv; -{ - argv++; - while (*argv != 0 && **argv == '-') { - *argv += 1; - while (**argv != '\0') { - switch (**argv) { - case 'd': d_flag = 1; break; - case 'g': g_flag = 1; break; - case 'n': n_flag = 1; break; - case 'o': o_flag = 1; break; - case 'p': p_flag = 1; break; - case 'r': r_flag = 1; break; - case 'u': u_flag = 1; break; - default: - fprintf(stderr, "illegal flag: -%c\n", **argv); - exit(-1); - } - *argv += 1; - } - argv++; - } - setbuf(stdin, io_buf); - if (*argv == 0) - nm(A_OUT); - else - while (*argv != 0) { - nm(*argv); - argv++; - } - return(0); -} - -int nm_sort(tmp_stbl1, tmp_stbl2) -const void *tmp_stbl1, *tmp_stbl2; -{ - - struct nlist *stbl1 = (struct nlist *)tmp_stbl1; - struct nlist *stbl2 = (struct nlist *)tmp_stbl2; - int cmp; - - if (n_flag) { /* sort numerically */ - if ((stbl1->n_sclass & N_SECT) < - (stbl2->n_sclass & N_SECT)) - cmp = -1; - else if ((stbl1->n_sclass & N_SECT) > - (stbl2->n_sclass & N_SECT)) - cmp = 1; - else if (stbl1->n_value < stbl2->n_value) - cmp = -1; - else if (stbl1->n_value > stbl2->n_value) - cmp = 1; - else - cmp = strncmp(stbl1->n_name, stbl2->n_name, (size_t)8); - } else { - cmp = strncmp(stbl1->n_name, stbl2->n_name, (size_t)8); - if (cmp == 0) { - if (stbl1->n_value < stbl2->n_value) - cmp = -1; - else if (stbl1->n_value > stbl2->n_value) - cmp = 1; - } - } - - if (r_flag) cmp = -cmp; /* reverse sort */ - return(cmp); -} - -void nm(file) -char *file; -{ - struct nlist *stbl; - int fd; - - fd = open(file, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "can't open %s\n", file); - return; - } - if (read_header(fd)) { - fprintf(stderr, "%s: no executable file\n", file); - close(fd); - return; - } - if (header.a_syms == 0) { - close(fd); - return; - } - if ((size_t) header.a_syms != header.a_syms) { - fprintf(stderr, "%s: symbol table too large to allocate\n", file); - close(fd); - return; - } - if ((int) header.a_syms != header.a_syms) { - /* This is necessary because we are too lazy to iterate the read. */ - fprintf(stderr, "%s: symbol table too large to read\n", file); - close(fd); - return; - } - stbl = (struct nlist *) malloc((size_t) header.a_syms); - if (stbl == NULL) { - fprintf(stderr, "%s: can't allocate symbol table\n", file); - close(fd); - return; - } - if (read(fd, (char *) stbl, (unsigned) header.a_syms) != header.a_syms) { - fprintf(stderr, "%s: can't read symbol table\n", file); - free(stbl); - close(fd); - return; - } - stbl_elems = (int) header.a_syms / sizeof(struct nlist); - if (!p_flag) qsort(stbl, (size_t)stbl_elems, sizeof(struct nlist), nm_sort); - nm_print(file, stbl); - free(stbl); - close(fd); -} - -int read_header(fd) -int fd; -{ - if (read(fd, (char *) &header, sizeof(struct exec)) != sizeof(struct exec)) - return(1); - if (BADMAG(header)) return(1); - lseek(fd, A_SYMPOS(header), SEEK_SET); - - return(0); -} - -void nm_print(file, stbl) -char *file; -register struct nlist *stbl; -{ - struct nlist *last; - char name[9]; - int n_sclass; - char type; - - name[8] = '\0'; - if (!o_flag) printf("%s:\n", file); - for (last = &stbl[stbl_elems]; stbl != last; stbl++) { - if (g_flag && (stbl->n_sclass & N_CLASS) != C_EXT) continue; - if (u_flag && (stbl->n_sclass & N_SECT) != N_UNDF) continue; - - n_sclass = stbl->n_sclass & N_SECT; - if (n_sclass == N_ABS) - type = 'a'; - else if (n_sclass == N_TEXT) - type = 't'; - else if (n_sclass == N_DATA) - type = 'd'; - else if (n_sclass == N_BSS) - type = 'b'; - else - type = 'u'; - if ((stbl->n_sclass & N_CLASS) == C_EXT) type += 'A' - 'a'; - strncpy(name, stbl->n_name, (size_t)8); - if (d_flag) { - /* Offsets in decimal. */ - if (o_flag) - printf("%s:%08ld %c %s\n",file,stbl->n_value,type,name); - else - printf("%08ld %c %s\n", stbl->n_value, type, name); - } else { - /* Offsets in hex. */ - if (o_flag) - printf("%s:%08lx %c %s\n",file,stbl->n_value,type,name); - else - printf("%08lx %c %s\n", stbl->n_value, type, name); - } - } -} diff --git a/commands/acksize/Makefile b/commands/acksize/Makefile deleted file mode 100644 index ac4e59c5d..000000000 --- a/commands/acksize/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PROG= acksize -MAN= - -.include diff --git a/commands/acksize/acksize.c b/commands/acksize/acksize.c deleted file mode 100644 index 16fd1c09b..000000000 --- a/commands/acksize/acksize.c +++ /dev/null @@ -1,64 +0,0 @@ -/* size - tell size of an object file Author: Andy Tanenbaum */ - -#include -#include -#include -#include -#include -#include - -int heading; /* set when heading printed */ -int error; - -int main(int argc, char **argv); -void size(char *name); - -int main(argc, argv) -int argc; -char *argv[]; -{ - int i; - - if (argc == 1) { - size("a.out"); - exit(error); - } - for (i = 1; i < argc; i++) size(argv[i]); - return(error); -} - - - -void size(name) -char *name; -{ - int fd, separate; - long dynam, allmem; - struct exec exec; - - if ((fd = open(name, O_RDONLY)) < 0) { - fprintf(stderr, "size: can't open %s\n", name); - error = 1; - return; - } - if (read(fd, (char *)&exec, sizeof(struct exec)) != sizeof(struct exec)) { - fprintf(stderr, "size: %s: header too short\n", name); - error = 1; - close(fd); - return; - } - if (BADMAG(exec)) { - fprintf(stderr, "size: %s not an object file\n", name); - error = 1; - close(fd); - return; - } - separate = (exec.a_flags & A_SEP ? 1 : 0); - dynam = exec.a_total - exec.a_text - exec.a_data - exec.a_bss; - if (separate) dynam += exec.a_text; - allmem = (separate ? exec.a_total + exec.a_text : exec.a_total); - if (heading++ == 0) printf(" text data bss stack memory\n"); - printf("%7ld %7ld %7ld %8ld %8ld %s\n", - exec.a_text, exec.a_data, exec.a_bss, dynam, allmem, name); - close(fd); -} diff --git a/commands/mdb/Dist b/commands/mdb/Dist deleted file mode 100644 index c1cbd8b78..000000000 --- a/commands/mdb/Dist +++ /dev/null @@ -1,35 +0,0 @@ -Mdb (Minix debugger) Distribution -================================= - -Version: 2.6.0 -Date: Sept 9/96 -Author: Philip Murton -E-mail: philip.murton@utoronto.ca - - -Files included: -=============== - -Dist This file -Makefile Makefile -MDB.TXT Cover file -README README file -core.c core file functions -decode.c Optional for syscalls support -gnu_sym.c Optional for GNU EXEC support -io.c I/O done here -ioctl.c Optional for syscalls support -kernel.c kernel functions -log Log from sample command file (See README) -mdb.c main program -mdb.h main header -mdb.1 man page -mdbdis86.c Disassembler -mdbexp.c Expression parsing -misc.c misc functions including help -proto.h Prototypes -sample sample command file -sym.c Symbolic names read from exec file -syscalls.c Optional for syscalls support -trace.c ptrace() called here - diff --git a/commands/mdb/MDB.TXT b/commands/mdb/MDB.TXT deleted file mode 100644 index e4b27bd64..000000000 --- a/commands/mdb/MDB.TXT +++ /dev/null @@ -1,25 +0,0 @@ -INFORMATION on mdb version 2.6.0 (Sept 9/96). - -MDB is the MINIX debugger which allows you to place breakpoints and -control the execution of a program. It has a lot of the features that -you would expect in a program debugger; for example, stack traces and -single step execution. - -The current version works with MINIX for PC and was developed and tested -under MINIX 1.7.x (32 bit version). It should work with 16 bit MINIX. - -How to Install - -1) Unpack mdb.tar.Z and review additional information in the README file. - (If you got this from the Minix CD-ROM or an MS-DOS system rename - MDB.TAZ to mdb.tar.Z) -2) Edit Makefile for Compiler and extra options as required. -3) make -4) make install -5) make install_man - -Comments to: - -Philip Murton. -philip.murton@utoronto.ca - diff --git a/commands/mdb/Makefile b/commands/mdb/Makefile deleted file mode 100644 index e2b3bc302..000000000 --- a/commands/mdb/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# -# Makefile for mdb -# -# -# -# i) For GNU_EXEC Support, uncomment: -# -FOR_GNU= gnu_sym.c -DEF_GNU= -DGNU_SUPPORT -# -# ii) For tracing of syscalls, uncomment: -# -#FOR_SYSCALLS= syscalls.c decode.c ioctl.c -#DEF_SYSCALLS= -DSYSCALLS_SUPPORT -# -# iii) For no debugging of mdb, uncomment: -# -#DEF_DEBUG= -DNDEBUG - -EXTRA_SRCS= ${FOR_GNU} ${FOR_SYSCALLS} -EXTRA_DEFS= ${DEF_GNU} ${DEF_SYSCALLS} ${DEF_DEBUG} -CPPFLAGS+= -I${NETBSDSRCDIR} -I${NETBSDSRCDIR}/servers \ - ${EXTRA_DEFS} - -PROG= mdb -SRCS= mdb.c mdbexp.c kernel.o sym.c trace.c core.c misc.c io.c -SRCS+= mdbdis86.c -SRCS+= ${EXTRA_SRCS} - -.include diff --git a/commands/mdb/README b/commands/mdb/README deleted file mode 100644 index 21600f634..000000000 --- a/commands/mdb/README +++ /dev/null @@ -1,32 +0,0 @@ -README for mdb version 2.6.0 - -Sept 9/96 - -Please note the following: - -1) Has been tested with Minix 1.7.4 (32-bit version). - A previous version was tested with Minix 1.7.x (16 bit version). - Some optional parts of mdb have not been extensively tested. - This is especially true on the code to trace system calls. - See options in Makefile. - -2) I know that the commands are somewhat cryptic; thus - there are currently two types of 'help' for mdb - a) the "?" gives a help page. - b) typing "command ?" will give help on a specific command. - -3) The sample comand file and log output. - To test this, type something like the following - "mdb -llog.new /usr/bin/sleep @sample" - The output "log.new' should be similar to the distributed "log" file; - but not necessarily exactly the same. - -4) Man pages need some more work. - -5) See top part of mdb.c for version history. - -Send comments to Philip Murton. Thanks. - -philip.murton@utoronto.ca - - diff --git a/commands/mdb/core.c b/commands/mdb/core.c deleted file mode 100644 index acccd565e..000000000 --- a/commands/mdb/core.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * core.c for mdb - * - * reads information from 'core' file - * Partly derived from 'adb' by D. Dugger. - */ -#include "mdb.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/* defined in kernel.c */ -extern struct proc *prc; - -#include "proto.h" - -#define BSIZE 512 -#define LOGBS 9 - -static struct file { - int fid; - char *name; - long cblock; - unsigned long tmap[3]; - unsigned long dmap[3]; - unsigned long smap[3]; - char buf[BSIZE + BSIZE]; -} Core_File, *core_file; - -#define b1 tmap[0] -#define e1 tmap[1] -#define f1 tmap[2] -#define b2 dmap[0] -#define e2 dmap[1] -#define f2 dmap[2] -#define b3 smap[0] -#define e3 smap[1] -#define f3 smap[2] - -static long cnt[3]; /* Sizes of segments */ -static int h_size; /* Size of core header */ -static char def_name[] = "core"; /* Default core name */ - -#define SIZE_MP_SEG (sizeof(struct mem_map) * NR_LOCAL_SEGS) -#define SIZE_KINFO sizeof(struct proc) -#define SIZE_HEADER SIZE_MP_SEG - -static int kernel_info(int fd ); -static void setmap(struct file *fp ); -static void read_info(struct file *fp ); -static void ill_addr(long d , int segment ); -static long map_addr(long d , int segment ); -static unsigned long c_status(void); -static long getn(long d, int s); - -/* - * set and display mapping for core file - */ -static void setmap(fp) -struct file *fp; -{ -long h = (long) h_size; - - fp->b1 = st_addr; - fp->e1 = st_addr + cnt[T]; - fp->f1 = h; - - fp->b2 = sd_addr; - fp->e2 = sd_addr + cnt[D]; - fp->f2 = cnt[T] + h; - - fp->b3 = sk_addr; - fp->e3 = sk_addr + cnt[S]; - fp->f3 = cnt[T] + cnt[D] + h; - -#ifdef MINIX_PC - if(is_separate) { - if ( end_addr < et_addr ) end_addr = et_addr; - } - else { - fp->b2 = st_addr; - fp->e2 = st_addr + cnt[T] + cnt[D]; - fp->f2 = h; - end_addr = fp->e2; - - fp->b1 = 0; - fp->e1 = 0; - fp->f1 = 0; - } -#endif - Printf("From core file:\n"); - Printf("T\t%8lx %8lx %8lx\n", core_file->b1, core_file->e1, core_file->f1); - Printf("D\t%8lx %8lx %8lx\n", core_file->b2, core_file->e2, core_file->f2); - Printf("S\t%8lx %8lx %8lx\n", core_file->b3, core_file->e3, core_file->f3); - Printf("\n"); - -} - -/* Print mapping */ -void prtmap() -{ - Printf("%s I & D space\t", (is_separate) ? "Separate " : "Combined "); - if (corepid > 0) { - Printf("File: %s\n\n", core_file->name); - setmap(core_file); - disp_maps(); - } - else { - Printf("Pid: %d\n\n", curpid); - update(); - disp_maps(); - } -} - -/* Illegal address */ -static void ill_addr(d, segment) -long d; -int segment; -{ - Printf("Bad addr=%lx seg=%d",d,segment); - mdb_error("\n"); -} - -/* Map virtual address -> core file addresses - * depends on current segment if Separate I & D - */ -static long map_addr(d, segment) -long d; -int segment; -{ -#ifdef MINIX_PC - if (is_separate) - switch (segment) { - case T: - if (d >= core_file->b1 && d < core_file->e1) - d += core_file->f1 - core_file->b1; - else - ill_addr(d,segment); - break; - case D: - case S: - if (d >= core_file->b2 && d < core_file->e2) - d += core_file->f2 - core_file->b2; - else if (d >= core_file->b3 && d < core_file->e3) - d += core_file->f3 - core_file->b3; - else - ill_addr(d,segment); - break; - } - else { -#endif - if (d >= core_file->b1 && d < core_file->e1) - d += core_file->f1 - core_file->b1; - else if (d >= core_file->b2 && d < core_file->e2) - d += core_file->f2 - core_file->b2; - else if (d >= core_file->b3 && d < core_file->e3) - d += core_file->f3 - core_file->b3; - else - ill_addr(d,segment); -#ifdef MINIX_PC - } -#endif - return d; -} - - -/* Get value with address d and segment s */ -static long getn(d, s) -long d; -int s; -{ - long b; - register int o,i; - union { - unsigned long l; - unsigned char c[4]; - } data; - - /* Map address */ - d = map_addr(d, s); - - b = d >> LOGBS; - o = d & (BSIZE - 1); - - if (core_file->cblock != b) { - core_file->cblock = b; - lseek(core_file->fid, b << LOGBS, 0); - read(core_file->fid, core_file->buf, sizeof(core_file->buf)); - } - - for(i = 0; i<4; i++) - data.c[i] = core_file->buf[o+i]; - -#ifdef DEBUG - if (debug) - Printf("getn at %8lx val %8lx\n", d, data.l); -#endif - return data.l; -} - -/* Read kernel info from core file into lbuf[] */ -static int kernel_info(fd) -int fd; -{ - int r; - int ks; - - /* Round SIZE_KINFO to multiple of sizeof(long) */ - /* See mm/signal.c to see how a 'core' file is written */ - ks = ( SIZE_KINFO / sizeof(long) ) * sizeof(long); - r = read(fd, (char *)lbuf, ks); - return(r == ks) ? ks : -1; -} - -/* - * Print status info from core - returns PC - */ -static unsigned long c_status() -{ - fprintf(stderr, "WARNING: don't know pid from core; using proc nr for pid.\n"); - - Printf("Proc = %6d\n", prc->p_nr); - - /* Set current pid to that of core */ - curpid = corepid = prc->p_nr; - disp_maps(); - Printf("\nPC = 0x%0*lx\t", 2 * ADDRSIZE, PC_MEMBER(prc) & MASK(ADDRSIZE)); - symbolic((long) PC_MEMBER(prc), '\n'); - dasm((long) PC_MEMBER(prc), 1, 1); - return PC_MEMBER(prc); -} - -/* Read memory maps and kernel info from core file */ -static void read_info(fp) -struct file *fp; -{ - struct mem_map seg[NR_LOCAL_SEGS]; - int r; - int i; - - lseek(fp->fid, 0L, 0L); - - /* First read memory map of all segments. */ - if (read(fp->fid, (char *) seg, (int) SIZE_MP_SEG) < 0) { - close(fp->fid); - Printf("mdb: cannot read core header\n"); - fp->fid = -1; - return; - } - h_size = SIZE_HEADER; - - /* Read kernel dependent info */ - r = kernel_info(fp->fid); - if (r < 0) { - close(fp->fid); - Printf("mdb: cannot read kernel info from 'core' file\n"); - fp->fid = -1; - return; - } else - h_size += r; - - /* copy info */ - for (i = T; i <= S; i++) - cnt[i] = (long) seg[i].mem_len << CLICK_SHIFT; - - /* This needs to be set for map_addr() below */ - if(coreonly && cnt[T] != 0) is_separate = TRUE; - - st_addr = (long) seg[T].mem_vir << CLICK_SHIFT; - et_addr = st_addr + ((long) seg[T].mem_len << CLICK_SHIFT); - - sd_addr = (long) seg[D].mem_vir << CLICK_SHIFT; - end_addr = ed_addr = - sd_addr + ((long) seg[D].mem_len << CLICK_SHIFT); - - sk_addr = (long) seg[S].mem_vir << CLICK_SHIFT; - sk_size = (long) seg[S].mem_len << CLICK_SHIFT; - - setmap(fp); -} - -/* initialization for core files - * returns PC address from core file - */ -unsigned long core_init(filename) -char *filename; -{ - core_file = &Core_File; - core_file->name = (filename != NULL) ? filename : def_name; - - core_file->fid = open(core_file->name, 0); - if (filename != NULL && core_file->fid < 0) { - Printf("mdb - warning cannot open: %s\n", core_file->name); - return -1; - } - - core_file->b1 = core_file->b2 = core_file->b3 = 0; - core_file->e1 = core_file->e2 = core_file->e3 = 0; - core_file->f1 = core_file->f2 = core_file->f3 = 0; - core_file->cblock = -1; - - if (core_file->fid > 0) { - read_info(core_file); - return c_status(); - } - return 0; -} - - -/* initialization for a file ( -f option ) - * always returns 0 - * Similar to core files. - */ -unsigned long file_init(filename) -char *filename; -{ - core_file = &Core_File; - core_file->name = (filename != NULL) ? filename : def_name; - - core_file->fid = open(core_file->name, 0); - if (filename != NULL && core_file->fid < 0) { - Printf("mdb - warning cannot open: %s\n", core_file->name); - return -1; - } - - core_file->b1 = core_file->b2 = core_file->b3 = 0; - core_file->e1 = core_file->e2 = core_file->e3 = 0; - core_file->f1 = core_file->f2 = core_file->f3 = 0; - core_file->cblock = -1; - - is_separate = FALSE; - core_file->e1 = file_size(core_file->fid); - curpid = corepid = 1; - return 0; - -} - -/* - * Read from core file - * Called by mdbtrace() - */ -long read_core(req, addr, data) -int req; -long addr, data; -{ -int i; -int segment; -long val; - - switch (req) { - case T_GETINS: - case T_GETDATA: - /* Check segment and address - call getn to read core file */ - segment = (req == T_GETINS) ? T : D; - addr &= MASK(ADDRSIZE); - val = getn(addr, segment); -#ifdef DEBUG - if (debug) Printf("val=>%lx\n", val); -#endif - return val; - break; - case T_GETUSER: - /* Convert addr to index to long array */ - i = (int) (addr >> 2); -#ifdef DEBUG - if (debug) Printf("lbuf[%d] %lx\n", i, lbuf[i]); -#endif - return lbuf[i]; - break; - case T_OK: - case T_EXIT: - return 0L; - break; - default: - mdb_error("Not supported with 'core' files\n"); - } -} - diff --git a/commands/mdb/decode.c b/commands/mdb/decode.c deleted file mode 100644 index 4a7abecea..000000000 --- a/commands/mdb/decode.c +++ /dev/null @@ -1,360 +0,0 @@ -/* - * decode.c for mdb -- decodes a Minix system call - */ -#include "mdb.h" -#ifdef SYSCALLS_SUPPORT -#include -#include -#include -#include -#include -#define ptrace mdbtrace -#include -#include -#include -#include "proto.h" - -static void get_message(message *m, unsigned bx); -static void get_data(char *s, unsigned bx, int cnt); - -static message sent; -static message recv; -static unsigned saved_addr; -static int last_call; - -#define NOSYS 0 -#define NOP 1 - -#define _M1 0x0100 -#define _M2 0x0200 -#define _M3 0x0400 -#define _M4 0x0800 - -#define _M13 0x0500 - -#define M1_I1 (_M1|1) -#define M1_I2 (_M1|2) -#define M1_I3 (_M1|4) -#define M1_P1 (_M1|8) -#define M1_P2 (_M1|16) -#define M1_P3 (_M1|32) - -#define M2_I1 (_M2|1) -#define M2_I2 (_M2|2) -#define M2_I3 (_M2|4) -#define M2_L1 (_M2|8) -#define M2_L2 (_M2|16) -#define M2_P1 (_M2|32) - -#define M3_I1 (_M3|1) -#define M3_I2 (_M3|2) -#define M3_P1 (_M3|4) -#define M3_C1 (_M3|8) - -#define M4_L1 (_M4|1) -#define M4_L2 (_M4|2) -#define M4_L3 (_M4|4) -#define M4_L4 (_M4|8) -#define M4_L5 (_M4|16) - -#define M13_OPEN (_M13|1) - -#define M1_I12 (M1_I1|M1_I2) -#define M1_NAME1 (M1_I1|M1_P1) -#define M1_NAME2 (M1_I2|M1_P2) -#define M1_2NAMES (M1_I1|M1_P1|M1_I2|M1_P2) -#define M1_SIGACTION (M1_I2|M1_P1|M1_P2|M1_P3) - -#define M2_IOCTL (M2_I1|M2_I3|M2_L1|M2_L2) -#define M2_4P (M2_I1|M2_I2|M2_L1|M2_L2) -#define M2_SIGRETURN (M2_I2|M2_L1|M2_P1) -#define M2_SIGPROC (M2_I1|M2_L1) -#define M2_UTIME (M2_I1|M2_I2|M2_L1|M2_L2|M2_P1) - -#define M3_LOAD (M3_I1|M3_C1) - -struct decode_system { - int syscall; - unsigned int sflag; - unsigned int rflag; - char *name; -} decode[NCALLS] = { - 0, NOSYS, NOP, NULL, - EXIT, M1_I1, NOP, "EXIT", - FORK, NOP, NOP, "FORK", - READ, M1_I12, NOP, "READ", - WRITE, M1_I12, NOP, "WRITE", - OPEN, M13_OPEN, NOP, "OPEN", - CLOSE, M1_I1, NOP, "CLOSE", - WAIT, NOP, M2_I1, "WAIT", - CREAT, M3_LOAD, NOP, "CREAT", - LINK, M1_2NAMES, NOP, "LINK", - UNLINK, M3_LOAD, NOP, "UNLINK", - WAITPID, M1_I1, M2_I1, "WAITPID", - CHDIR, M3_LOAD, NOP, "CHDIR", - TIME, NOP, M2_L1, "TIME", - MKNOD, M1_NAME1, NOP, "MKNOD", - CHMOD, M3_LOAD, NOP, "CHMOD", - CHOWN, M1_NAME1, NOP, "CHOWN", - BRK, M1_P1, M2_P1, "BRK", - STAT, M1_NAME1, NOP, "STAT", - LSEEK, M1_I1, NOP, "LSEEK", - MINIX_GETPID, NOP, NOP, "MINIX_GETPID", - MOUNT, M1_2NAMES, NOP, "MOUNT", - UMOUNT, M3_LOAD, NOP, "UMOUNT", - SETUID, M1_I1, NOP, "SETUID", - GETUID, NOP, NOP, "GETUID", - STIME, M2_L1, NOP, "STIME", - PTRACE, M2_4P, NOP, "PTRACE", - ALARM, M1_I1, NOP, "ALARM", - FSTAT, M1_I1, NOP, "FSTAT", - PAUSE, NOP, NOP, "PAUSE", - UTIME, M2_UTIME, NOP, "UTIME", - 31, NOSYS, NOP, NULL, - 32, NOSYS, NOP, NULL, - ACCESS, M3_LOAD, NOP, "ACCESS", - 34, NOSYS, NOP, NULL, - 35, NOSYS, NOP, NULL, - SYNC, NOP, NOP, "SYNC", - KILL, M1_I12, NOP, "KILL", - RENAME, M1_2NAMES, NOP, "RENAME", - MKDIR, M1_NAME1, NOP, "MKDIR", - RMDIR, M3_LOAD, NOP, "RMDIR", - DUP, NOP, NOP, "DUP", - PIPE, NOP, M1_I12, "PIPE", - TIMES, M4_L5, NOP, "TIMES", - 44, NOSYS, NOP, NULL, - 45, NOSYS, NOP, NULL, - SETGID, M1_I1, NOP, "SETGID", - GETGID, NOP, NOP, "GETGID", - SIGNAL, NOP, NOP, "SIGNAL", - 49, NOSYS, NOP, NULL, - 50, NOSYS, NOP, NULL, - 51, NOSYS, NOP, NULL, - 52, NOSYS, NOP, NULL, - 53, NOSYS, NOP, NULL, - IOCTL, M2_IOCTL, M2_IOCTL, "IOCTL", - FCNTL, M1_I12, NOP, "FCNTL", -#if ENABLE_SYMLINK - RDLINK, M1_NAME1, NOP, "RDLINK", - SLINK, M1_NAME1, NOP, "SLINK", - LSTAT, M1_NAME1, NOP, "LSTAT", -#else - 56, NOSYS, NOP, NULL, - 57, NOSYS, NOP, NULL, - 58, NOSYS, NOP, NULL, -#endif - EXEC, M1_NAME1, NOP, "EXEC", - UMASK, M1_I1, NOP, "UMASK", - CHROOT, M3_LOAD, NOP, "CHROOT", - SETSID, NOP, NOP, "SETSID", - GETPGRP, NOP, NOP, "GETPGRP", - KSIG, NOSYS, NOP, "KSIG", - UNPAUSE, NOSYS, NOP, "UNPAUSE", - 66, NOSYS, NOP, NULL, - REVIVE, NOSYS, NOP, "REVIVE", - TASK_REPLY, NOSYS, NOP, "TASK_REPLY", - 69, NOSYS, NOP, NULL, - 70, NOSYS, NOP, NULL, - SIGACTION, M1_SIGACTION, NOP, "SIGACTION", - SIGSUSPEND, M2_L1, NOP, "SIGSUSPEND", - SIGPENDING, NOP, M2_L1, "SIGPENDING", - SIGPROCMASK, M2_SIGPROC, NOP, "SIGPROCMASK", - SIGRETURN, M2_SIGRETURN, NOP, "SIGRETURN", - REBOOT, M1_I1, NOP, "REBOOT" -}; - -static void get_message(m,bx) -message *m; -unsigned bx; -{ - unsigned addr; - int i; - long buffer[ MESS_SIZE/4 + 1 ]; - - addr = bx; - for (i = 0; i< sizeof(buffer)/4; i++) - buffer[i] = ptrace(T_GETDATA,curpid, - (long) (addr+i*4) ,0L); - - memcpy(m,buffer,MESS_SIZE); - -} - -static void get_data(s, bx, cnt) -char *s; -unsigned bx; -int cnt; -{ - unsigned addr; - int i,nl; - long buffer[PATH_MAX/4 + 1]; - - addr = bx; - nl = (cnt / 4) + 1; - for (i = 0; i< nl; i++) - buffer[i] = ptrace(T_GETDATA, curpid, (long) (addr+i*4) ,0L); - - memcpy(s, buffer, cnt); -} - - -void decode_result() -{ - - /* Update message */ - get_message(&recv,saved_addr); - Printf("result=%d\n", recv.m_type); - - if (last_call < 0 || last_call >NCALLS) { - Printf("Bad call in decode_result\n"); - return; - } - - switch (decode[last_call].rflag) { - case NOP: - return; - break; - case M1_I12: - Printf("m1_l1=%d m1_i2=%d ",recv.m1_i1,recv.m1_i2); - break; - case M2_IOCTL: - decode_ioctl('R',&recv); - break; - case M2_P1: - Printf("m2_p1=%lx ",(unsigned long)recv.m2_p1); - break; - case M2_L1: - Printf("m2_l1=%lx ",recv.m2_l1); - break; - case M2_I1: - Printf("m2_i1=%x ",recv.m2_i1); - break; - default: - Printf("rflag=%d ",decode[last_call].rflag); - break; - } - Printf("\n"); -} - - -void decode_message(bx) -unsigned bx; -{ -int t; -int slen; -unsigned int flag; -char path[PATH_MAX]; - - /* Save address of message */ - saved_addr = bx; - get_message(&sent,bx); - - t = sent.m_type; - - if ( t <= 0 || t >= NCALLS ) { - Printf("Bad call - not in range\n"); - last_call = 0; - return; - } - - flag = decode[t].sflag; - - if ( flag == NOSYS) { - Printf("Bad call - not in system\n"); - last_call = 0; - return; - } - else - last_call = t; - - Printf(" type %s (%d) ", decode[last_call].name, last_call); - - switch (flag) { - case NOP: - break; - case M1_I1: - case M1_I12: - Printf("i1=%d ",sent.m1_i1); - if ( flag == M1_I1) break; - case M1_I2: - Printf("i2=%d ",sent.m1_i2); - break; - case M1_P1: - Printf("p1=%lx ",(unsigned long)sent.m1_p1); - break; - case M1_NAME1: - case M1_2NAMES: - slen = sent.m1_i1; - get_data(path, (unsigned long) sent.m1_p1, slen); - path[slen] = '\0'; - Printf("s1=%s ",path); - if ( flag == M1_NAME1) break; - slen = sent.m1_i2; - get_data(path, (unsigned long) sent.m1_p2, slen); - path[slen] = '\0'; - Printf("s2=%s ",path); - break; - case M2_UTIME: - if ( sent.m2_i1 == 0 ) - slen = sent.m2_i2; - else - slen = sent.m2_i1; - get_data(path, (unsigned long) sent.m2_p1, slen); - path[slen] = '\0'; - Printf("p1=%s ",path); - if ( sent.m2_i1 != 0 ) - Printf("l1=%lx l2=%lx ",sent.m2_l1,sent.m2_l2); - break; - case M1_SIGACTION: - Printf("m1_i2=%d p1=%lx p2=%lx p3=%lx\n", - sent.m1_i2, - (unsigned long)sent.m1_p1, - (unsigned long)sent.m1_p2, - (unsigned long)sent.m1_p3); - break; - case M2_4P: Printf("m2_i1=%d m2_i2=%d m2_l1=%lx m2_l2=%lx ", - sent.m2_i1,sent.m2_i2,sent.m2_l1,sent.m2_l2); - break; - case M2_L1: - Printf("m2_l1=%ld ",sent.m2_l1); - break; - case M2_IOCTL: - decode_ioctl('S',&sent); - break; - case M2_SIGRETURN: - Printf("m2_i2=%d l1=%lx p1=%lx ", - sent.m2_i2,sent.m2_l1, - (unsigned long)sent.m1_p1); - break; - case M2_SIGPROC: - Printf("m2_i1=%d l1=%lx ", sent.m2_i1,sent.m2_l1); - break; - case M13_OPEN: - if (sent.m1_i2 & O_CREAT) { - slen = sent.m1_i1; - get_data(path, (unsigned long) sent.m1_p1, slen); - path[slen] = '\0'; - Printf("s1=%s ",path); - break; - } - /* fall to M3_LOAD */ - case M3_LOAD: - slen = sent.m3_i1; - if ( slen <= M3_STRING) - strncpy(path,sent.m3_ca1,M3_STRING); - else - get_data(path, (unsigned long) sent.m3_ca1, slen); - path[slen] = '\0'; - Printf("m3_name=%s ",path); - break; - case M4_L5: - Printf("m4_l5=%ld ",sent.m4_l5); - break; - default: Printf("sflag=%d ",decode[last_call].sflag); - break; - } - Printf("\n"); -} - -#endif /* SYSCALLS_SUPPORT */ diff --git a/commands/mdb/gnu_sym.c b/commands/mdb/gnu_sym.c deleted file mode 100644 index 626de5c5b..000000000 --- a/commands/mdb/gnu_sym.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * gnu_sym.c for mdb - * copied and modified from sym.c - * Support GNU Exec symbol tables - */ - -#include "mdb.h" - -#ifdef EXTRA_SYMBOLS - -#include -#include -#include -#include -#include -#include -#include "proto.h" - -#define NN_UNDF 0 -#define NN_ABS 2 -#define NN_TEXT 4 -#define NN_DATA 6 -#define NN_BSS 8 -#define NN_FN 15 -#define NN_EXT 1 -#define NN_TYPE 036 - -struct newnlist { - union { - char *n_name; - struct newnlist *n_next; - long n_strx; - } n_un; - unsigned char n_type; - char n_other; - short n_desc; - unsigned long n_value; -}; - -struct symtab_s -{ - struct newnlist *start; - struct newnlist *end; - unsigned int nsym; -}; - -static struct symtab_s symtab; - -static void gnu_sort(struct newnlist *array , struct newnlist *top ); -static int gnu_symeq(char *t , struct newnlist *sp ); -static int gnu_symprefix(char *t , struct newnlist *sp ); -static struct newnlist *gnu_sname(char *name, int is_text, int - allflag); -static struct newnlist *gnu_sval(off_t value, int where); -static void gnu_sym(struct newnlist *sp, off_t off); - - -void gnu_init( filename ) -char *filename; -{ - struct exec header; - unsigned int string_size; - char *names; - struct newnlist *p; - int fd; - register struct symtab_s *tp; - - tp = &symtab; - if ( (fd = open( filename, O_RDONLY)) < 0 || - read( fd, (char *) &header, sizeof header ) != sizeof header ) - { - do_error( "gnu_load - reading header" ); - if ( fd >= 0) close( fd ); - return; - } - - if ( (string_size = lseek( fd, 0, SEEK_END ) ) == -1 ) - { - do_error( "gnu_load - determining file size" ); - close( fd ); - return; - } - - string_size -= A_SYMPOS( header ); - - if ( (int) header.a_syms < 0 || - (unsigned) header.a_syms != header.a_syms || - (tp->start = (struct newnlist *) malloc( string_size )) - == (struct newnlist *) NULL && - header.a_syms != 0 ) - { - do_error( "gnu_load - allocating memory" ); - close( fd ); - return; - } - - if ( lseek( fd, A_SYMPOS( header ), SEEK_SET ) != A_SYMPOS( header ) ) - { - do_error( "gnu_load - reading header" ); - close( fd ); - return; - } - - if ( read( fd, (char *) tp->start, string_size ) < 0 ) - { - do_error( "gnu_load - reading symbols" ); - close( fd ); - return; - } - close( fd ); - - tp->nsym = (unsigned int) header.a_syms / sizeof (struct newnlist); - tp->end = tp->start + tp->nsym; - - names = (char *) tp->start + header.a_syms; - - for ( p = tp->start; p < tp->end; p++) - if(p->n_un.n_strx) - p->n_un.n_name = names + p->n_un.n_strx; - else - p->n_un.n_name = ""; - - /* sort on value only, name search not used much and storage a problem */ - Printf("Sorting %d GNU symbols ....", tp->nsym ); - gnu_sort( tp->start, tp->end ); - Printf("\n"); -} - - -long gnu_symbolvalue( name, is_text ) -char *name; -int is_text; -{ - register struct newnlist *sp; - sp = gnu_sname(name,is_text,0); - if (sp != NULL) - return sp->n_value; - else - return 0L; -} - - -static struct newnlist *gnu_sname( name, is_text, allflag ) -char *name; -int is_text; -int allflag; -{ - char *s; - unsigned char sclass; - int schar; - char *send; - register struct newnlist *sp; - register struct symtab_s *tp; - - tp = &symtab; - - if ( allflag ) - { - /* find and print all matching symbols */ - for ( sp = tp->start; sp < tp->end; ++sp ) - { - if ( gnu_symprefix( name, sp ) ) - { - sp = sp; - for ( s = sp->n_un.n_name, send = s + strlen(s); - *s != 0 && s < send; ++s ) - outbyte( *s ); - for ( ; s <= send; ++s ) - outspace(); - switch( sp->n_type & NN_TYPE ) - { - case NN_ABS: schar = 'a'; break; - case NN_TEXT: schar = 't'; break; - case NN_DATA: schar = 'd'; break; - case NN_BSS: schar = 'b'; break; - default: schar = '?'; break; - } - if ( (sp->n_type & NN_EXT) && schar != '?' ) - schar += 'A' - 'a'; - outbyte( schar ); - outspace(); - outh32( sp->n_value ); - outbyte('\n'); - } - } - } - else - { - /* find symbol by dumb linear search */ - for ( sp = tp->start; sp < tp->end; ++sp ) - { - sclass = sp->n_type & NN_TYPE; - if ( (is_text && sclass == NN_TEXT || - !is_text && (sclass == NN_DATA || - sclass == NN_BSS)) && - gnu_symeq( name, sp ) ) - return sp; - } - } - return NULL; -} - -static struct newnlist *gnu_sval( value, where ) -off_t value; -int where; -{ - int left; - int middle; - int right; - unsigned char sclass; - register struct newnlist *sp; - register struct symtab_s *tp; - - tp = &symtab; - - /* find last symbol with value <= desired one by binary search */ - for ( left = 0, right = tp->nsym - 1; left <= right; ) - { - middle = (left + right) / 2; - sp = tp->start + middle; - if ( value < sp->n_value ) - right = middle - 1; - else - left = middle + 1; - } - if ( right >= 0 ) - /* otherwise tp->start + right may wrap around to > tp->start !! */ - for ( sp = tp->start + right; sp >= tp->start; --sp ) - { - if ( !(sp->n_type & NN_EXT) ) continue; - sclass = sp->n_type & NN_TYPE; - if ( (where == CSEG && sclass == NN_TEXT) || - (where != CSEG && - (sclass == NN_DATA || sclass == NN_BSS)) ) - return sp; - } - return NULL; -} - - -static void gnu_sym( sp, off ) -struct newnlist *sp; -off_t off; -{ - register char *s; - char *send; - - for ( s = sp->n_un.n_name, send = s + strlen(s); *s != 0 && s < send; ++s ) - outbyte( *s ); - if ( (off -= sp->n_value) != 0 ) - { - outbyte( '+' ); - printhex(off); - } -} - -/* shell sort symbols on value */ - -static void gnu_sort( array, top ) -struct newnlist *array; -struct newnlist *top; -{ - int gap; - int i; - int j; - register struct newnlist *left; - register struct newnlist *right; - struct newnlist swaptemp; - int size; - - size = top - array; - /* choose gaps according to Knuth V3 p95 */ - for ( gap = 1, i = 4; (j = 3 * i + 1) < size; gap = i, i = j ) - ; - do - { - for ( j = gap; j < size; ++j ) - for ( i = j - gap; i >= 0; i -= gap ) - { - left = array + i; - right = array + (i + gap); - if ( (off_t) left->n_value <= - right->n_value ) - break; - swaptemp = *left; - *left = *right; - *right = swaptemp; - } - } - while ( (gap /= 3) != 0 ); -} - -void gnu_symbolic( value, separator ) -off_t value; -int separator; -{ - register struct newnlist *sp; - long off; - - if (value < st_addr || value > end_addr) { - outstr("0x"); - printhex(value); - outbyte(separator); - return; - } - - if ( (sp = gnu_sval( value, CSEG )) != NULL ) - { - gnu_sym( sp, value ); - } - else if ( (sp = gnu_sval( value, DSEG )) != NULL ) - { - gnu_sym( sp, value ); - } - else - { - outstr("_start"); - off = value - st_addr; - if ( off != 0 ) - { - outbyte( '+' ); - printhex(off); - } - } - outbyte( separator ); -} - - -static int gnu_symeq( t, sp ) -register char *t; -struct newnlist *sp; -{ - return strncmp( t, sp->n_un.n_name, strlen(t) ) == 0; -} - -static int gnu_symprefix( t, sp ) -register char *t; -struct newnlist *sp; -{ - register char *s; - char *send; - - for ( ; *t == '_'; ++t ) - ; - for ( s = sp->n_un.n_name, send = s + strlen(s); - s < send && *s == '_'; ++s ) - ; - return strncmp( s, t, send - s ) == 0; -} - - - -/* list all symbols - test for selection criteria */ - -void gnu_listsym( tchar ) -char tchar; -{ - register struct symtab_s *tp; - register struct newnlist *sp; - char *s; - char *send; - char schar; - - outbyte('\n'); - tp = &symtab; - for ( sp = tp->start; sp < tp->end; ++sp ) - { - switch( sp->n_type & NN_TYPE ) - { - case NN_ABS: schar = 'a'; break; - case NN_TEXT: schar = 't'; break; - case NN_DATA: schar = 'd'; break; - case NN_BSS: schar = 'b'; break; - default: schar = '?'; break; - } - - if ( (sp->n_type & NN_EXT) && schar != '?' ) - schar += 'A' - 'a'; - - /* check for selection */ - if ( tchar != '*' && schar != tchar) - continue; - - /* print symbol type and value */ - outh32( sp->n_value ); - outspace(); - outbyte( schar ); - outbyte( '\t' ); - for ( s = sp->n_un.n_name, send = s + strlen(s); - *s != 0 && s < send; ++s ) outbyte( *s ); - outbyte('\n'); - } -} - -int gnu_text_symbol(value) -off_t value; -{ - struct newnlist *sp; - - if ((sp = gnu_sval(value, CSEG)) != NULL && sp->n_value == value) - { - gnu_sym(sp, value); - return TRUE; - } - else - return FALSE; -} - -int gnu_finds_data(off,data_seg) -off_t off; -int data_seg; -{ - struct newnlist *sp; - - if ((sp = gnu_sval(off, data_seg)) != NULL) - { - gnu_sym(sp, off); - return TRUE; - } - else - return FALSE; -} - -int gnu_finds_pc(pc) -off_t pc; -{ - struct newnlist *sp; - - if ((sp = gnu_sval(pc, CSEG)) != NULL) - { - gnu_sym(sp, pc); - return TRUE; - } - else - return FALSE; -} - - -#endif /* EXTRA_SYMBOLS */ diff --git a/commands/mdb/io.c b/commands/mdb/io.c deleted file mode 100644 index fc8e7f0d0..000000000 --- a/commands/mdb/io.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * io.c for mdb - * all the i/o is here - * NB: Printf() - */ -#include "mdb.h" -#include -#include -#include -#include -#include "proto.h" - -#define OUTBUFSIZE 512 -#define PAGESIZE 24 - -static int forceupper = FALSE; -static int someupper = FALSE; -static int stringcount = 0; -static char *string_ptr = NULL; /* stringptr ambiguous at 8th char */ -static char *stringstart = NULL; - -static char outbuf[OUTBUFSIZE]; -static FILE *cmdfile = stdin; -static FILE *outfile = stdout; -static FILE *logfile; -static int lineno; - -int _doprnt(const char *format, va_list ap, FILE *stream ); - -char *get_cmd(cbuf, csize) -char *cbuf; -int csize; -{ -char *r; - - fflush(stdout); - if( cmdfile == stdin && outfile == stdout ) - printf("* "); - r = fgets(cbuf, csize, cmdfile); - if ( r == NULL && cmdfile != stdin ) { - cmdfile = stdin; - return get_cmd(cbuf, csize); - } - - if ( logfile != NULL ) { - fprintf( logfile, "%s", cbuf ); - lineno++; - } - - return r; -} - -void openin(s) -char *s; -{ -char *t; - - if ((t = strchr(s,'\n')) != NULL) *t = '\0'; - if ((t = strchr(s,' ')) != NULL) *t = '\0'; - cmdfile = fopen(s,"r"); - if (cmdfile == NULL) { - Printf("Cannot open %s for input\n",s); - cmdfile = stdin; - } -} - - -/* Special version of printf - * really sprintf() - * from MINIX library - * followed by outstr() - */ -int Printf(const char *format, ...) -{ - va_list ap; - int retval; - va_start(ap, format); - - retval = vsnprintf(outbuf, OUTBUFSIZE, format, ap); - va_end(ap); - - outstr(outbuf); - - return retval; -} - -/* - * Set logging options - */ -void logging( c, name ) -int c; -char *name; -{ -char *t; - - if ( c == 'q' && logfile != NULL ) { - fclose(logfile); - return; - } - - if ((t = strchr(name,'\n')) != NULL) *t = '\0'; - if ((t = strchr(name,' ' )) != NULL) *t = '\0'; - if ( logfile != NULL ) fclose(logfile); - - if ( strlen(name) > 0 ) { - logfile = fopen(name,"w"); - - if (logfile == NULL) { - Printf("Cannot open %s for output\n",name); - return; - } - - /* Close standard output file for L */ - if ( c == 'L' ) { - fclose(outfile); - outfile = NULL; - } - } - else - /* Reset */ - { - if ( logfile != NULL ) fclose(logfile); - outfile = stdout; - outbyte('\n'); - } - -} - -/* Output system error string */ -void do_error(m) -char *m; -{ - outstr(m); - outstr(": "); - outstr(strerror(errno)); - outstr("\n"); -} - -void closestring() -{ -/* close string device */ - - stringcount = 0; - stringstart = string_ptr = NULL; -} - -int mytolower(ch) -int ch; -{ -/* convert char to lower case */ - - if (ch >= 'A' && ch <= 'Z') - ch += 'a' - 'A'; - return ch; -} - - -void openstring(string) -char *string; -{ -/* open string device */ - - stringcount = 0; - stringstart = string_ptr = string; -} - -void outbyte(byte) -int byte; -{ -/* print char to currently open output devices */ - - if (forceupper && byte >= 'a' && byte <= 'z') - byte += 'A' - 'a'; - if (string_ptr != NULL) - { - if ((*string_ptr++ = byte) == '\t') - stringcount = 8 * (stringcount / 8 + 1); - else - ++stringcount; - } - else - { - if ( paging && byte == '\n' ) { - lineno++; - if ( lineno >= PAGESIZE) { - if ( cmdfile == stdin ) { - printf("\nMore...any key to continue"); - fgets( outbuf, OUTBUFSIZE-1, cmdfile ); - } - } - lineno = 0; - } - - if ( outfile != NULL ) - putc(byte,outfile); - /* Do not log CR */ - if ( logfile != NULL && byte != '\r' ) - putc(byte,logfile); - } -} - - -void outcomma() -{ -/* print comma */ - - outbyte(','); -} - -static char hexdigits[] = "0123456789ABCDEF"; -void outh4(num) -unsigned num; -{ -/* print 4 bits hex */ - - outbyte(hexdigits[num % 16]); -} - -void outh8(num) -unsigned num; -{ -/* print 8 bits hex */ - - outh4(num / 16); - outh4(num); -} - -void outh16(num) -unsigned num; -{ -/* print 16 bits hex */ - - outh8(num / 256); - outh8(num); -} - -void outh32(num) -unsigned num; -{ -/* print 32 bits hex */ - - outh16((u16_t) (num >> 16)); - outh16((u16_t) num); -} - -void outspace() -{ -/* print space */ - - outbyte(' '); -} - -void outstr(s) -register char *s; -{ -/* print string */ - - while (*s) - outbyte(*s++); -} - -void outtab() -{ -/* print tab */ - - outbyte('\t'); -} - -void outustr(s) -register char *s; -{ -/* print string, perhaps converting case to upper */ - - forceupper = someupper; - while (*s) - outbyte(*s++); - forceupper = FALSE; -} - - -int stringpos() -{ -/* return current offset of string device */ - - return string_ptr - stringstart; -} - -int stringtab() -{ -/* return current "tab" spot of string device */ - - return stringcount; -} - diff --git a/commands/mdb/ioctl.c b/commands/mdb/ioctl.c deleted file mode 100644 index 0b8070c6b..000000000 --- a/commands/mdb/ioctl.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * ioctl.c for mdb -- decode an IOCTL system call - */ -#include "mdb.h" -#ifdef SYSCALLS_SUPPORT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "proto.h" - -static int get_request; - -/* - * decode ioctl call - * send or receive = 'R' or 'S' - */ -void decode_ioctl(sr, m) -int sr; -message *m; -{ -int request, device; -int high; -long spek, flags; - - device = m->m2_i1; - request = m->m2_i3; - spek = m->m2_l1; - flags = m->m2_l2; - -#ifdef DEBUG - if( debug ) - Printf("%c device=%d request=%c|%d m2_l1=%lx m2_l2=%lx\n", - sr,device, - (request >> 8) & BYTE, - request & BYTE, - spek,flags); -#endif - - if ( sr == 'R') request = get_request; - - if ( sr == 'S' ) { - Printf("Sending (%lx) ", request); - get_request = request; - } - else - Printf("Receiving (%lx) ", request); - - high = ( request & 0xFFFF0000 ) >> 16 ; - request &= _IOCTYPE_MASK; - - Printf("Other IOCTL device=%d request=%c|%d flags=%x size =%d\n", - device, (request >> 8) & BYTE, request & BYTE, - (high & ~_IOCPARM_MASK ), - (high & _IOCPARM_MASK ) - ); - Printf("\n"); -} - - -#endif /* SYSCALLS_SUPPORT */ diff --git a/commands/mdb/kernel.c b/commands/mdb/kernel.c deleted file mode 100644 index 5e0b0ecf4..000000000 --- a/commands/mdb/kernel.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * kernel.c for mdb - */ - -#include "mdb.h" -#include -#include -#include -#include -#define ptrace mdbtrace -#include -#include "proto.h" - -#include -#include -#include -#include - -/* Define these here */ -/* buffer for proc and pointer to proc */ - -#define SIZ (1 + sizeof(struct proc)/sizeof(long)) - -struct proc *prc; -long lbuf[SIZ]; - -static char segment_name[] = "TDS"; - -/* - * Display memory maps - */ -void disp_maps() -{ - int i; - long int vir, phy, len; - - Printf("\t Virtual\t Physical\tLength\n"); - Printf("\t address\t address\n"); - for (i = 0; i < strlen(segment_name); i++) { - vir = (long) prc->p_memmap[i].mem_vir << CLICK_SHIFT; - phy = (long) prc->p_memmap[i].mem_phys << CLICK_SHIFT; - len = (long) prc->p_memmap[i].mem_len << CLICK_SHIFT; - Printf("%c:\t0x%08.8lx\t0x%08.8lx\t%8ld (0x%08.8lx)\n", - segment_name[i], vir, phy, len, len); - } -} - -void update() -{ - int i; - - for (i = 0; i < (SIZ - 1); i++) - lbuf[i] = ptrace(T_GETUSER, curpid, (long) (i * sizeof(long)), 0L); - - st_addr = (long) prc->p_memmap[T].mem_vir << CLICK_SHIFT; - et_addr = st_addr + ( (long) prc->p_memmap[T].mem_len << CLICK_SHIFT ); - - sd_addr = (long) prc->p_memmap[D].mem_vir << CLICK_SHIFT; - ed_addr = end_addr = - sd_addr + ( (long) prc->p_memmap[D].mem_len << CLICK_SHIFT ); - - sk_addr = (long) prc->p_memmap[S].mem_vir << CLICK_SHIFT; - sk_size = (long) prc->p_memmap[S].mem_len << CLICK_SHIFT; - -#ifdef MINIX_PC - if ( end_addr < et_addr ) end_addr = et_addr; -#endif - -} - -int disp_regs() -{ - int i; - - if (curpid <= 0) { - Printf("No active process.\n"); - return 1; - } - -/* Look at kernel/type.h see how this data from the stackframe is laid out */ - -#if defined(MINIX_PC) && defined(__i86) - Printf("\ - es ds di si bp bx dx cx ax ip cs psw sp ss\ -\n"); - for (i = 0; i < 16; i++) - if ( i != 5 && i != 10 ) Printf("%04x ", ((reg_t *) &prc->p_reg)[i]); - Printf("\n"); -#endif - -#if defined(MINIX_PC) && defined(__i386) - Printf("\n"); - Printf("\ - fs gs ds es edi esi ebp ebx edx\n"); - for (i = 0; i < 8; i++) - if ( i != 6 ) Printf("%08lx ", ((reg_t *) &prc->p_reg)[i]); - Printf("\n\ - ecx eax eip cs psw esp ss\n"); - for (; i < 16; i++) - if ( i != 10 ) Printf("%08lx ", ((reg_t *) &prc->p_reg)[i]); - Printf("\n"); -#endif - -#ifdef MINIX_ST - Printf("\npc=%lx psw=%x\n\n",(long)PC_MEMBER(prc), PSW_MEMBER(prc)); - Printf( -" 0 1 2 3 4 5 6 7\nD"); - for (i = 0; i < 8; i++) Printf(" %08lx", ((reg_t *) &prc->p_reg)[i]); - Printf("\nA"); - for (; i < NR_REGS; i++) Printf(" %08lx", ((reg_t *) &prc->p_reg)[i]); - Printf(" %08lx\n\n", (long)SP_MEMBER(prc)); -#endif - return 0; -} - -/* System dependent core */ - -#ifdef MINIX_PC - -#ifdef __i386 -static char regs[] = "fs gs ds es di si bp bx dx cx ax ip cs ps sp ss"; -#else -static char regs[] = "es ds di si bp bx dx cx ax ip cs ps sp ss"; -#endif - -/* Get register for pid at offset k */ -long get_reg(pid, k) -int pid; -long k; -{ - long off; - long val; - int reg_size; - - /* Calculate size of register */ - reg_size = (k < N_REG16 * 2) ? 2 : sizeof(reg_t); - - /* Adjust offset */ - off = k - (k & (sizeof(long) - 1)); - - val = ptrace(T_GETUSER, pid, off, 0L); - - if (k & (sizeof(long) - 1)) - val >>= BITSIZE(reg_size); - else - val &= MASK(reg_size); - return val; -} - - -/* Set register for pid at offset k */ -void set_reg(pid, k, value) -int pid; -long k; -long value; -{ - long off; - - /* Adjust offset */ - off = k - (k & (sizeof(long) - 1)); - - ptrace(T_SETUSER, pid, off, value); - -} - - -long reg_addr(s) -char *s; -{ - long val; - char *t; - char *send; - char q[3]; - - if (*s == ' ') - mdb_error("Invalid syntax\n"); - q[0] = tolower(*s); - q[1] = tolower(*++s); - q[2] = '\0'; - - t = regs; - send = regs + sizeof(regs); - while (t < send) { - if (strncmp(q, t, 2) == 0) { - val = (long) (t - regs); - val /= 3L; - if (val < N_REG16 - 1) - val = val * 2; - else - val = (N_REG16 - 1) * 2 + - (val - N_REG16 + 1) * sizeof(reg_t); - return val; - } - t += 3; - } - Printf("Unknown register: %s", q); - mdb_error("\n"); -} - - -int outsegreg(num) -off_t num; -{ -/* print segment register */ - - if ((num % HCLICK_SIZE) != 0 || num >= 0x100000) - { - Printf("%08x",num); - return 8; - } - Printf("%04x", (u16_t) (num / HCLICK_SIZE) ); - return 4; -} - -#endif - -#ifdef MINIX_ST - -/* Get register for pid at offset k */ -long get_reg(pid, k) -int pid; -long k; -{ - return ptrace(T_GETUSER, pid, k, 0L); -} - -long reg_addr(s) -char *s; -{ - long val; - - switch (*s++) { - case 'a': - case 'A': val = 32; break; - case 'd': - case 'D': val = 0; break; - case 'P': - case 'p': if (*s != 'c' && *s != 'C') goto error; - return 64; - break; - default: goto error; - } - if (*s >= '0' && *s <= '7') - return val + 4 * (*s - '0'); -error: - Printf("Unknown register: %2.2s", s); - mdb_error("\n"); -} - -#endif diff --git a/commands/mdb/mdb.1 b/commands/mdb/mdb.1 deleted file mode 100644 index e7be50ed6..000000000 --- a/commands/mdb/mdb.1 +++ /dev/null @@ -1,154 +0,0 @@ -.TH MDB 1 -.SH NAME -mdb \- Minix debugger -.SH SYNOPSIS -.B mdb -.RB [ \-fc ] -.I file -.br -.B mdb -.BR [-L|-l]log\-file -.I exec-file -.RI [ core\-file ] -.RI [ @command\-file ] -.SH DESCRIPTION -.de SP -.if t .sp 0.4 -.if n .sp -.. -.B mdb -is the Minix debugger. -.SH OPTIONS -Its command line options are: -.TP -.B \-f -Just examine the specified file. -.TP -.B \-c -Examine 'core' file. No exec-file will be supplied. -.TP -.B \-Llog\-file -Log to file only -.TP -.B \-llog\-file -Log to file. -.SP -.IR exec\-file -Unless the -c option has been specified, the exec-file is required. -.SP -.IR core\-file -The core-file is optional. -.SP -If the core-file is supplied, -.B mdb -assumes that the user wishes to examine the core file. -Otherwise -.B mdb -assumes that the user will run the exec-file and trace it. -.SP -.IR @command\-file -.B mdb -executes command from command-file. -.SH OVERVIEW -.br -.B mdb -commands are of the form: -.I [ expression ] -.I command -.SP -.I expression -can be of the form: -.IP -.I address -which defaults to text segment -.IP -address -.I overriden -by -.I T: -for Text segment -or -.I D: -for Data segment -or -.I S: -for Stack segment -.IP -.I symbol -where -.B mdb -does a lookup for the symbol first as a -.I text -symbol and then as a -.I data -symbol. -.SP -.TP -.I command -.SP -The help command is ?. -.SP -For detailed help on a command type: -.I command ?. -.SP -A semi-colon can be used to separate commands on a line. -.SP -.SH MDB COMMANDS -.SP -! Shell escape -.SP -# Set Variable or register -.SP -Tt Current call / Backtrace all -.SP -/nsf Display for n size s with format f -.SP -Xx [n] Disasm / & display reg for n instructions -.SP -Rr a Run / with arguments a -.SP -Cc [n] Continue with current signal / no signal n times -.SP -Ii [n] Single step with / no signal for n instructions -.SP -Mm t n Trace until / Stop when modified t type for n instructions -.SP -k Kill -.SP -Bb Display / Set Break-pt -.SP -Dd Delete all / one break-points -.SP -P Toggle Pagging -.SP -Ll name Log to file name / and to standard output -.SP -Vv Toggle debug flag / Version info -.SP -V Version info -.SP -e [t] List symbols for type t -.SP -y Print segment mappings -.SP -s [n] Dump stack for n words -.SP -z [a] Trace syscalls with address a -.SP -? Help - short help -.SP -@ file Execute commands from file -.SP -Qq Quit / and kill traced process -.SP -.SH "SEE ALSO" -.SP -trace(2). -.SH DIAGNOSTICS - -.SH NOTES - -.SH BUGS - -.SH AUTHOR -Philip Murton and others diff --git a/commands/mdb/mdb.c b/commands/mdb/mdb.c deleted file mode 100644 index c5a579038..000000000 --- a/commands/mdb/mdb.c +++ /dev/null @@ -1,1029 +0,0 @@ -/* - * mdb.c - MINIX program debugger - * - * Written by Bruce D. Szablak - * - * This free software is provided for non-commerical use. No warrantee - * of fitness for any use is implied. You get what you pay for. Anyone - * may make modifications and distribute them, but please keep this header - * in the distribution. - */ - -/* - * Originally ported to MINIX-PC and MINIX-386 by Bruce Evans. - * NB: the original sym.c and mdbdis86.c come from his 'db' - * - * Added by Philip Murton: - * - * 2.0 'Core' file functions - * 2.1 Support for GNU exec - * 2.2 Changes for Minix 1.6.x Beta - * 2.3 Changes for Minix 1.7.0 and trace syscalls - * 2.4 Changes for Minix 1.7.2 and clean up - * 2.5.1 Add better help - * 2.5.2 Added io.c for logging options - * 2.5.3 Minor changes and tested with Minix 1.7.4 - * 2.5.4 Command arguments processing improved (Thanks to Will Rose) - * 2.6.0 Final Version for MINIX CD (Sept/96) - */ - -#define _MAIN_MDB -#include "mdb.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#define ptrace mdbtrace -#include -#include -#include "proto.h" - -#include -#include -#include -#include - -/* buffer for proc and pointer to proc */ -extern struct proc *prc; - -#define MAXLINE 128 -#define MAXARG 20 - -static unsigned long lastexp = 0L; /* last expression and segment */ -static int lastseg = NOSEG; -static char *prog; /* prog name */ -static char sbuf[MAXLINE]; -static char cbuf[MAXLINE]; -static char *cmd; /* current command */ -static char *cmdstart; /* start of command */ -static jmp_buf mainlp; - - -struct b_pnt { - struct b_pnt *nxt, *prv; - long addr; - long oldval; - char cmd[1]; -} *b_head, *curpnt; - -int main(int argc, char *argv[]); - -static void cleanup(void); -static void freepnt(struct b_pnt *pnt ); -static void findbpnt(int verbose ); -static int exebpnt(int restart ); -static void catch(int sig ); -static int run(char *name , char *argstr , int tflg ); -static int dowait(void); -static void backtrace(int all ); -static void modify(long addr , int cnt , int verbose , int size ); -static void display(long addr , int req ); -static void fill(long addr , int req ); -static void dorun(char *cmd ); -static void not_for_core(void); -static void command(void); - - -static void cleanup() -{ - curpid = 0; - curpnt = NULL; - while (b_head) freepnt(b_head); -} - -static void findbpnt(verbose) -int verbose; -{ - for (curpnt = b_head; curpnt; curpnt = curpnt->nxt) { - if (curpnt->addr == PC_MEMBER(prc) - BREAKPOINT_ADVANCE) { - ptrace(T_SETINS, curpid, curpnt->addr, curpnt->oldval); - ptrace(T_SETUSER, curpid, PC_OFF, curpnt->addr); -#if SYSCALLS_SUPPORT - if( syscalls ) - do_syscall(curpnt->addr); - else if (curpnt->cmd[0] != '\n') -#else - if (curpnt->cmd[0] != '\n') -#endif - cmd = strcpy(cbuf, curpnt->cmd); - else if (verbose) - Printf("Breakpoint hit.\n"); - return; - } - } - if (verbose) Printf("Unknown breakpoint hit.\n"); -} - -static int exebpnt(restart) -int restart; -{ - ptrace(T_STEP, curpid, 0L, (long) restart); - if (dowait() == 0) return TRUE; - ptrace(T_SETINS, curpid, curpnt->addr, BREAK(curpnt->oldval)); - curpnt = NULL; - return FALSE; -} - - -static void freepnt(pnt) -struct b_pnt *pnt; -{ - if (pnt->prv) - pnt->prv->nxt = pnt->nxt; - else - b_head = pnt->nxt; - if (pnt->nxt) pnt->nxt->prv = pnt->prv; - if (curpid > 0) ptrace(T_SETINS, curpid, pnt->addr, pnt->oldval); - free(pnt); - if (pnt == curpnt) curpnt = NULL; -} - - -long breakpt(addr, cmd) -long addr; -char *cmd; -{ - struct b_pnt *new; - - if (curpid <= 0) { - Printf("No active process.\n"); - return 0L; - } - for (new = b_head; new; new = new->nxt) - if (new->addr == addr) { - Printf("Breakpoint already exists here.\n"); - return 0L; - } - new = (struct b_pnt *) malloc(sizeof(struct b_pnt) + strlen(cmd)); - if (new == NULL) { - Printf("No room for new breakpoint.\n"); - return 0L; - } - new->nxt = b_head; - new->prv = 0; - if (b_head) b_head->prv = new; - b_head = new; - new->addr = addr; - strcpy(new->cmd, cmd); - new->oldval = ptrace(T_GETINS, curpid, addr, 0L); - ptrace(T_SETINS, curpid, addr, BREAK(new->oldval)); - if (ptrace(T_GETINS, curpid, addr, 0L) != BREAK(new->oldval)) { - do_error("Can't set breakpoint"); - freepnt(new); - return 0L; - } - return new->oldval; -} - -static void catch(sig) -int sig; -{ - signal(sig, catch); - if (sig == SIGINT || sig == SIGQUIT) return; - tstart(T_EXIT, 0, sig, 0); - exit(0); -} - - -static int dowait() -{ - int stat; - - if (corepid > 0) return cursig = 0; - while (wait(&stat) != curpid) {}; - if ( WIFEXITED(stat) ) { - if (WEXITSTATUS(stat) != 127) - Printf("child exited with status %d\n", WEXITSTATUS(stat)); - cleanup(); - return 0; - } - if ( WIFSIGNALED(stat) ) { - Printf("child terminated by signal %d\n", WTERMSIG(stat) ); - if (_LOW(stat) & 0x80) Printf("(core dumped)\n"); - cleanup(); - return 0; - } - return cursig = WSTOPSIG(stat); -} - - - -void tstart(req, verbose, val, cnt) -int req, verbose, val, cnt; -{ - if (curpid == 0) { - if (verbose) Printf("No active process.\n"); - return; - } - if (req == T_EXIT) { - ptrace(T_EXIT, curpid, 0L, (long) val); - dowait(); - return; - } - if (cnt == 0) cnt = 1; - do { - if (curpnt) { - if (exebpnt(val)) return; - if (req == T_RESUME) cnt++; - val = 0; - } else { - ptrace(req, curpid, 0L, (long) val); - if (dowait() == 0) return; - val = 0; - switch (cursig) { - case SIGEMT: /* breakpoint */ - update(); - findbpnt(cnt <= 1); - break; - case SIGTRAP: /* trace trap? */ - if (req == T_STEP) break; - default: /* signal */ - val = cursig; - break; - } - } - } - while (--cnt > 0); - update(); - if ( verbose ) dasm((long) PC_MEMBER(prc), 1, 1); -} - -static int run(name, argstr, tflg) -char *name, *argstr; -int tflg; -{ - int procid; - char *argv[MAXARG], *inf = NULL, *outf = NULL; - int argc; - - if ((procid = fork()) == 0) { - /* trace me */ - if (tflg) ptrace(T_OK, 0, 0L, 0L); - argv[0] = name; - for (argc = 1;;) { - argstr = skip(argstr); - if (*argstr == '\n' || *argstr == ';') { - argv[argc] = 0; - if (inf) freopen(inf, "r", stdin); - if (outf) freopen(outf, "w", stdout); - if (tflg) { - execv(name, argv); - do_error("execv"); - } else { - execvp(name, argv); - do_error("execvp"); - } - exit(127); - } - if (*argstr == '<') - inf = argstr + 1; - else if (*argstr == '>') - outf = argstr + 1; - else if (argc == MAXARG) { - Printf("Too many arguments.\n"); - exit(127); - } else - argv[argc++] = argstr; - while (!isspace(*argstr)) argstr++; - if (*argstr == '\n') argstr[1] = '\n', argstr[2] = 0; - *argstr++ = 0; - } - } - if (procid < 0) do_error("Fork failed.\n"); - return procid; -} - - -static void dorun(cmd) -char *cmd; -{ - if (curpid = run(prog, cmd, 1)) { - if (dowait()) { - ptrace(T_SETUSER, curpid, BP_OFF, 0L); - update(); - Printf("Process stopped.\n"); - } - } -} - -/* - * backtrace - inspect the stack - */ -static void backtrace(all) -int all; -{ - unsigned long pc, bp, off, val, obp; - - if (curpid <= 0) { - Printf("No process.\n"); - return; - } - pc = get_reg(curpid,PC_OFF); - bp = get_reg(curpid,BP_OFF); - if (bp == 0) { - Printf("No active frame.\n"); - return; - } - errno = 0; - do { - symbolic(pc, '('); - pc = (ptrace(T_GETDATA, curpid, bp + ADDRSIZE, 0L) - >> SHIFT(ADDRSIZE)) & MASK(ADDRSIZE); - off = ptrace(T_GETINS, curpid, pc, 0L); -#ifdef DEBUG - if(debug) - Printf("Return address %lx Value %lx\n",pc,off); -#endif - obp = bp; - bp += 2 * ADDRSIZE; - - /* Check for various instruction used to restore the stack. - * Should gives us the number of arguments. - * This is obvious dependent on interal features of the - * compiler used. - */ - if (ADDQ(off)) off = ADDQ_CNT(off) + bp; -#ifdef __mc68000__ - else if (LEA(off)) - off = LEA_DISP(off) + bp; -#endif - else if (ADDA(off)) - off = ADDA_CNT(ptrace(T_GETINS, curpid, pc + 2, 0L)) + bp; -#if defined(__i386__) - else if (INCSP2(off)) - off = bp + 2*INTSIZE; - else if (POPBX2(off)) - off = bp + 2*INTSIZE; - else if (POPCX2(off)) - off = bp + 2*INTSIZE; - else if (POPBX(off)) - off = bp + INTSIZE; - else if (POPCX(off)) - off = bp + INTSIZE; -#endif - else - goto skiplp; - -#ifdef DEBUG - if (debug) - Printf("Number of arguments: %d\n",(off-bp)/INTSIZE); -#endif - - for (;;) { - if (errno) return; - val = (ptrace(T_GETDATA, curpid, bp, 0L) - >> SHIFT(INTSIZE)) & MASK(INTSIZE); - Printf("0x%0*lx", 2 * INTSIZE, val); - bp += INTSIZE; - if (bp >= off) break; - Printf(","); - } - -skiplp: - Printf(")\n"); - bp = (long) ( (reg_t) ptrace(T_GETDATA, curpid, obp, 0L) ); -#ifdef DEBUG - if(debug) - Printf("Old BP %lx New %lx\n",obp,bp); -#endif - } - while (all && (reg_t) bp); -} - -static void modify(addr, cnt, verbose, size) -long addr; -int cnt, verbose, size; -{ - long curval, off; - - if (curpid == 0) { - Printf("No active process.\n"); - return; - } - curval = ptrace(T_GETDATA, curpid, addr, 0L) & MASK(size); - do { - if (cursig == SIGTRAP) cursig = 0; - if (verbose) { - off = get_reg(curpid, PC_OFF); - dasm(off, 1, 0); - } - if (curpnt && exebpnt(cursig)) - return; - else { - ptrace(T_STEP, curpid, addr, 0L); - switch (dowait()) { - case 0: - return; - case SIGEMT: - update(); - findbpnt(0); - break; - } - } - if (curval != ptrace(T_GETDATA, curpid, addr, 0L) & MASK(size)) { - Printf("Modification detected\n"); - break; - } - } - while (--cnt); - update(); - dasm((long) PC_MEMBER(prc), 1, 1); - return; -} - -static void display(addr, req) -long addr; -int req; -{ - int count, size, out, shift; - long val, msk; - char fmt; - - if (curpid == 0) { - Printf("No active process\n"); - return; - } - if (req == T_GETDATA && seg == T) req = T_GETINS; - count = strtol(cmd, &cmd, 0); - if (count == 0) count = 1; - cmd = skip(cmd); - if (*cmd == 'i' || *cmd == 'I') { - dasm(addr, count, *cmd == 'i'); - return; - } - if (*cmd == 'y') { - symbolic(addr, '\n'); - return; - } - switch (*cmd++) { - case 'b': size = sizeof(char); break; - case 'h': size = sizeof(short); break; - case 'l': size = sizeof(long); break; - default: - size = sizeof(int); - --cmd; - break; - } - switch (fmt = *cmd) { - case 'X': - case 'D': - size = sizeof(long); - break; - case 's': - addr = ptrace(req, curpid, addr, 0L); - req = T_GETDATA; - /* Fallthrough */ - case 'a': - case 'c': - size = sizeof(char); - break; - } - out = 0; - msk = MASK(size); - shift = SHIFT(size); - do { - val = (ptrace(req, curpid, addr, 0L) >> shift) & msk; - if (out == 0) Printf("\n0x%0*lx: ", 2 * ADDRSIZE, - (addr >> SHIFT(ADDRSIZE)) & MASK(ADDRSIZE)); - switch (fmt) { - case 'c': - Printf(isprint((int) (UCHAR(val))) ? " %c " : "\\%03o ", - (int) (UCHAR(val))); - if (++out == 8) out = 0; - break; - case 'u': - Printf("%12lu ", val); - if (++out == 4) out = 0; - break; - case 'x': - case 'X': - Printf("%*lx ", 2 * size, val); - if (++out == (size == 4 ? 4 : 8)) out = 0; - break; - case 'o': - Printf("%*lo ", 3 * size, val); - if (++out == (size == 4 ? 4 : 8)) out = 0; - break; - case 's': - case 'a': - if (val) - Printf("%c",val); - else - goto exitlp; - if (++out == 64) out = 0; - break; - default: - case 'd': - case 'D': - Printf("%12ld ", val); - if (++out == 4) out = 0; - break; - } - addr += size; - } - while (--count > 0 || fmt == 's' || fmt == 'a'); -exitlp: - Printf("\n"); -} - -static void fill(addr, req) -long addr; -int req; -{ - int count, size, shift; - long val, msk, nval; - - if (curpid == 0) { - Printf("No active process\n"); - return; - } - - if (req == T_GETDATA && seg == T) { - req = T_GETINS; - Printf("mdb: warning - modifying text\n"); - } - count = strtol(cmd, &cmd, 0); - if ( count == 0 ) count = 1; - switch (*cmd++) { - case 'b': size = sizeof(char); break; - case 'h': size = sizeof(short); break; - case 'l': size = sizeof(long); break; - default: - size = sizeof(int); - --cmd; - break; - } - shift = SHIFT(size); - msk = MASK(size); - cmd = getexp(cmd, &nval, &seg); - -#ifdef DEBUG - if (debug) - Printf("Filling for Count=%d Size=%d val=%lx\n",count,size,nval); -#endif - - nval <<= shift; - do { - val = ptrace(req, curpid, addr, 0L) | (nval & msk); - val &= (nval | ~msk); - ptrace(req + 3, curpid, addr, val); - addr += size; - } - while (--count > 0); -} - -static void not_for_core() -{ - if (corepid > 0) - mdb_error("Illegal command for 'core' file\n"); -} - -static void command() -{ - char c, *p; - int i; - int size; - int stat; - long exp, lj, lk; - struct b_pnt *bp; - - seg = NOSEG; /* don't restrict segment expressions are in */ - cmdstart = cmd = skip(cmd); - cmd = getexp(cmd, &exp, &seg); - - if (cmd == cmdstart) { - /* Not an expression */ - if (corepid < 0) { /* default to pc for running processs */ - seg = T; - exp = PC_MEMBER(prc); - } else { - seg = lastseg; - exp = lastexp; - } - - /* Is it a help command */ - cmd = skip(cmd+1); - if (*cmd == '?') { - help_on(*cmdstart); - *cmd = '\n'; - return; - } - else - cmd = cmdstart; - } - - if (seg == NOSEG) seg = T; /* Absolute becomes Text */ - lastexp = exp; /* save last expression */ - lastseg = seg; -#ifdef DEBUG - if(debug) - Printf("Current address 0x%0*lx and segment %d\n", 2 * ADDRSIZE, exp, seg); - -#endif - - /* Check commands */ - switch (c = *cmd++) { - case 'r': /* illegal for 'core' files */ - case 'R': - case 'k': - case 'B': - case 'd': - case 'D': not_for_core(); - break; - - case 'b': /* illegal for 'core' files */ - case 'c': /* Otherwise run process first */ - case 'C': - case 'm': - case 'M': -#if SYSCALLS_SUPPORT - case 'z': -#endif - case 'i': - case 'I': not_for_core(); - if (curpid <= 0) dorun("\n"); - break; - - case 's': if (curpid <= 0) dorun("\n"); - break; - - default: break; - } - - switch (c) { - case '!': /* escape to shell */ - if (cmd == cmdstart + 1) { - cmd = skip(cmd); - if (*cmd == '\n' || *cmd == ';') { - i = run("/bin/sh", "\n", 0); - } else { - for (p = cmd + 1; *p && !isspace(*p); p++) { - }; - *p++ = 0; - i = run(cmd, *p ? p : "\n", 0); - } - if (i > 0) while (wait(&stat) != i) {}; - break; - } - if (corepid > 0) longjmp(mainlp, 0); - break; - case 'T': /* top line of backtrace */ - backtrace(0); - break; - case 't': /* back trace */ - backtrace(1); - break; - case '/': /* print variable value */ - display(exp, T_GETDATA); - break; - case 'x': /* print registers and instruction */ - if (disp_regs()) break; - /* FALLTHROUGH */ - case 'X': /* print instruction - X n [, n] */ - lj = strtol(cmd, &cmd, 0); - lk = 0; - if (*cmd != '\n') - lk = strtol(++cmd, &cmd, 0); - if (curpid > 0) - dasm(exp + lk, lj ? lj : 1, 1); - else - Printf("No active process.\n"); - break; - case 'R': /* run program with no args */ - case 'r': /* run program with args (possibly defaulted) */ - tstart(T_EXIT, 0, 0, 0); - if (c == 'r') { - cmd = skip(cmd); - if (*cmd == '\n' || *cmd == ';') - cmd = sbuf; - else - strcpy(sbuf, cmd); - } else { - cmd = "\n"; - } - dorun(cmd); - break; - case 'c': /* continue program - ignore signal */ - cursig = 0; - case 'C': /* continue program - handle signal */ - i = 0; - if (seg == T && curpnt == 0 && cmd != cmdstart + 1) { - breakpt(exp, "\n"); - curpnt = b_head; - ptrace(T_SETINS, curpid, curpnt->addr, curpnt->oldval); - i = 1; - } - tstart(T_RESUME, 1, cursig, (int) strtol(cmd, &cmd, 0)); - /* remove temporary bp */ - if (i) freepnt(b_head); - if (cursig == SIGEMT) return; - if (curpid) Printf("Process stopped by signal %d\n", cursig); - break; - case 'i': /* single step - ignore signal */ - tstart(T_STEP, 1, 0, (int) strtol(cmd, &cmd, 0)); - break; - case 'I': /* single step - handle signal */ - tstart(T_STEP, 1, cursig, (int) strtol(cmd, &cmd, 0)); - break; - case 'm': /* single step until location modified */ - case 'M': /* single step until location modified - verbose */ - cmd = skip(cmd); - switch (*cmd++) { - case 'b': size = sizeof(char); break; - case 'h': size = sizeof(short); break; - case 'l': size = sizeof(long); break; - default: - size = sizeof(int); - --cmd; - break; - } - modify(exp, (int) strtol(cmd, &cmd, 0), c == 'M', size); - break; - case 'k': /* kill current program */ - tstart(T_EXIT, 1, 0, 0); - break; - case 'b': /* set a breakpoint at the given line */ -#ifdef MINIX_PC - if (seg != T || exp > end_addr ) { -#else - if (seg != T || exp < st_addr || exp > et_addr ) { -#endif - Printf("Address not in text space.\n"); - return; - } - breakpt(exp, skip(cmd)); - cmd = "\n"; - return; - case 'B': /* print list of currently active breakpoints */ - for (i = 1, bp = b_head; bp; bp = bp->nxt, i++) { - Printf("%2d: ", i); - symbolic((long) bp->addr, '\t'); - Printf("(0x%lx)\t- %s", bp->addr, bp->cmd); - } - break; - case 'd': /* delete breakpoint */ - if (seg == T) { - for (bp = b_head; bp && bp->addr != exp; bp = bp->nxt); - if (bp) { - freepnt(bp); - break; - } - } - Printf("No such breakpoint.\n"); - break; - case 'D': /* delete all breakpoints */ - while (b_head) freepnt(b_head); - break; - case 's': - dump_stack( strtol(cmd, &cmd, 0) ); - break; - case 'P': - paging = !paging; - if (paging) Printf("Paging is ON\n"); - break; - case 'l': - case 'L': - logging(c,skip(cmd)); - break; -#if SYSCALLS_SUPPORT - case 'z': - start_syscall( strtol(cmd, &cmd, 0) ); - if ( syscalls ) - Printf("Break point set - use the 'c n' command\n"); - break; -#endif - case 'q': /* quit */ - tstart(T_EXIT, 0, 0, 0); - logging(c,cmd); - case 'Q': - exit(0); - break; - case '\n': - case ';': - if (isdigit(*cmdstart)) - symbolic(exp, '\n'); - else - Printf("0x%0*lx\n", 2 * ADDRSIZE, exp); - --cmd; - break; -#ifdef DEBUG - case 'v': /* toggle debug */ - debug = !debug; - if (debug) Printf("Debug flag ON\n"); - break; -#endif - case 'e': /* list symbols */ - listsym(cmd); - break; - case 'y': /* print mapping */ - prtmap(); - break; - case '?': /* print help */ - help_page(); - break; - case 'V': /* print version info */ - version_info(); - break; - case '@': /* command file */ - cmd = skip(cmd); - openin(cmd); - *cmd = '\n'; - return; - case '#': /* set register or variable */ - cmd = skip(cmd + 1); - if (*cmd == '$') { - cmd++; - i = reg_addr(cmd); - set_reg(curpid, i, strtol(cmd+2, &cmd, 0) ); - update(); - break; - } - cmd = getexp(cmd, &exp, &seg); - fill(exp, T_GETDATA); - break; - default: - help_page(); - break; - } - while (*cmd != '\n' && *cmd != ';') ++cmd; - if (*cmd == ';') cmd = skip(cmd + 1); -} - -void mdb_error(s) -char *s; -{ - Printf("%s",s); - longjmp(mainlp, 0); -} - -int main(argc, argv) -int argc; -char *argv[]; -{ - int i, c; - char *p, *q, *r; - int opt_c = FALSE; /* load core file */ - int opt_f = FALSE; /* load object file */ - int opt_l = FALSE; /* log to file */ - int opt_L = FALSE; /* log to file and screen */ - - - prc = (struct proc *) lbuf; - strcpy(sbuf, "\n"); - corepid = -1; /* set to indicate none */ - prog = p = q = r = NULL; - - if ( argc == 1 ) - { - help_page(); - exit(0); - } - - /* Possible combinations of arguments: - * A single file name: - * If the name is 'core', the coreonly flag is set. - * The -c flag: examine a core file. - * One filename is required with this flag. - * The -f flag: examine an object file. - * One file name is required with this flag. - * The -L or -l flag: write to a log file. - * One file name is required with these flags. - * The -x flag: turn on debugging. - * Used for debugging, and followed by an integer - * argument which is the debugging level. - * - * If any files remain on the argument list, the first - * file is an executable, and the second a core file. - * If any filename starts with '@' it is assumed to - * to be a command file. Only one command file is - * loaded. - */ - - /* check for default file name and fake out getopt */ - if (strcmp(argv[1], "core") == 0) { - for (i = argc ; i > 1 ; i--) - argv[i] = argv[i - 1]; - argv[i] = "-c"; - argc++; - } - - /* parse options */ - opterr = 0; - while ((i = getopt(argc, argv, "c:f:L:l:x:")) != EOF) { - switch (i & 0377) { - case 'c': /* examine a core file */ - if (opt_c == TRUE || opt_f == TRUE) { - help_page(); - exit(1); - } - p = optarg; - opt_c = TRUE; - break; - case 'f': /* examine an object file */ - if (opt_c == TRUE || opt_f == TRUE) { - help_page(); - exit(1); - } - p = optarg; - opt_f = TRUE; - break; - case 'l': /* start logging */ - if (opt_l == TRUE || opt_L == TRUE) { - help_page(); - exit(1); - } - opt_l = TRUE; - logging(i, optarg); - break; - case 'L': /* start logging */ - if (opt_l == TRUE || opt_L == TRUE) { - help_page(); - exit(1); - } - opt_L = TRUE; - logging(i, optarg); - break; -#ifdef DEBUG - case 'x': /* set debug level */ - debug = atoi(optarg); - break; -#endif - case '?': /* default arguments arrive here */ - default: - help_page(); - exit(1); - } - } - - /* can't cope without filenames */ - if (!opt_c && !opt_f && optind >= argc) { - help_page(); - exit(1); - } - - /* any remaining arguments are (optional) file names */ - for (i = optind ; i < argc ; i++) { - if (*argv[i] == '@') { /* command file */ - if (r == NULL) r = argv[i] + 1; - } - /* you can't combine a -c or -f object file and a core file */ - else if (!opt_c && !opt_f && p == NULL) p = argv[i]; - else if (q == NULL) q = argv[i]; /* core file */ - } - - /* initialise stuff - fairly tricky logic */ - coreonly = opt_c; - fileonly = opt_f; - /* when examining files, prog == NULL */ - if (!opt_c && !opt_f) { - prog = p; - syminit(prog); - } - - /* file_init is called for non-core files. - * It is very similar to core_init. It opens the file and set - * various pointers so that we can read it using the same routines - * as a core file. - * NB: Currently there is no special provision to handle object files. - */ - - /* A comment from Will Rose: - * It would be nice to have - * symbol tables available when reading a core - * or a.out, either as part of the executable or - * as a separate file. - * At least three separate types of file structure - * may be used by mdb - core files, a.out files, and - * object files (which may have several flavours). - * A set of routines is needed for each type, with - * a function switch table initialised when mdb is - * started up. - */ - - if (opt_c) lastexp = core_init(p); - if (opt_f) lastexp = file_init(p); - if (q != NULL) lastexp = core_init(q); - if (r != NULL) openin(r); - for (i = 1; i < _NSIG; i++) signal(i, catch); - - setjmp(mainlp); - - while (get_cmd( cbuf, MAXLINE ) != NULL) { - if (strlen(cbuf) == sizeof(cbuf) - 1) { - Printf("Command line too long.\n"); - continue; - } - cmd = cbuf; - command(); - while (*cmd != '\n') command(); - } - tstart(T_EXIT, 0, 0, 0); - exit(0); -} diff --git a/commands/mdb/mdb.h b/commands/mdb/mdb.h deleted file mode 100644 index 1541230f1..000000000 --- a/commands/mdb/mdb.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * mdb.h for mdb - */ -#define MDBVERSION "2.6" -#define MDBBUILD 0 - -#define MINIX_SYMBOLS 1 -#define GNU_SYMBOLS 2 - -/* - * Handle options here - */ -#ifndef GNU_SUPPORT -#define GNU_SUPPORT 0 -#endif - -#ifndef SYSCALLS_SUPPORT -#define SYSCALLS_SUPPORT 0 -#endif - -#ifdef DEBUG -#undef DEBUG -#endif - -#ifdef NDEBUG -#undef DEBUG -#else -#define DEBUG 1 -#endif - -#ifdef __i386 -#define EXTRA_SYMBOLS GNU_SUPPORT -#else -#define EXTRA_SYMBOLS 0 -#endif - - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#undef printf /* defined as printk in */ - -#if defined(__i386__) -#define MINIX_PC -#else -#error "Unsupported arch" -#endif - -#ifdef MINIX_ST -#define BP_OFF ((long)&((struct proc *)0)->p_reg.a6) -#define PC_MEMBER(rp) ((rp)->p_reg.pc) -#define PC_OFF ((long)&((struct proc *)0)->p_reg.pc) -#define SP_MEMBER(rp) ((rp)->p_reg.sp) -#define PSW_MEMBER(rp) ((rp)->p_reg.psw) -#endif - -#ifdef MINIX_PC -#define BP_OFF ((long)&((struct proc *)0)->p_reg.fp) -#define PC_MEMBER(rp) ((rp)->p_reg.pc) -#define PC_OFF ((long)&((struct proc *)0)->p_reg.pc) -#endif - -#define ADDRSIZE (sizeof(void *)) -#define BITSIZE(size) (8 * (size)) -#define INTSIZE (sizeof(int)) /* not quite right for cross-debugger */ -#define LONGSIZE (sizeof(long)) -#define UCHAR(x) ((x) & 0xFF) -#define NOSEG (-1) /* no segment */ - -/* use hardware codes for segments for simplest decoding */ -#define CSEG 0x2E /* 8088 through 80386 */ -#define DSEG 0x3E - -#if defined(__i386__) -#define N_REG16 4 /* 16 bit registers at start of stackframe */ -#endif - -#if defined(__i386__) -#define ADDA(l) ((u16_t) (l) == 0xC481) - -#ifdef __i386 -#define ADDA_CNT(l) ((i32_t) (l)) -#else -#define ADDA_CNT(l) ((i16_t) (l)) -#endif - -#define ADDQ(l) ((u16_t) (l) == 0xC483) -#define ADDQ_CNT(l) (((((l) >> 16) + 128) & 0x000000FF) - 128) -#define BREAK(l) (0x000000CC | ((l) & 0xFFFFFF00)) -#define BREAKPOINT_ADVANCE 1 -#define INCSP2(l) ((u16_t) (l) == 0x4444) -#define POPBX2(l) ((u16_t) (l) == 0x5B5B) -#define POPBX(l) ( (l & 0xFF) == 0x5B) - -/* Added for ANSI CC */ -#define POPCX2(l) ((u16_t) (l) == 0x5959) -#define POPCX(l) ( (l & 0xFF) == 0x59) - -#endif - -#ifdef __mc68000__ -#define ADDA(l) ((int)((l) >> 16) == 0xDFFC) -#define ADDA_CNT(l) (l) -#define ADDQ(l) (((l >> 16) & 0xF13F) == 0x500F) -#define ADDQ_CNT(l) (((((l) >> 25) - 1) & 7) + 1) -#define BREAK(l) (0xA0000000 | ((l) & 0xFFFF)) -#define BREAKPOINT_ADVANCE 0 -#define BYTES_SWAPPED /* this assumes WORDS_SWAPPED too */ -#define LEA(l) (((l) >> 16) == 0x4FEF) -#define LEA_DISP(l) ((long)( l & 0xFFFF)) -#endif - -#define MASK(size) ((size) >= LONGSIZE ? -1L : (1L << BITSIZE(size)) - 1) - -#ifdef BYTES_SWAPPED -#define SHIFT(size) BITSIZE(LONGSIZE - (size)) -#else -#define SHIFT(size) (0) -#endif - -#ifdef _MAIN_MDB -#undef EXTERN -#define EXTERN -#endif - -extern long lbuf[]; /* buffer for proc */ - -EXTERN long st_addr; /* starting address of text */ -EXTERN long et_addr; /* ending address of text */ -EXTERN long sd_addr; /* starting address of data */ -EXTERN long ed_addr; /* ending address of data */ -EXTERN long end_addr; /* ending address of text/data */ -EXTERN long sk_addr; /* starting address of stack */ -EXTERN long sk_size; /* size of stack */ -EXTERN int curpid; /* current pid of process/core */ -EXTERN int corepid; /* pid of core file */ -EXTERN int coreonly; /* core file only */ -EXTERN int fileonly; /* file only */ -EXTERN int cursig; /* current signal */ -EXTERN int seg; /* segment */ -EXTERN int is_separate; /* separate I & D */ -EXTERN int paging; /* paging flag */ -#ifdef DEBUG -EXTERN int debug; /* debug flag */ -#endif -#if SYSCALLS_SUPPORT -EXTERN int syscalls; /* trace syscalls */ -#endif - -#ifdef _MAIN_MDB -#undef EXTERN -#define EXTERN extern -#endif - diff --git a/commands/mdb/mdbdis86.c b/commands/mdb/mdbdis86.c deleted file mode 100644 index 5e7c8c0b3..000000000 --- a/commands/mdb/mdbdis86.c +++ /dev/null @@ -1,1553 +0,0 @@ -/* - * mdbdis86.c for mdb.c - 8086-386 and 8087 disassembler - * From Bruce Evans db - */ - -#include "mdb.h" -#include -#include -#include -#include "proto.h" - -struct address_s -{ - off_t off; - off_t base; -}; - -static int bits32; -static struct address_s uptr; - -static u8_t get8(void); -static u16_t get16(void); -static u32_t get32(void); -static u8_t peek_byte(off_t addr); -static u16_t peek_word(off_t addr); -static int puti(void); -static int outsegaddr(struct address_s *addr); -static int outssegaddr(struct address_s *addr); -static int show1instruction(void); - -/************************* UNASM ******************************/ - - -#define LINDIRECT '[' -#define RINDIRECT ']' - -#define BASE_MASK 0x07 -#define INDEX_MASK 0x38 -#define INDEX_SHIFT 3 -#define MOD_MASK 0xC0 /* mod reg r/m is mmrrrRRR */ -#define REG_MOD 0xC0 -#define MEM0_MOD 0x00 -#define MEM1_MOD 0x40 -#define MEM2_MOD 0x80 -#define REG_MASK 0x38 -#define REG_SHIFT 3 -#define RM_MASK 0x07 -#define RM_SHIFT 0 -#define SS_MASK 0xC0 -#define SS_SHIFT 6 - -#define SIGNBIT 0x02 /* opcode bits xxxxxxsw for immediates */ -#define WORDBIT 0x01 -#define TOREGBIT 0x02 /* opcode bit for non-immediates */ - -#define MAX_SIGNED_CHAR 0x7F /* will assume 2's complement */ -#define MAX_UNSIGNED_CHAR 0xFF - -typedef unsigned opcode_pt; /* promote to unsigned and not int */ - -typedef int reg_pt; -typedef int su16_t; -typedef int su8_pt; - -static su8_pt get8s(void); -static void getmodregrm(void); -static void i_00_to_3f(opcode_pt opc ); -static void i_40_to_5f(opcode_pt opc ); -static void i_60_to_6f(opcode_pt opc ); -static void i_70_to_7f(opcode_pt opc ); -static void i_80(opcode_pt opc ); -static void i_88(opcode_pt opc ); -static void i_90(opcode_pt opc ); -static void i_98(opcode_pt opc ); -static void i_a0(opcode_pt opc ); -static void i_a8(opcode_pt opc ); -static void i_b0(opcode_pt opc ); -static void i_b8(opcode_pt opc ); -static void i_c0(opcode_pt opc ); -static void i_c8(opcode_pt opc ); -static void i_d0(opcode_pt opc ); -static void i_d8(opcode_pt opc ); -static void i_e0(opcode_pt opc ); -static void i_e8(opcode_pt opc ); -static void i_f0(opcode_pt opc ); -static void i_f8(opcode_pt opc ); -static void outad(opcode_pt opc ); -static void outad1(opcode_pt opc ); -static void outalorx(opcode_pt opc ); -static void outax(void); -static void outbptr(void); -static void outbwptr(opcode_pt opc ); -static void outea(opcode_pt wordflags ); -static void outf1(void); -static void out32offset(void); -static void outfishy(void); -static void outgetaddr(void); -static void outimmed(opcode_pt signwordflag ); -static void outpc(off_t pc ); -static void outsegpc(void); -static void oututstr(char *s ); -static void outword(void); -static void outwptr(void); -static void outwsize(void); -static void pagef(void); -static void shift(opcode_pt opc ); -static void checkmemory(void); -static void CL(void); -static void Eb(void); -static void Ev(void); -static void EvGv(void); -static void EvIb(void); -static void Ew(void); -static void EwRw(void); -static void Gv(void); -static void Gv1(void); -static void GvEv(void); -static void GvEw(void); -static void GvM(void); -static void GvMa(void); -static void GvMp(void); -static void Ib(void); -static void Iw(void); -static void Iv(void); -static void Jb(void); -static void Jv(void); -static void Ms(void); - -typedef void(*pfv_t) (opcode_pt opc ); - -static pfv_t optable[] = -{ - i_00_to_3f, - i_00_to_3f, - i_00_to_3f, - i_00_to_3f, - i_00_to_3f, - i_00_to_3f, - i_00_to_3f, - i_00_to_3f, - i_40_to_5f, - i_40_to_5f, - i_40_to_5f, - i_40_to_5f, - i_60_to_6f, - i_60_to_6f, - i_70_to_7f, - i_70_to_7f, - i_80, - i_88, - i_90, - i_98, - i_a0, - i_a8, - i_b0, - i_b8, - i_c0, - i_c8, - i_d0, - i_d8, - i_e0, - i_e8, - i_f0, - i_f8, -}; - -static char fishy[] = "???"; -static char movtab[] = "mov\t"; - -static char *genreg[] = -{ - "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", - "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", - "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", -}; - -static char *segreg[] = -{ - "es", "cs", "ss", "ds", "fs", "gs", "?s", "?s", -}; - -static char *indreg[] = -{ - "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx", -}; - -static char *str_00_to_3f[] = -{ - /* index by (opcode >> 3) & 7 */ - "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp", -}; - -static char *sstr_00_to_3f[] = -{ - /* index ((opc>>2) & 0x0E) + (opc & 7) - 6 */ - "push\tes", "pop\tes", "push\tcs", "pop\tcs", - "push\tss", "pop\tss", "push\tds", "pop\tds", - "es:", "daa", "cs:", "das", "ss:", "aaa", "ds:", "aas", -}; - -static char *sstr_0f[] = -{ - "push\tfs", "pop\tfs", fishy, "bt\t", "shld\t", "shld\t", fishy, fishy, - "push\tgs", "pop\tgs", fishy, "bts\t", "shrd\t", "shrd\t", fishy, "imul\t", - fishy, fishy, "lss\t", "btr\t", "lfs\t", "lgs\t", "movzx\t", "movzx\t", - fishy, fishy, "", "btc\t", "bsf\t", "bsr\t", "movsx\t", "movsx\t", -}; - -static char *ssstr_0f[] = -{ - "sldt\t", "str\t", "lldt\t", "ltr\t", "verr\t", "verw\t", fishy, fishy, - "sgdt\t", "sidt\t", "lgdt\t", "lidt\t", "smsw\t", fishy, "lmsw\t", fishy, - fishy, fishy, fishy, fishy, "bt\t", "bts\t", "btr\t", "btc\t", -}; - -static char *str_40_to_5f[] = -{ - /* index by (opcode >> 3) & 3 */ - "inc\t", "dec\t", "push\t", "pop\t", -}; - -static char *str_60_to_6f[] = -{ - "pusha", "popa", "bound\t", "arpl\t", "fs:", "gs:", "os:", "as:", - "push\t", "imul\t", "push\t", "imul\t", "insb", "ins", "outsb", "outs", -}; - -static char *str_flags[] = -{ - /* opcodes 0x70 to 0x7F, and 0x0F80 to 0x0F9F */ - "o", "no", "b", "nb", "z", "nz", "be", "a", - "s", "ns", "pe", "po", "l", "ge", "le", "g", -}; - -static char *str_98[] = -{ - "cbw", "cwd", "call\t", "wait", "pushf", "popf", "sahf", "lahf", - "cwde", "cdq", "call\t", "wait", "pushfd", "popfd", "sahf", "lahf", -}; - -static char *str_a0[] = -{ - movtab, movtab, movtab, movtab, "movsb", "movs", "cmpsb", "cmps", -}; - -static char *str_a8[] = -{ - "test\t", "test\t", "stosb", "stos", "lodsb", "lods", "scasb", "scas", -}; - -static char *str_c0[] = -{ - "", "", "ret\t", "ret", "les\t", "lds\t", movtab, movtab, -}; - -static char *str_c8[] = -{ - "enter\t", "leave", "retf\t", "retf", "int\t3", "int\t", "into", "iret", -}; - -static char *str_d0[] = -{ - "aam", "aad", "db\td6", "xlat", -}; - -static char *sstr_d0[] = -{ - "rol", "ror", "rcl", "rcr", "shl", "shr", fishy, "sar", -}; - -static char *str_d8[] = -{ - "fadd", "fmul", "fcom", "fcomp", "fsub", "fsubr", "fdiv", "fdivr", - "fld", NULL, "fst", "fstp", "fldenv", "fldcw", "fstenv", "fstcw", - "fiadd", "fimul", "ficom", "ficomp", "fisub", "fisubr", "fidiv", "fidivr", - "fild", NULL, "fist", "fistp", NULL, "fld", NULL, "fstp", - "fadd", "fmul", "fcom", "fcomp", "fsub", "fsubr", "fdiv", "fdivr", - "fld", NULL, "fst", "fstp", "frstor", NULL, "fsave", "fstsw", - "fiadd", "fimul", "ficom", "ficomp", "fisub", "fisubr", "fidiv", "fidivr", - "fild", NULL, "fist", "fistp", "fbld", "fild", "fbstp", "fistp", -}; - -static char *str1_d8[] = -{ - "fadd", "fmul", "fcom", "fcomp", "fsub", "fsubr", "fdiv", "fdivr", - "fld", "fxch", "\0\0", NULL, "\0\10", "\0\20", "\0\30", "\0\40", - NULL, NULL, NULL, NULL, NULL, "\0\50", NULL, NULL, - NULL, NULL, NULL, NULL, "\0\60", NULL, NULL, NULL, - "fadd", "fmul", NULL, NULL, "fsubr", "fsub", "fdivr", "fdiv", - "ffree", NULL, "fst", "fstp", "fucom", "fucomp", NULL, NULL, - "faddp", "fmulp", NULL, "\0\70", "fsubrp", "fsubp", "fdivrp", "fdivp", - NULL, NULL, NULL, NULL, "\0\100", NULL, NULL, NULL, -}; - -static unsigned char size_d8[] = -{ - 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 14-28, 2, 14-28, 2, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 0, 10, 0, 10, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 94-108, 0, 94-108, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 10, 8, 10, 8, -}; - -static char *sstr_d8[] = -{ - "fnop", NULL, NULL, NULL, /* D9D0 */ - NULL, NULL, NULL, NULL, - "fchs", "fabs", NULL, NULL, /* D9E0 */ - "ftst", "fxam", NULL, NULL, - "fld1", "fldl2t", "fldl2e", "fldpi", /* D9E8 */ - "fldlg2", "fldln2", "fldz", NULL, - "f2xm1", "fyl2x", "fptan", "fpatan", /* D9F0 */ - "fxtract", "fprem1", "fdecstp", "fincstp", - "fprem", "fyl2xp1", "fsqrt", "fsincos", /* D9F8 */ - "frndint", "fscale", "fsin", "fcos", - NULL, "fucompp", NULL, NULL, /* DAE8 */ - NULL, NULL, NULL, NULL, - "feni", "fdisi", "fclex", "finit", /* DBE0 */ - "fsetpm", NULL, NULL, NULL, - NULL, "fcompp", NULL, NULL, /* DED8 */ - NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, /* DFE0 */ - "fstsw\tax", NULL, NULL, NULL, -}; - -static char *str_e0[] = -{ - "loopnz\t", "loopz\t", "loop\t", "jcxz\t", - "in\t", "in\t", "out\t", "out\t", -}; - -static char *str_e8[] = -{ - "call\t", "jmp\t", "jmp\t", "jmp\t", - "in\t", "in\t", "out\t", "out\t", -}; - -static char *str_f0[] = -{ - "lock\t", "db\tf1", "repnz\t", "repz\t", - "hlt", "cmc", - /* other 2 from sstr_f0 */ -}; - -static char *sstr_f0[] = -{ - "test\t", fishy, "not\t", "neg\t", - "mul\t", "imul\t", "div\t", "idiv\t", -}; - -static char *str_f8[] = -{ - "clc", "stc", "cli", "sti", - "cld", "std", - /* other 2 from sstr_f8 */ -}; - -static char *sstr_f8[] = -{ - "inc\t", "dec\t", "call\t", "call\tfar ", - "jmp\t", "jmp\tfar ", "push\t", "???\t", -}; - -static int data_seg; /* data segment (munged name for asld) */ -static unsigned hasize; /* half address size in bits */ -static unsigned hdefsize; -static unsigned hosize; /* half operand size in bits */ - /* for easy index into reg tables */ -static opcode_pt mod; -static off_t offtable[2]; -static off_t *offptr; -static off_t *off1ptr; -static opcode_pt reg; -static opcode_pt rm; - -static su8_pt get8s() -{ - su8_pt got; - - if ((got = get8()) > MAX_SIGNED_CHAR) - got -= (MAX_UNSIGNED_CHAR + 1); - return got; -} - -static void getmodregrm() -{ - opcode_pt modregrm; - - modregrm = get8(); - mod = modregrm & MOD_MASK; - reg = (modregrm & REG_MASK) >> REG_SHIFT; - rm = (modregrm & RM_MASK) >> RM_SHIFT; -} - -static void i_00_to_3f(opc) -opcode_pt opc; -{ - opcode_pt sub; - - if (opc == 15) - pagef(); - else if ((sub = opc & 7) >= 6) - { - outustr((sstr_00_to_3f - 6)[((opc >> 2) & 0x0E) + sub]); - if (!(opc & 1)) - data_seg = opc; - } - else - { - oututstr(str_00_to_3f[(opc >> 3) & 7]); - if (sub == 4) - { - outustr(genreg[0]); - outcomma(); - Ib(); - } - else if (sub == 5) - { - outax(); - outcomma(); - Iv(); - } - else - outad(sub); - } -} - -static void i_40_to_5f(opc) -opcode_pt opc; -{ - outustr(str_40_to_5f[(opc >> 3) & 3]); - outustr(genreg[hosize + (opc & 7)]); -} - -static void i_60_to_6f(opc) -opcode_pt opc; -{ -/* most for 386, some for 286 */ - - outustr((str_60_to_6f - 0x60)[opc]); - switch (opc) - { - case 0x60: - case 0x61: - if (hosize == 16) - outwsize(); - break; - case 0x62: - GvMa(); - break; - case 0x63: - EwRw(); - break; - case 0x64: - case 0x65: - data_seg = opc; - break; - case 0x66: - hosize = (16 + 8) - hdefsize; - break; - case 0x67: - hasize = (16 + 8) - hdefsize; - break; - case 0x68: - outword(); - Iv(); - break; - case 0x6A: - outword(); - outimmed(SIGNBIT | WORDBIT); - break; - case 0x69: - GvEv(); - outcomma(); - Iv(); - break; - case 0x6B: - GvEv(); - outcomma(); - outimmed(SIGNBIT | WORDBIT); - break; - case 0x6D: - case 0x6F: - outwsize(); - break; - } -} - -static void i_70_to_7f(opc) -opcode_pt opc; -{ - outustr("j"); - oututstr((str_flags - 0x70)[opc]); - Jb(); -} - -static void i_80(opc) -opcode_pt opc; -{ - if (opc >= 4) - { - outustr(opc >= 6 ? "xchg\t" : "test\t"); - outad(opc); - } - else - { - getmodregrm(); - oututstr(str_00_to_3f[reg]); - outbwptr(opc); - outea(opc); - outcomma(); - outimmed(opc); -#ifdef SIGNED_LOGICALS - if (opc & SIGNBIT && (reg == 1 || reg == 4 || reg == 6)) - /* and, or and xor with signe extension are not documented in some - * 8086 and 80286 manuals, but make sense and work - */ - outfishy(); -#endif - } -} - -static void i_88(opc) -opcode_pt opc; -{ - if (opc < 4) - { - outustr(movtab); - outad(opc); - } - else if (opc == 5) - { - oututstr("lea"); - GvM(); - } - else if (opc == 7) - { - oututstr("pop"); - getmodregrm(); - outwptr(); - Ev(); - if (reg != 0) - outfishy(); - } - else - { - getmodregrm(); - outustr(movtab); - if (!(opc & TOREGBIT)) - { - Ev(); - outcomma(); - } - outustr(segreg[reg]); - if (opc & TOREGBIT) - { - outcomma(); - Ev(); - } - } -} - -static void i_90(opc) -opcode_pt opc; -{ - if (opc == 0) - outustr("nop"); - else - { - outustr("xchg\t"); - outax(); - outcomma(); - outustr(genreg[hosize + opc]); - } -} - -static void i_98(opc) -opcode_pt opc; -{ - outustr((str_98 - 8)[opc + hosize]); - if (opc == 2) - outsegpc(); -} - -static void i_a0(opc) -opcode_pt opc; -{ - outustr(str_a0[opc]); - if (opc < 4) - { - mod = MEM0_MOD; /* fake */ - reg = 0; /* fake ax */ - if (hasize == 16) - rm = 5; /* fake [d16] */ - else - rm = 6; /* fake [d32] */ - outad1(opc ^ TOREGBIT); - } - else if (opc & 1) - outwsize(); -} - -static void i_a8(opc) -opcode_pt opc; -{ - outustr(str_a8[opc]); - if (opc < 2) - { - outalorx(opc); - outcomma(); - outimmed(opc); - } - else if (opc & 1) - outwsize(); -} - -static void i_b0(opc) -opcode_pt opc; -{ - outustr(movtab); - outustr(genreg[opc]); - outcomma(); - Ib(); -} - -static void i_b8(opc) -opcode_pt opc; -{ - outustr(movtab); - outustr(genreg[hosize + opc]); - outcomma(); - Iv(); -} - -static void i_c0(opc) -opcode_pt opc; -{ - outustr(str_c0[opc]); - if (opc >= 6) - { - getmodregrm(); - outbwptr(opc); - outea(opc); - outcomma(); - outimmed(opc & WORDBIT); - if (reg != 0) - /* not completely decoded (like DEBUG) */ - outfishy(); - } - else if (opc >= 4) - GvMp(); - else if (opc == 2) - Iv(); - else if (opc < 2) - shift(opc); -} - -static void i_c8(opc) -opcode_pt opc; -{ - outustr(str_c8[opc]); - if (opc == 0) - { - Iw(); - outcomma(); - Ib(); - } - if (opc == 2) - Iv(); - else if (opc == 5) - Ib(); - else if (opc == 7 && hosize == 16) - outwsize(); -} - -static void i_d0(opc) -opcode_pt opc; -{ - opcode_pt aabyte; - - if (opc < 4) - shift(opc | 0xD0); - else - { - outustr((str_d0 - 4)[opc]); - if (opc < 6 && (aabyte = get8()) != 0x0A) - { - outtab(); - outh8(aabyte); - outfishy(); - } - } -} - -static void i_d8(opc) -opcode_pt opc; -{ - opcode_pt esc; - char *str; - - getmodregrm(); - esc = (opc << 3) | reg; - if ((str = (mod == REG_MOD ? str1_d8 : str_d8)[esc]) == NULL) - { -escape: - oututstr("esc"); - outh8(esc); - outcomma(); - outea(0); - return; - } - if (*str == 0) - { - str = sstr_d8[str[1] + rm]; - if (str == NULL) - goto escape; - outustr(str); - return; - } - outustr(str); - outtab(); - if (mod == REG_MOD) - { - if (opc == 0 && reg != 2 && reg != 3) - outustr("st,"); - outf1(); - if (opc == 4 || opc == 6) - outustr(",st"); - return; - } - switch(size_d8[esc]) - { - case 4: - outustr("d"); - case 2: - outwptr(); - break; - case 8: - outustr("q"); - outwptr(); - break; - case 10: - outustr("t"); - outbptr(); - break; - } - outea(opc); -} - -static void i_e0(opc) -opcode_pt opc; -{ - outustr(str_e0[opc]); - if (opc < 4) - Jb(); - else if (opc < 6) - { - outalorx(opc); - outcomma(); - Ib(); - } - else - { - Ib(); - outcomma(); - outalorx(opc); - } -} - -static void i_e8(opc) -opcode_pt opc; -{ - outustr(str_e8[opc]); - if (opc < 2) - Jv(); - else if (opc == 2) - outsegpc(); - else if (opc == 3) - Jb(); - else - { - if (opc & TOREGBIT) - { - outustr(genreg[10]); - outcomma(); - outalorx(opc); - } - else - { - outalorx(opc); - outcomma(); - outustr(genreg[10]); - } - } -} - -static void i_f0(opc) -opcode_pt opc; -{ - if (opc < 6) - outustr(str_f0[opc]); - else - { - getmodregrm(); - outustr(sstr_f0[reg]); - outbwptr(opc); - outea(opc); - if (reg == 0) - { - outcomma(); - outimmed(opc & WORDBIT); - } - } -} - -static void i_f8(opc) -opcode_pt opc; -{ - if (opc < 6) - outustr(str_f8[opc]); - else - { - getmodregrm(); - if (opc == 6 && reg >= 2) - outustr("fishy\t"); - else - outustr(sstr_f8[reg]); - outbwptr(opc); - outea(opc); - } -} - -static void outad(opc) -opcode_pt opc; -{ - getmodregrm(); - outad1(opc); -} - -static void outad1(opc) -opcode_pt opc; -{ - if (!(opc & TOREGBIT)) - { - outea(opc); - outcomma(); - } - if (opc & WORDBIT) - Gv1(); - else - outustr(genreg[reg]); - if (opc & TOREGBIT) - { - outcomma(); - outea(opc); - } -} - -static void outalorx(opc) -opcode_pt opc; -{ - if (opc & WORDBIT) - outax(); - else - outustr(genreg[0]); -} - -static void outax() -{ - outustr(genreg[hosize]); -} - -static void outbptr() -{ - outustr("byte ptr "); -} - -static void outbwptr(opc) -opcode_pt opc; -{ - if (mod != REG_MOD) - { - if (opc & WORDBIT) - outwptr(); - else - outbptr(); - } -} - -static void outea(wordflags) -opcode_pt wordflags; -{ - reg_pt base; - reg_pt index; - opcode_pt ss; - opcode_pt ssindexbase; - - if (mod == REG_MOD) - outustr(genreg[hosize * (wordflags & WORDBIT) + rm]); - else - { - outbyte(LINDIRECT); - if (hasize == 16) - { - if (rm == 4) - { - base = (ssindexbase = get8()) & BASE_MASK; - if (mod == MEM0_MOD && base == 5) - outgetaddr(); - else - outustr((genreg + 16)[base]); - ss = (ssindexbase & SS_MASK) >> SS_SHIFT; - if ((index = (ssindexbase & INDEX_MASK) >> INDEX_SHIFT) != 4) - { - outbyte('+'); - outustr((genreg + 16)[index]); - outstr("\0\0\0*2\0*4\0*8\0" + (3 * ss)); - } - } - else if (mod == MEM0_MOD && rm == 5) - outgetaddr(); - else - outustr((genreg + 16)[rm]); - } - else if (mod == MEM0_MOD && rm == 6) - outgetaddr(); - else - outustr(indreg[rm]); - if (mod == MEM1_MOD) - /* fake sign extension to get +- */ - outimmed(SIGNBIT | WORDBIT); - else if (mod == MEM2_MOD) - { - outbyte('+'); - out32offset(); - } - outbyte(RINDIRECT); - if (hasize == 16 && rm == 4 && index == 4 && ss != 0) - outfishy(); - } -} - -static void outf1() -{ - outustr("st("); - outbyte((int) (rm + '0')); - outbyte(')'); -} - -static void out32offset() -{ - off_t off; - - if (hasize == 16) - off = get32(); - else - outfishy(); - - outh32(off); -} - -static void outfishy() -{ - outustr("\t???"); -} - -static void outgetaddr() -{ - off_t off; - - if (hasize == 16) - off = get32(); - else - off = get16(); - - if ( finds_data(off,data_seg) ) - *offptr++ = off; - else if (hasize == 16) - outh32(off); - else - outh16((u16_t) off); -} - -static void outimmed(signwordflag) -opcode_pt signwordflag; -{ - su8_pt byte; - - if (signwordflag & WORDBIT) - { - if (signwordflag & SIGNBIT) - { - if ((byte = get8s()) < 0) - { - outbyte('-'); - byte = -byte; - } - else - outbyte('+'); - outh8((u8_t) byte); - } - else - Iv(); - } - else - Ib(); -} - -static void outpc(pc) -off_t pc; -{ - if (hosize == 8) - pc = (u16_t) pc; - - if ( finds_pc(pc) ) - *offptr++ = pc; - else if (hosize == 16) - outh32(pc); - else - outh16((u16_t) pc); -} - -static void outsegpc() -{ - off_t oldbase; - off_t pc; - - if (hosize == 16) - pc = get32(); - else - pc = get16(); - oldbase = uptr.base; - outh16((u16_t) (uptr.base = get16())); /* fake seg for lookup of pc */ - /* TODO - convert to offset in protected mode */ - outbyte(':'); - outpc(pc); - uptr.base = oldbase; -} - -static void oututstr(s) -char *s; -{ - outustr(s); - outtab(); -} - -static void outword() -{ - outustr("dword " + ((16 - hosize) >> 3)); -} - -static void outwptr() -{ - outword(); - outustr("ptr "); -} - -static void outwsize() -{ - if (hosize == 16) - outustr("d"); - else - outustr("w"); -} - -static void pagef() -{ - opcode_pt opc; - int regbad; - - if ((opc = get8()) <= 1 || opc == 0xBA) - { - if (opc == 0xBA) - opc = 16; - else - opc *= 8; - getmodregrm(); - outustr(ssstr_0f[opc += reg]); - if (opc < 6 || opc == 12 || opc == 14) - Ew(); - else if (opc >= 8 && opc < 13) - Ms(); - else if (opc >= 20) - { - outbwptr(WORDBIT); - EvIb(); - } - } - else if (opc < 4) - { - oututstr("lar\0lsl" + 4 * (opc - 2)); - GvEw(); - } - else if (opc == 5) - { - outustr("loadall"); - outfishy(); - } - else if (opc == 6) - outustr("clts"); - else if (opc < 0x20) - outstr(fishy); - else if (opc < 0x27 && opc != 0x25) - { - outustr(movtab); - getmodregrm(); - hosize = 16; - if (!(opc & TOREGBIT)) - { - Ev(); /* Rd() since hosize is 16 */ - outcomma(); - } - regbad = FALSE; - if (opc & 1) - { - outustr("dr"); - if (reg == 4 || reg == 5) - regbad = TRUE; - } - else if (opc < 0x24) - { - outustr("cr"); - if (reg >= 4 || reg == 1) - regbad = TRUE; - } - else - { - outustr("tr"); - if (reg < 6) - regbad = TRUE; - } - outbyte((int) (reg + '0')); - if (opc & TOREGBIT) - { - outcomma(); - Ev(); - } - if (regbad || mod != REG_MOD) - outfishy(); - } - else if (opc < 0x80) - outstr(fishy); - else if (opc < 0x90) - { - outustr("j"); - oututstr((str_flags - 0x80)[opc]); - Jv(); - } - else if (opc < 0xA0) - { - outustr("set"); - oututstr((str_flags - 0x90)[opc]); - getmodregrm(); - outbwptr(0); - Eb(); - } - else if (opc < 0xC0) - { - outustr((sstr_0f - 0xA0)[opc]); - switch (opc) - { - case 0xA3: - case 0xAB: - case 0xB3: - case 0xBB: - EvGv(); - break; - case 0xA4: - case 0xAC: - EvGv(); - outcomma(); - Ib(); - break; - case 0xA5: - case 0xAD: - EvGv(); - outcomma(); - CL(); - break; - case 0xAF: - case 0xBC: - case 0xBD: - GvEv(); - break; - case 0xB2: - case 0xB4: - case 0xB5: - GvMp(); - break; - case 0xB6: - case 0xBE: - Gv(); - outcomma(); - outbwptr(opc); - Eb(); - break; - case 0xB7: - case 0xBF: - Gv(); - outcomma(); - hosize = 8; /* done in Ew(), but too late */ - outbwptr(opc); - Ew(); - break; - } - } - else - outstr(fishy); -} - -static int puti() -{ - static int hadprefix; - opcode_pt opcode; - -more: - offptr = offtable; - opcode = get8(); - if (!hadprefix) - { - data_seg = DSEG; - hdefsize = 8; - if (bits32) - hdefsize = 16; - hosize = - hasize = hdefsize; - } - (*optable[opcode >> 3])(opcode < 0x80 ? opcode : opcode & 7); - if (offptr > offtable) - { - if (stringtab() >= 31) - { - outspace(); - outspace(); - } - else - while (stringtab() < 32) - outtab(); - outbyte(';'); - for (off1ptr = offtable; off1ptr < offptr; ++off1ptr) - { - outspace(); - if (*off1ptr < 0x10000) - outh16((u16_t) *off1ptr); - else - outh32(*off1ptr); - } - offptr = offtable; - } - if ((opcode & 0xE7) == 0x26 || - opcode >= 0x64 && opcode < 0x68 || - opcode == 0xF0 || opcode == 0xF2 || opcode == 0xF3) - /* not finished instruction for 0x26, 0x2E, 0x36, 0x3E seg overrides - * and 0x64, 0x65 386 seg overrides - * and 0x66, 0x67 386 size prefixes - * and 0xF0 lock, 0xF2 repne, 0xF3 rep - */ - { - hadprefix = TRUE; - goto more; /* TODO - print prefixes better */ - return FALSE; - } - hadprefix = FALSE; - return TRUE; -} - -static void shift(opc) -opcode_pt opc; -{ - getmodregrm(); - oututstr(sstr_d0[reg]); - outbwptr(opc); - outea(opc); - outcomma(); - if (opc < 0xD0) - Ib(); - else if (opc & 2) - CL(); - else - outbyte('1'); -} - -static void checkmemory() -{ - if (mod == REG_MOD) - outfishy(); -} - -static void CL() -{ - outustr(genreg[1]); -} - -static void Eb() -{ - outea(0); -} - -static void Ev() -{ - outea(WORDBIT); -} - -static void EvGv() -{ - getmodregrm(); - Ev(); - outcomma(); - Gv1(); -} - -static void EvIb() -{ - Ev(); - outcomma(); - Ib(); -} - -static void Ew() -{ - hosize = 8; - Ev(); -} - -static void EwRw() -{ - hosize = 8; - EvGv(); -} - -static void Gv() -{ - getmodregrm(); - Gv1(); -} - -static void Gv1() -{ - outustr(genreg[hosize + reg]); -} - -static void GvEv() -{ - Gv(); - outcomma(); - Ev(); -} - -static void GvEw() -{ - Gv(); - outcomma(); - Ew(); -} - -static void GvM() -{ - GvEv(); - checkmemory(); -} - -static void GvMa() -{ - GvM(); -} - -static void GvMp() -{ - GvM(); -} - -static void Ib() -{ - outh8(get8()); -} - -static void Iw() -{ - outh16(get16()); -} - -static void Iv() -{ - if (hosize == 16) - outh32(get32()); - else - Iw(); -} - -static void Jb() -{ - off_t pcjump; - - pcjump = get8s(); - outpc(pcjump + uptr.off); -} - -static void Jv() -{ - off_t pcjump; - - if (hosize == 16) - pcjump = get32(); - else - pcjump = (su16_t) get16(); - outpc(pcjump + uptr.off); -} - -static void Ms() -{ - Ev(); - checkmemory(); -} - -/********************* DASM ******************************/ - -long dasm( addr, count, symflg ) -long addr; -int count; -int symflg; -{ - bits32 = TRUE; /* Set mode */ - uptr.off = addr; - uptr.base = 0; /* not known */ - while ( count-- != 0 && show1instruction() ) - ; -} - - -static int show1instruction() -{ - register int column; - int idone; - static char line[81]; - int maxcol; - struct address_s newuptr; - struct address_s olduptr; - - outbyte('\r'); - do - { - if ( text_symbol(uptr.off) ) { - outbyte(':'); - outbyte('\n'); - } - olduptr = uptr; - openstring(line); - idone = puti(); - line[stringpos()] = 0; - closestring(); - newuptr = uptr; - uptr = olduptr; - column = outssegaddr(&uptr); - while (uptr.off != newuptr.off) - { - outh8(get8()); - column += 2; - } - maxcol = bits32 ? 24 : 16; - while (column < maxcol) - { - outtab(); - column += 8; - } - outtab(); - outstr(line); - outbyte('\n'); - } - while (!idone); /* eat all prefixes */ - return TRUE; -} - - -static u8_t get8() -{ -/* get 8 bits current instruction pointer and advance pointer */ - - u8_t temp; - - temp = peek_byte(uptr.off + uptr.base); - ++uptr.off; - return temp; -} - -static u16_t get16() -{ -/* get 16 bits from current instruction pointer and advance pointer */ - - u16_t temp; - - temp = peek_word(uptr.off + uptr.base); - uptr.off += 2; - return temp; -} - -static u32_t get32() -{ -/* get 32 bits from current instruction pointer and advance pointer */ - - u32_t temp; - - temp = peek_dword(uptr.off + uptr.base); - uptr.off += 4; - return temp; -} - - -static int outsegaddr(addr) -struct address_s *addr; -{ -/* print segmented address */ - - int bytes_printed; - - bytes_printed = 2; - bytes_printed = outsegreg(addr->base); - if (bytes_printed > 4) - outbyte('+'); - else - outbyte(':'); - ++bytes_printed; - if (addr->off >= 0x10000) - { - outh32(addr->off); - return bytes_printed + 8; - } - outh16((u16_t) addr->off); - return bytes_printed + 4; -} - -static int outssegaddr(addr) -struct address_s *addr; -{ -/* print 32 bit segmented address and 2 spaces */ - - int bytes_printed; - - bytes_printed = outsegaddr(addr); - outspace(); - outspace(); - return bytes_printed + 2; -} - -static u8_t peek_byte(addr) -off_t addr; -{ - return (u8_t) peek_dword(addr) & 0xFF; /* 8 bits only */ -} - -static u16_t peek_word(addr) -off_t addr; -{ - return (u16_t) peek_dword(addr); -} diff --git a/commands/mdb/mdbexp.c b/commands/mdb/mdbexp.c deleted file mode 100644 index 1d16cb7ea..000000000 --- a/commands/mdb/mdbexp.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * mdbexp.c - MINIX expresion parser - * - * Written by Bruce D. Szablak - * - * This free software is provided for non-commerical use. No warrantee - * of fitness for any use is implied. You get what you pay for. Anyone - * may make modifications and distribute them, but please keep this header - * in the distribution. - */ - -#include "mdb.h" -#include -#include -#include -#include -#include "proto.h" - -static long value(char *s , char **s_p , int *seg_p ); -static long lookup(char *s , char **s_p , int *seg_p ); - -#define idchar(c) (isalpha(c) || isdigit(c) || (c) == '_') - -/* - * Get an expression for mdb - */ -char *getexp(buf, exp_p, seg_p) -char *buf; -int *seg_p; -long *exp_p; -{ - long v = 0L; - - buf = skip(buf); - if ((isalpha(*buf) && (isspace(buf[1]) || buf[1] == ';')) - || *buf == '\n' - || *buf == ';' - || *buf == '/' - || *buf == '!' - || *buf == '?' - || *buf == '@' - || *buf == '#') { - *exp_p = 0L; - return buf; - } - v = value(buf, &buf, seg_p); - buf = skip(buf); - if (*buf == '+') - v += value(skip(buf + 1), &buf, seg_p); - else if (*buf == '-') - v -= value(skip(buf + 1), &buf, seg_p); - *exp_p = v; - return skip(buf); -} - -/* - * Get value - * - * \c escaped characters - * digits number - * $xx registers - * \n 0L - * then calls lookup for symbols - */ -static long value(s, s_p, seg_p) -char *s, **s_p; -int *seg_p; -{ - long k; - - if (*s == '\'') { /* handle character constants here */ - *s_p = s + 2; - return s[1]; - } - if (*s == '-' || isdigit(*s)) - return strtol(s, s_p, 0); - if (*s == '$') { - k = reg_addr(s + 1); - *s_p = s + 3; - return get_reg(curpid, k); - k = reg_addr(s + 1); - *s_p = s + 3; - return get_reg(curpid, k); - } - if (*s == '\n') { - *s_p = s + 1; - return 0L; - } - return lookup(s, s_p, seg_p); -} - -/* - * Lookup symbol - return value - * Handle special cases: _start T: D: S: - * then call symbolvalue() - */ -static long lookup(s, s_p, seg_p) -char *s, **s_p; -int *seg_p; -{ - long value; - char c; - int l; - - for (l = 1; idchar(s[l]); ++l) {} - c = s[l]; - s[l] = 0; - - if (strcmp("_start", s) == 0) { - *seg_p = T; - if (c == ':') c = '+'; - *(*s_p = s + 6) = c; - return st_addr; - } - if (strcmp("T", s) == 0) { - *seg_p = T; - if (c == ':') c = '+'; - *(*s_p = s + 1) = c; - return st_addr; - } - if (strcmp("D", s) == 0) { - *seg_p = D; - if (c == ':') c = '+'; - *(*s_p = s + 1) = c; - return sd_addr; - } - if (strcmp("S", s) == 0) { - *seg_p = S; - if (c == ':') c = '+'; - *(*s_p = s + 1) = c; - return sk_addr; - } - - if ((value = symbolvalue(s, TRUE)) != 0L) { - *seg_p = T; - *(*s_p = s + l) = c; - return value; - } - - if ((value = symbolvalue(s, FALSE)) != 0L) { - *seg_p = D; - *(*s_p = s + l) = c; - return value; - } - - Printf("%s: ", s); - mdb_error("symbol not found\n"); -} - -/* Skip spaces */ -char *skip(s) -register char *s; -{ - while (isspace(*s)) ++s; - return *s ? s : s - 1; -} - diff --git a/commands/mdb/misc.c b/commands/mdb/misc.c deleted file mode 100644 index 8bcaff4aa..000000000 --- a/commands/mdb/misc.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * misc.c for mdb - */ - -#include "mdb.h" -#include -#include -#include -#include -#include -#define ptrace mdbtrace -#include -#include "proto.h" - -static void pr_ascii(long val , int size ); - -/* Print ascii */ -static void pr_ascii(val, size) -long val; -int size; -{ - int i; - int v; - int sh; - -#ifdef BYTES_SWAPPED - sh = 8 * size; -#else - sh = 0; -#endif - - for (i = 0; i < size; i++) { - v = (int) (val >> sh) & 0xFF; -#ifdef BYTES_SWAPPED - sh -= 8; -#else - sh += 8; -#endif - Printf(isprint(v) ? "%c" : "\\%03o", v); - } - Printf("\n"); -} - -/* Dump stack */ -void dump_stack(cnt) -long cnt; -{ - vir_bytes v, vi; - long val, sp; - int num, size, nmode; - - size = INTSIZE; /* size of stack element */ - num = (int) cnt; - if (num <= 0) num = 0; - if (num > sk_size) num = (int) sk_size / size; - nmode = num; /* Save mode */ - - /* Get current SP */ - sp = get_reg(curpid, reg_addr("sp")); - - /* Starting address is top of stack seg -1 */ - vi = (vir_bytes) sk_addr + (vir_bytes) sk_size - size; - - /* Ending address */ - v = (vir_bytes) end_addr; - if (nmode == 0) v = MAX(v, sp); - - Printf("Stack Dump SP=%*lx\nAddr\tHex\tAscii\n", 2 * size, sp); - do { - val = (ptrace(T_GETDATA, curpid, (long) vi, 0L) >> SHIFT(size)) - & MASK(size); - Printf("%*lx\t", 2 * ADDRSIZE, (vi >> SHIFT(ADDRSIZE)) - & MASK(ADDRSIZE)); - Printf("%*lx\t", 2 * size, val); - pr_ascii(val, size); - num -= 1; - vi -= size; - } while (vi >= v && (nmode ? num > 0 : 1)); - -} - - -/* Get file size */ -off_t file_size(fd) -int fd; -{ -struct stat st; - - if(fstat(fd,&st) <0 ) { - Printf("Cannot stat\n"); - return 0L; - } - else - return st.st_size; -} - -/* Print help page */ -void help_page() -{ - outstr("\nHelp for mdb. For more details, type 'command ?'\n"); - outstr("!#\t- Shell escape / Set Variable or register\n"); - outstr("Tt\t- Current call / Backtrace all\n"); - outstr("/nsf\t- Display for n size s with format f\n"); - outstr("Xx [n]\t- Disasm / & display reg for n instructions\n"); - outstr("Rr a\t- Run / with arguments a\n"); - outstr("Cc [n]\t- Continue with current signal / no signal n times\n"); - outstr("Ii [n]\t- Single step with / no signal for n instructions\n"); - outstr("Mm t n\t- Trace until / Stop when modified t type for n instructions\n"); - outstr("k \t- Kill traced process\n"); - outstr("Bb\t- Display / Set Break-pt\n"); - outstr("Dd\t- Delete all / one break-points\n"); - outstr("P\t- Toggle Paging\n"); - outstr("Ll name\t- Log to file name / and to standard output\n"); -#ifdef DEBUG - outstr("Vv\t- Version info / Toggle debug flag\n"); -#else - outstr("V\t- Version info\n"); -#endif - outstr("e [t]\t- List symbols for type t\n"); - outstr("y\t- Print segment mappings\n"); - outstr("s [n]\t- Dump stack for n words\n"); -#if SYSCALLS_SUPPORT - outstr("z [a]\t- Trace syscalls with address a\n"); -#endif - outstr("? \t- Help - this screen\n"); - outstr("@ file\t- Execute commands from file\n"); - outstr("Qq\t- Quit / and kill traced process\n"); -#ifdef DEBUG - outstr("Usage: mdb -x debug-level [-Ll]logfile exec-file core-file @command-file\n"); -#else - outstr("Usage: mdb [-Ll]logfile exec-file core-file @command-file\n"); -#endif - outstr(" mdb [-fc] file\n"); -} - -void version_info() -{ - Printf("\nmdb version %s.%d for Minix", MDBVERSION, MDBBUILD ); - Printf(" %s.%s", OS_RELEASE, OS_VERSION); -#ifdef MINIX_PC -#ifdef __i386 - Printf(" (32-bit)"); -#else - Printf(" (16-bit)"); -#endif -#endif -#ifdef MINIX_ST - Printf("-ST"); -#endif - Printf("\n"); -} - -/* Print help message on command */ -void help_on(h) -int h; -{ - - switch (h) { - case '/': - outstr("
/nsf\t- Display for n items of size s with format f from address\n"); - outstr("\t n defaults to 1\n"); - outstr("\t s defaults to size of int\n"); - outstr("\t can be b for byte h for short l for long\n"); - outstr("\t f defaults to d for decimal\n"); - outstr("\t can be x X o d D c s or u as in printf\n"); - outstr("\t y treat value as address\n"); - outstr("\t i disasm\n"); - break; - case '@': - outstr("@ file\t- Execute commands from file\n"); - break; - case '#': - outstr("#
cs value\t- Set Variable(s) at address to value\n"); - outstr("\t\t\t for c count and size s\n"); - outstr("\t\t\t b for byte h for short or l for long\n"); - outstr("\t\t\t Count or size must be specified\n"); - outstr("# $xx value\t\t- Set register $xx to value\n"); - break; - case 'C': - outstr("C [n]\t- Continue with curent signal n times\n"); - outstr("\t n defaults to 1\n"); - break; - case 'c': - outstr("c [n]\t- Continue with no signal n times\n"); - outstr("\t n defaults to 1\n"); - break; - case 'e': - outstr("e [t]\t- List symbols for type t\n"); - break; - case 's': - outstr("s [n]\t- Dump stack for n words\n"); - outstr("\t n defaults to whole stack\n"); - break; - case 'I': - outstr("I n\t- Single step with signal for n instructions n defaults to 1\n"); - break; - case 'i': - outstr("i n\t- Single step with no signal for n instructions n defaults to 1\n"); - break; - case 'M': - case 'm': - if ( h == 'M') - outstr("
M t n\t- Trace until\n"); - else - outstr("
m t n\t- Stop when\n"); - outstr("\t\t
is modified t type for n instructions\n"); - outstr("\t\tn defaults to 1\n"); - outstr("\t\tb for byte h for short l for long defaults to size of int\n"); - break; - case 'T': - outstr("T\t- Display current call\n"); - break; - case 't': - outstr("t\t- Backtrace all calls\n"); - break; - case '!': - outstr("![command]\t- Shell escape or spawn command\n"); - break; - case 'R': - outstr("R\t- Run the exec-file\n"); - break; - case 'r': - outstr("r [arguments]\t- Run the exec-file with arguments\n"); - break; - case 'k': - outstr("k\t- Kill traced process\n"); - break; - case 'B': - outstr("B\t- Display all the Break points\n"); - break; - case 'b': - outstr("
b [commands]\t- Set Break-pt at address\n"); - outstr("\t\t\t commands will be executed by mdb at break-pt\n"); - break; - case 'D': - outstr("D\t- Delete all break-points\n"); - break; - case 'd': - outstr("
d\t- Delete one break-point at address\n"); - break; - case 'q': - outstr("q\t- Quit mdb (and kill traced program)\n"); - break; - case 'Q': - outstr("Q\t- Quit mdb immediately\n"); - break; - case 'P': - outstr("P\t- Toggle Paging\n"); - outstr("\t Defaults is OFF\n"); - break; - case 'L': - outstr("L name\t- Log to file name\n"); - outstr("L\t- Reset output to standard output\n"); - break; - case 'l': - outstr("l name\t- Log to file name and standard output\n"); - outstr("l\t- Reset output to standard output\n"); - outstr("\t Defaults to none\n"); - break; -#ifdef DEBUG - case 'v': - outstr("v\t- Toggle debug flag\n"); - break; -#endif - case 'V': - outstr("V\t- Print Version Information for mdb\n"); - break; - case 'X': - outstr("
X [n] [offset]\t- Disasm for n instructions\n"); - outstr("\t\t\t Starting at address+offset\n"); - break; - case 'x': - outstr("
x [n] offset\t- Disasm & display registers for n instructions\n"); - outstr("\t\t\t Starting at address+offset\n"); - break; - case 'y': - outstr("y\t- Print segment mappings\n"); - break; -#if SYSCALLS_SUPPORT - case 'z': - outstr("z [address]\t- Trace system calls using address\n"); - outstr("\t\t If the exec-file has symbols, mdb looks for __sendrec\n"); - break; -#endif - default: - Printf("No help on command '%c' is available\n",h); - break; - } -} - diff --git a/commands/mdb/proto.h b/commands/mdb/proto.h deleted file mode 100644 index abdd0f857..000000000 --- a/commands/mdb/proto.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * proto.h for mdb - */ - -/* core.c */ - -void prtmap(void); -unsigned long core_init(char *filename); -unsigned long file_init(char *filename); -long read_core(int req, long addr, long data); - -/* mdb.c */ - -void mdb_error(char *s); -long breakpt(long addr , char *cmd ); -void tstart(int req , int verbose , int val , int cnt ); - -/* io.c */ - -char *get_cmd(char *cbuf, int csize); -void openin(char *s ); -void logging(int c, char *name); -void do_error(char *message); -int Printf(const char *format, ...); -void outbyte(int byte); -void outcomma(void); -void outh8(unsigned num); -void outh16(unsigned num); -void outh32(unsigned num); -void outh4(unsigned num); -void outspace(void); -void outstr(char *s); -void outtab(void); -void outustr(char *s); -void closestring(void); -int mytolower(int ch); -void openstring(char *string); -int stringpos(void); -int stringtab(void); - -/* mdbdis86.c */ - -long dasm(long addr, int count, int symflg); - -/* mdbexp.c */ - -char *getexp(char *buf, long *exp_p, int *seg_p); -char *skip(char *s); - -/* kernel.c */ -long get_reg(int pid, long k); -void set_reg(int pid, long k, long value); -long reg_addr(char *s); -int disp_regs(void); -int outsegreg(off_t num); -void update(void); -void disp_maps(void); - -/* misc.c */ - -void dump_stack(long count); -off_t file_size(int fd); -void help_on(int h); -void version_info(void); -void help_page(void); - -#if EXTRA_SYMBOLS -/* gnu_sym.c */ -void gnu_init(char *filename); -long gnu_symbolvalue(char *name, int is_text ); -void gnu_symbolic(off_t value, int separator); -void gnu_listsym(int tchar); -int gnu_text_symbol(off_t value); -int gnu_finds_pc(off_t pc); -int gnu_finds_data(off_t off, int data_seg); -#endif /* EXTRA_SYMBOLS */ - -/* sym.c */ -void syminit(char *filename); -long symbolvalue(char *name, int is_text ); -void printhex(off_t v); -void symbolic(off_t value, int separator); -void listsym(char *cmd); -int text_symbol(off_t value); -int finds_pc(off_t pc); -int finds_data(off_t off, int data_seg); - -/* trace.c */ -long mdbtrace(int req, int pid, long addr, long data); -u32_t peek_dword(off_t addr); - -#if SYSCALLS_SUPPORT - -/* syscalls.c */ -void start_syscall(long addr); -void do_syscall(long addr); - -/* decode.c */ -void decode_message(unsigned addr); -void decode_result(void); - -/* ioctl.c */ -void decode_ioctl(int sr, message *m); - -#endif /* SYSCALLS_SUPPORT */ diff --git a/commands/mdb/sample b/commands/mdb/sample deleted file mode 100644 index b04edf9e1..000000000 --- a/commands/mdb/sample +++ /dev/null @@ -1,9 +0,0 @@ -r 10 -y -__sendrec b -B -c -x 2 -t -q - diff --git a/commands/mdb/sym.c b/commands/mdb/sym.c deleted file mode 100644 index 2c2b14941..000000000 --- a/commands/mdb/sym.c +++ /dev/null @@ -1,517 +0,0 @@ -/* - * sym.c for mdb - */ - -#include "mdb.h" -#include -#include -#include -#include -#include -#include -#include "proto.h" - -struct symtab_s -{ - struct nlist *start; - struct nlist *end; - int text; - int data; - unsigned nsym; -}; - -static struct symtab_s symtab; -static int type_of_exec; - -static int check_exec(struct exec *hdr); -static void sortsyms(struct nlist *array , struct nlist *top ); -static int symeq(char *t , struct nlist *sp ); -static int symprefix(char *t , struct nlist *sp ); -static struct nlist *findsname(char *name, int is_text, int allflag); -static void outsym(struct nlist *sp, off_t off); -static struct nlist *findsval(off_t value, int where); - -void syminit( filename ) -char *filename; -{ - int fd; - struct exec header; - register struct symtab_s *tp; - - tp = &symtab; - if ( (fd = open( filename, O_RDONLY)) < 0) { - fprintf(stderr, "Couldn't open %s.\n", filename); - perror(filename); - exit(1); - } - - if( read( fd, (char *) &header, sizeof header ) != sizeof header ) - { - fprintf(stderr, "Couldn't read %d bytes from %s.\n", sizeof(header), filename); - close( fd ); - exit(1); - } - type_of_exec = check_exec(&header); - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS) { - close(fd); - gnu_init(filename); - return; - } -#endif - - /* For MINIX EXEC */ - if ( lseek( fd, A_SYMPOS( header ), 0 ) != A_SYMPOS( header ) ) - { - do_error( "mdb - reading header" ); - close( fd ); - exit(1); - } - if ( (int) header.a_syms < 0 || - (unsigned) header.a_syms != header.a_syms || - (tp->start = (struct nlist *) malloc( (unsigned) header.a_syms )) - == (struct nlist *) NULL && - header.a_syms != 0 ) - { - Printf("mdb: no room for symbol table" ); - close( fd ); - return; - } - if ( read( fd, (char *) tp->start, (int) header.a_syms ) < 0 ) - { - do_error( "mdb - reading symbol table" ); - close( fd ); - return; - } - close( fd ); - tp->nsym = (unsigned) header.a_syms / sizeof (struct nlist); - tp->end = tp->start + tp->nsym; - tp->text = 0x07; - tp->data = 0x0F; - - /* sort on value only, name search not used much and storage a problem */ - Printf("Sorting %d MINIX symbols ....", tp->nsym ); - sortsyms( tp->start, tp->end ); - Printf("\n"); -} - -/* Check exec file - * return type of exec - * or exit - */ -static int check_exec(hdr) -struct exec *hdr; -{ -long magic; - - /* Check MAGIC number */ - if (hdr->a_magic[0] != A_MAGIC0 || hdr->a_magic[1] != A_MAGIC1) { - Printf("mdb: invalid magic number in exec header - %02x %02x\n", - hdr->a_magic[0], - hdr->a_magic[1]); - exit(1); - } - - /* Check CPU */ -#if defined(__i386__) - if (hdr->a_cpu != A_I80386) -#endif - { - Printf("mdb: invalid cpu in exec header - %04x\n", - hdr->a_cpu); - exit(1); - } - - is_separate = FALSE; -#ifdef MINIX_PC - if (hdr->a_flags & A_SEP) - is_separate = TRUE; -#endif - -#if GNU_SUPPORT - if (hdr->a_flags & A_NSYM) - return GNU_SYMBOLS; -#endif - -/* - * A_EXEC is not being set by current cc - * It was set in Minix 1.5.0 - */ -#if 0 - /* Check flags - separate I & D or not */ - if (hdr->a_flags & A_EXEC) - is_separate = FALSE; - else { - Printf("mdb: object file not exec %04x\n", - hdr->a_flags); - exit(1); - } -#endif - return MINIX_SYMBOLS; -} - - -long symbolvalue( name, is_text ) -char *name; -int is_text; -{ -register struct nlist *sp; - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS ) - return gnu_symbolvalue( name, is_text ); -#endif - - /* For MINIX EXEC */ - sp = findsname(name, is_text, 0); - if (sp != NULL) - return sp->n_value; - else - return 0L; -} - -static struct nlist *findsname( name, is_text, allflag ) -char *name; -int is_text; -int allflag; -{ - char *s; - unsigned char sclass; - int schar; - char *send; - register struct nlist *sp; - register struct symtab_s *tp; - - tp = &symtab; - if ( allflag ) - { - /* find and print all matching symbols */ - for ( sp = tp->start; sp < tp->end; ++sp ) - { - if ( symprefix( name, sp ) ) - { - sp = sp; - for ( s = sp->n_name, send = s + sizeof sp->n_name; - *s != 0 && s < send; ++s ) - outbyte( *s ); - for ( ; s <= send; ++s ) - outspace(); - switch( sp->n_sclass & N_SECT ) - { - case N_ABS: schar = 'a'; break; - case N_TEXT: schar = 't'; break; - case N_DATA: schar = 'd'; break; - case N_BSS: schar = 'b'; break; - default: schar = '?'; break; - } - if ( (sp->n_sclass & N_CLASS) == C_EXT && schar != '?' ) - schar += 'A' - 'a'; - outbyte( schar ); - outspace(); - outh32( sp->n_value ); - outbyte('\n'); - } - } - } - else - { - /* find symbol by dumb linear search */ - for ( sp = tp->start; sp < tp->end; ++sp ) - { - sclass = sp->n_sclass & N_SECT; - if ( (is_text && sclass == N_TEXT || - !is_text && (sclass == N_DATA || sclass == N_BSS)) && - symeq( name, sp ) ) - return sp; - } - } - return NULL; -} - -static struct nlist *findsval( value, where ) -off_t value; -int where; -{ - int left; - int middle; - int right; - unsigned char sclass; - register struct nlist *sp; - register struct symtab_s *tp; - - tp = &symtab; - - /* find last symbol with value <= desired one by binary search */ - for ( left = 0, right = tp->nsym - 1; left <= right; ) - { - middle = (left + right) / 2; - sp = tp->start + middle; - if ( value < sp->n_value ) - right = middle - 1; - else - left = middle + 1; - } - if ( right >= 0 ) - /* otherwise tp->start + right may wrap around to > tp->start !! */ - for ( sp = tp->start + right; sp >= tp->start; --sp ) - { - if ( (sp->n_sclass & N_CLASS) != C_EXT ) continue; - sclass = sp->n_sclass & N_SECT; - if ( (where == CSEG && sclass == N_TEXT || - where != CSEG && (sclass == N_DATA || sclass == N_BSS)) ) - return sp; - } - return NULL; -} - - -void printhex(v) -off_t v; -{ - if ( v >= 65536L ) - outh32( v ); - else if ( v >= 256 ) - outh16( (u16_t) v ); - else - outh8( (u8_t) v ); -} - - -static void outsym( sp, off ) -struct nlist *sp; -off_t off; -{ - register char *s; - char *send; - - for ( s = sp->n_name, send = s + sizeof sp->n_name; *s != 0 && s < send; ++s ) - outbyte( *s ); - if ( (off -= sp->n_value) != 0 ) - { - outbyte( '+' ); - printhex(off); - } -} - -/* shell sort symbols on value */ - -static void sortsyms( array, top ) -struct nlist *array; -struct nlist *top; -{ - int gap; - int i; - int j; - register struct nlist *left; - register struct nlist *right; - struct nlist swaptemp; - int size; - - size = top - array; - /* choose gaps according to Knuth V3 p95 */ - for ( gap = 1, i = 4; (j = 3 * i + 1) < size; gap = i, i = j ) - ; - do - { - for ( j = gap; j < size; ++j ) - for ( i = j - gap; i >= 0; i -= gap ) - { - left = array + i; - right = array + (i + gap); - if ( (off_t) left->n_value <= - right->n_value ) - break; - swaptemp = *left; - *left = *right; - *right = swaptemp; - } - } - while ( (gap /= 3) != 0 ); -} - -void symbolic( value, separator ) -off_t value; -int separator; -{ - register struct nlist *sp; - long off; - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS ) { - gnu_symbolic( value, separator ); - return; - } -#endif - - /* For MINIX EXEC */ - - if (value < st_addr || value > end_addr) { - outstr("0x"); - printhex(value); - outbyte(separator); - return; - } - - if ( (sp = findsval( value, CSEG )) != NULL ) - { - outsym( sp, value ); - } - else if ( (sp = findsval( value, DSEG )) != NULL ) - { - outsym( sp, value ); - } - else - { - outstr("_start"); - off = value - st_addr; - if ( off != 0 ) - { - outbyte( '+' ); - printhex(off); - } - } - outbyte( separator ); -} - - -static int symeq( t, sp ) -register char *t; -struct nlist *sp; -{ - return strncmp( t, sp->n_name, sizeof sp->n_name ) == 0; -} - -static int symprefix( t, sp ) -register char *t; -struct nlist *sp; -{ - register char *s; - char *send; - - for ( ; *t == '_'; ++t ) - ; - for ( s = sp->n_name, send = s + sizeof sp->n_name; - s < send && *s == '_'; ++s ) - ; - return strncmp( s, t, (size_t)(send - s) ) == 0; -} - - - -/* list all symbols - test for selection criteria */ - -void listsym(cmd) -char *cmd; -{ - register struct symtab_s *tp; - register struct nlist *sp; - char *s; - char *send; - char schar; - char tchar; - - /* set selection */ - cmd = skip(cmd+1); - if( *cmd == '\n' || *cmd == ';' ) - tchar = '*'; - else - tchar = *cmd; - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS ) { - gnu_listsym(tchar); - return; - } -#endif - - /* For MINIX EXEC */ - - tp = &symtab; - for ( sp = tp->start; sp < tp->end; ++sp ) - { - switch( sp->n_sclass & N_SECT ) - { - case N_ABS: schar = 'a'; break; - case N_TEXT: schar = 't'; break; - case N_DATA: schar = 'd'; break; - case N_BSS: schar = 'b'; break; - default: schar = '?'; break; - } - - if ( (sp->n_sclass & N_CLASS) == C_EXT && schar != '?' ) - schar += 'A' - 'a'; - - /* check for selection */ - if ( tchar != '*' && schar != tchar) - continue; - - /* print symbol type and value */ - for ( s = sp->n_name, send = s + sizeof sp->n_name; - *s != 0 && s < send; ++s ) outbyte( *s ); - for ( ; s <= send; ++s ) outspace(); - outbyte( schar ); - outspace(); - outh32( sp->n_value ); - outbyte('\n'); - } -} - - -int text_symbol(value) -off_t value; -{ -struct nlist *sp; - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS ) - return gnu_text_symbol(value); -#endif - - if ((sp = findsval(value, CSEG)) != NULL && sp->n_value == value) - { - outsym(sp, value); - return TRUE; - } - else - return FALSE; -} - -int finds_data(off,data_seg) -off_t off; -int data_seg; -{ -struct nlist *sp; - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS ) - return gnu_finds_data(off,data_seg); -#endif - - if ((sp = findsval(off, data_seg)) != NULL) - { - outsym(sp, off); - return TRUE; - } - else - return FALSE; -} - -int finds_pc(pc) -off_t pc; -{ -struct nlist *sp; - -#if EXTRA_SYMBOLS - if ( type_of_exec == GNU_SYMBOLS ) - return gnu_finds_pc(pc); -#endif - - if ((sp = findsval(pc, CSEG)) != NULL) - { - outsym(sp, pc); - return TRUE; - } - else - return FALSE; -} diff --git a/commands/mdb/syscalls.c b/commands/mdb/syscalls.c deleted file mode 100644 index a4fedcac2..000000000 --- a/commands/mdb/syscalls.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * syscall.c for mdb - */ -#include "mdb.h" -#ifdef SYSCALLS_SUPPORT -#include -#include -#include -#include "proto.h" - -#define SYSCALL_NAME "__sendrec" -#ifdef __i386 -#define SYSCALL_OFFSET 0xF -#define SYSCALL_OLD 0x21CD -#else -#define SYSCALL_OFFSET 0xE -#define SYSCALL_OLD 0x20CD -#endif - -static long intaddr; - -void start_syscall(addr) -long addr; -{ -long old; - - syscalls = FALSE; - - if ( addr == 0 ) { - intaddr = symbolvalue( SYSCALL_NAME, TRUE ); - if ( intaddr == 0 ) - return; - intaddr += SYSCALL_OFFSET; - } - else { - intaddr = addr; - Printf("Using %lx as syscall address\n",addr); - } - - old = breakpt(intaddr,"\n"); - - /* Check instruction */ - if ( (old & 0xFFFF) == SYSCALL_OLD) - syscalls = TRUE; - -} - -void do_syscall(addr) -long addr; -{ - unsigned reg_ax,reg_bx; - - if ( addr != intaddr ) return; - - Printf("syscall to "); - - reg_ax = get_reg(curpid,reg_addr("AX")); - - switch (reg_ax) { - case 0: Printf(" PM "); - break; - case 1: Printf(" VFS "); - break; - case 2: Printf(" INET "); - break; - default: Printf("Invalid dest = %d", reg_ax); - exit(0); - } - - - reg_bx = get_reg(curpid,reg_addr("BX")); - decode_message(reg_bx); - - /* Single step */ - tstart(T_STEP, 0, 0, 1); - - /* Check return code */ - reg_ax = get_reg(curpid,reg_addr("AX")); - if ( reg_ax != 0 ) - Printf("syscall failed AX=%d\n",reg_ax); - else - decode_result(); -} - -#endif /* SYSCALLS_SUPPORT */ diff --git a/commands/mdb/trace.c b/commands/mdb/trace.c deleted file mode 100644 index 4a64bbcb2..000000000 --- a/commands/mdb/trace.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * trace.c for mdb - */ - -#include "mdb.h" -#include -#include -#include "proto.h" - -/* mdbtrace() - * Call ptrace and check for error if debugging running process - * Otherwise read 'core' file - */ -long mdbtrace(req, pid, addr, data) -int req, pid; -long addr, data; -{ - long val; - int i; - int segment; - -#ifdef DEBUG - if (debug) Printf("ptrace: req=%d pid=%d addr=%lx data=%lx\n", - req, pid, addr, data); -#endif - - if (corepid < 0) - { - errno = 0; - /* Call normal ptrace and check for error */ - val = ptrace(req, pid, addr, data); - if (errno != 0) { - do_error("mdb ptrace error "); - mdb_error("\n"); - } -#ifdef DEBUG - if (debug) Printf("ptrace: val=>%lx\n", val); -#endif - return val; - } - else - return read_core(req, addr, data); -} - -/* Used by disassembler */ -u32_t peek_dword(addr) -off_t addr; -{ - return mdbtrace(T_GETINS, curpid, addr, 0L); -} - diff --git a/distrib/sets/lists/minix/mi b/distrib/sets/lists/minix/mi index a327b646e..2cfc61464 100644 --- a/distrib/sets/lists/minix/mi +++ b/distrib/sets/lists/minix/mi @@ -208,8 +208,8 @@ ./usr/benchmarks/unixbench/testdir/sort.src minix-sys ./usr/benchmarks/unixbench/tmp minix-sys ./usr/bin minix-sys -./usr/bin/acknm minix-sys -./usr/bin/acksize minix-sys +./usr/bin/acknm minix-sys obsolete +./usr/bin/acksize minix-sys obsolete ./usr/bin/addr2line minix-sys binutils ./usr/bin/add_route minix-sys ./usr/bin/apropos minix-sys @@ -1759,7 +1759,7 @@ ./usr/man/man1 minix-sys ./usr/man/man1/..1 minix-sys ./usr/man/man1/[.1 minix-sys -./usr/man/man1/acksize.1 minix-sys +./usr/man/man1/acksize.1 minix-sys obsolete ./usr/man/man1/addr2line.1 minix-sys binutils ./usr/man/man1/apropos.1 minix-sys ./usr/man/man1/ar.1 minix-sys binutils @@ -1959,7 +1959,7 @@ ./usr/man/man1/nbperf.1 minix-sys ./usr/man/man1/newgrp.1 minix-sys ./usr/man/man1/nice.1 minix-sys -./usr/man/man1/nm.1 minix-sys +./usr/man/man1/nm.1 minix-sys obsolete ./usr/man/man1/nohup.1 minix-sys ./usr/man/man1/objcopy.1 minix-sys binutils ./usr/man/man1/objdump.1 minix-sys binutils diff --git a/man/man1/Makefile b/man/man1/Makefile index d966dcc80..62acaf331 100644 --- a/man/man1/Makefile +++ b/man/man1/Makefile @@ -11,11 +11,11 @@ MAN= ash.1 at.1 basename.1 \ last.1 loadfont.1 loadkeys.1 logger.1 \ look.1 lp.1 lspci.1 mail.1 \ mesg.1 mixer.1 \ - mkproto.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \ + mkproto.1 mount.1 mt.1 nice.1 nohup.1 od.1 \ paste.1 ping.1 playwave.1 pr.1 prep.1 \ profile.1 ps.1 rcp.1 recwave.1 \ remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \ - shar.1 acksize.1 sleep.1 spell.1 \ + shar.1 sleep.1 spell.1 \ split.1 stty.1 svc.1 svrctl.1 \ synctree.1 sysenv.1 sz.1 tail.1 tee.1 telnet.1 template.1 \ term.1 termcap.1 tget.1 time.1 tr.1 true.1 \ diff --git a/man/man1/acksize.1 b/man/man1/acksize.1 deleted file mode 100644 index a058cec35..000000000 --- a/man/man1/acksize.1 +++ /dev/null @@ -1,41 +0,0 @@ -.TH ACKSIZE 1 -.SH NAME -acksize \- print text, data, and bss size of a program -.SH SYNOPSIS -\fBacksize\fR [\fIfile\fR] ...\fR -.br -.de FL -.TP -\\fB\\$1\\fR -\\$2 -.. -.de EX -.TP 20 -\\fB\\$1\\fR -# \\$2 -.. -.SH EXAMPLES -.TP 20 -.B acksize file -# Print the size of \fIfile\fP -.SH DESCRIPTION -.PP -The text, data, bss, and total sizes for each argument are printed. -If no arguments are present, -.I a.out -is assumed. -The amount of memory available for combined stack and data segment growth -is printed in the column \&'stack.\&' -This is the value manipulated by the -.I chmem -command. -The total amount of memory allocated to the program when it is loaded is -listed under \&'memory.\&' -This value is just the sum of the other four columns. -.SH "SEE ALSO" -.BR anm (1), -.BR asize (1), -.BR ar (1), -.BR chmem (1), -.BR install (1), -.BR nm (1). diff --git a/man/man1/nm.1 b/man/man1/nm.1 deleted file mode 100644 index 62eec51cd..000000000 --- a/man/man1/nm.1 +++ /dev/null @@ -1,58 +0,0 @@ -.TH NM 1 -.SH NAME -nm \- print name list -.SH SYNOPSIS -\fBnm\fR [\fB\-dgnopru\fR]\fR [\fIfile\fR] ...\fR -.br -.de FL -.TP -\\fB\\$1\\fR -\\$2 -.. -.de EX -.TP 20 -\\fB\\$1\\fR -# \\$2 -.. -.SH OPTIONS -.TP 5 -.B \-d -# Print the offsets in decimal instead of in hex -.TP 5 -.B \-g -# Print only external symbols -.TP 5 -.B \-n -# Sort numerically rather than alphabetically -.TP 5 -.B \-o -# Prepend file name to each line rather than only once -.TP 5 -.B \-p -# Do not sort, print in symbol-table order -.TP 5 -.B \-r -# Sort in reverse order -.TP 5 -.B \-u -# Print only undefined symbols -.SH EXAMPLES -.TP 20 -.B nm \-n a.out -# Print all symbols in numerical order -.TP 20 -.B nm \-dg a.out -# Print globals alphabetically in decimal -.SH DESCRIPTION -.PP -\fINm\fR prints the symbol table of executable files when it is available. -If no file is given, the symbols in \fIa.out\fR are used. -The format of the table -is somewhat compatible with the one produced by \fIasld\fR when used with -the \fB\-s\fR option. The symbol table can be added with \fIast\fR. -Assembly language files do not have symbol tables. -.SH "SEE ALSO" -.BR anm (1), -.BR asize (1), -.BR ar (1), -.BR size (1).