home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / xlist < prev    next >
Internet Message Format  |  1989-02-03  |  8KB

  1. Path: xanth!nic.MR.NET!csd4.milw.wisc.edu!leah!itsgw!steinmetz!uunet!allbery
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Newsgroups: comp.sources.misc
  4. Subject: v06i019: xlist: Xenix V xlist/kmem utility
  5. Message-ID: <47751@uunet.UU.NET>
  6. Date: 29 Jan 89 20:53:59 GMT
  7. Sender: allbery@uunet.UU.NET
  8. Reply-To: wht@tridom.UUCP (Warren Tucker)
  9. Lines: 301
  10. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  11. X-Arch-Keywords: xenix5, i286, i386, c, xlist, nlist, kernel, kmem
  12.  
  13. Posting-number: Volume 6, Issue 19
  14. Submitted-by: wht@tridom.UUCP (Warren Tucker)
  15. Archive-name: xlist
  16.  
  17. [People, not everyone's going to read even a "short and sweet" program to
  18. find out why they should save it.  Include README's or at minimum document
  19. it somewhere other than the code.  ++bsa]
  20.  
  21. This program is short and sweet, so no README or Makefile is included.
  22. It has been tested with SCO XENIX/286 2.2.1 and XENIX/386 2.3.1.
  23.  
  24. [Since the author didn't document it, I will:
  25.  
  26. This program displays symbol information from /xenix (it's for Xenix V, and
  27. will most likely be useless for any other OS) and optionally displays the
  28. value of kernel memory at the symbol address.  Usage is:
  29.  
  30.     xlist symbol[:count] ...
  31.  
  32. !WARNING! There may be a program called "xlist" in some Xenixes, especially
  33. more recent ones.  Let the installer beware....
  34. ++bsa]
  35.  
  36. #!/bin/sh
  37. # shar:    Shell Archiver  (v1.22)
  38. #
  39. #    Run the following text with /bin/sh to create:
  40. #      xlist.c
  41. #
  42. sed 's/^X//' << 'SHAR_EOF' > xlist.c &&
  43. X/* CHK=0x935A */
  44. X/* vi: set tabstop=4 shiftwidth=4: */
  45. X/*+-------------------------------------------------------------------------
  46. X    xlist.c - Xenix System V xlist utility
  47. X    by Warren H. Tucker, III. ...!gatech!{emory,kd4nc}!tridom!wht
  48. X
  49. X This program reads and displays /xenix symbol table information using
  50. X xlist and optionally reads and displays /dev/kmem.  See usage() below.
  51. X
  52. X Compile instructions:
  53. X 386: cc -Ox -K xlist.c -o xlist
  54. X 286: cc -M2l -O xlist.c -o xlist
  55. X--------------------------------------------------------------------------*/
  56. X/*+:EDITS:*/
  57. X/*:01-18-1989-12:26-wht-get ready for net submisssion */
  58. X/*:01-17-1989-19:43-wht-add dump feature and usage */
  59. X/*:01-18-1989-12:25-wht-creation */
  60. X
  61. X#include <stdio.h>
  62. X#include <fcntl.h>
  63. X#include <sys/a.out.h>
  64. X
  65. X#define XENIX_KERNEL "/xenix"
  66. X
  67. X#define UINT8 unsigned char
  68. X#define UINT16 unsigned short
  69. X#define UINT32 unsigned long
  70. X
  71. Xint fd_kmem;
  72. X
  73. Xchar *usage_text[]=
  74. X{
  75. X"usage: xlist arg [ arg ...]\n",
  76. X"where arg is of the form symbol[:count]\n",
  77. X"and symbol is a public symbol in /xenix as shown in a map file (i.e.,\n",
  78. X"with leading underscore as appropriate).  count is a number of bytes\n",
  79. X"prefixed with a colon.  xlist looks up the symbol by xlist'ing /xenix\n",
  80. X"and displays the xlist information on stdout.  If ':count' is present,\n",
  81. X"xlist reads kmem starting at 'symbol' and displays 'count' bytes in hex.\n",
  82. X#if defined(M_I286)
  83. X"On the 286, count is limited to 32767.\n",
  84. X#endif
  85. X(char *)0
  86. X};
  87. X
  88. X/*+-------------------------------------------------------------------------
  89. X    usage()
  90. X--------------------------------------------------------------------------*/
  91. Xvoid
  92. Xusage()
  93. X{
  94. Xregister char **text = usage_text;
  95. X
  96. X    while(*text)
  97. X        fprintf(stderr,*text++);
  98. X    exit(1);
  99. X}   /* end of usage */
  100. X
  101. X#define dump_putc(ch)       fputc((ch),stdout)
  102. X#define dump_puts(str)      fputs(str,stdout)
  103. X
  104. X/*+-----------------------------------------------------------------------
  105. X    hex_dump#... subservient routines
  106. X------------------------------------------------------------------------*/
  107. Xvoid hex_dump4(int4)
  108. XUINT8   int4;
  109. X{
  110. X    int4 &= 15;
  111. X    dump_putc((int4 >= 10) ? (int4 + 'A' - 10) : (int4 + '0'));
  112. X}
  113. X
  114. Xvoid hex_dump8(int8)
  115. XUINT8   int8;
  116. X{
  117. X    hex_dump4(int8 >> 4);
  118. X    hex_dump4(int8);
  119. X}
  120. X
  121. Xvoid hex_dump16(int16)
  122. XUINT16  int16;
  123. X{
  124. X    hex_dump8(int16 >> 8);
  125. X    hex_dump8(int16);
  126. X}
  127. X
  128. Xvoid hex_dump32(int32)
  129. XUINT32  int32;
  130. X{
  131. X    hex_dump16((UINT16)(int32 >> 16));
  132. X    hex_dump16((UINT16)int32);
  133. X}
  134. X
  135. X/*+-----------------------------------------------------------------
  136. X    hex_dump(str,len)
  137. X------------------------------------------------------------------*/
  138. Xvoid
  139. Xhex_dump(str,len,offset)
  140. XUINT8 *str;
  141. Xunsigned int len;
  142. Xlong offset;
  143. X{
  144. Xregister unsigned int itmp;
  145. Xregister unsigned int istr = 0;
  146. X
  147. X    while (istr < len)
  148. X    {
  149. X        hex_dump32(offset + istr);
  150. X        for (itmp = 0; itmp < 16; ++itmp)
  151. X        {
  152. X            dump_putc(' ');
  153. X            if( istr + itmp >= len)
  154. X            {
  155. X                dump_putc(' ');
  156. X                dump_putc(' ');
  157. X                continue;
  158. X            }
  159. X            hex_dump8(str[istr + itmp]);
  160. X        }
  161. X        dump_puts(" | ");
  162. X        for (itmp = 0; itmp < 16; ++itmp)
  163. X        {
  164. X        register char dchar;
  165. X            if(istr + itmp >= len)
  166. X                dump_putc(' ');
  167. X            else
  168. X            {
  169. X                dchar = str[istr + itmp] & 0x7F;
  170. X                dump_putc(((dchar >= ' ') && (dchar < 0x7f)) ? dchar : '.' );
  171. X            }
  172. X        }
  173. X        dump_puts(" |\n");
  174. X        istr += 16;
  175. X    }   /* end of while(istr < len) */
  176. X
  177. X}   /* end of hex_dump */
  178. X
  179. X/*+-------------------------------------------------------------------------
  180. X    dump_kmem(seekpos,length)
  181. X--------------------------------------------------------------------------*/
  182. Xvoid
  183. Xdump_kmem(seekpos,length)
  184. Xlong seekpos;
  185. Xunsigned int length;
  186. X{
  187. Xchar *kmemdata;
  188. Xchar *malloc();
  189. Xlong lseek();
  190. X
  191. X    if((kmemdata = malloc(length)) == NULL)
  192. X    {
  193. X        printf("cannot allocate %u bytes\n",length);
  194. X        return;
  195. X    }
  196. X
  197. X    if(lseek(fd_kmem,seekpos,0) < 0)
  198. X    {
  199. X        fprintf(stderr,"cannot seek kmem (%d) to %08lx",fd_kmem,seekpos);
  200. X        perror("");
  201. X        free(kmemdata);
  202. X        return;
  203. X    }
  204. X
  205. X    if(read(fd_kmem,kmemdata,length) != length)
  206. X    {
  207. X        perror("kmem read");
  208. X        free(kmemdata);
  209. X        return;
  210. X    }
  211. X
  212. X    hex_dump(kmemdata,length,seekpos);
  213. X    free(kmemdata);
  214. X
  215. X}   /* end of dump_kmem */
  216. X
  217. X/*+-------------------------------------------------------------------------
  218. X    open_kmem()
  219. X--------------------------------------------------------------------------*/
  220. Xvoid
  221. Xopen_kmem()
  222. X{
  223. X    if((fd_kmem = open("/dev/kmem",O_RDONLY,0)) < 0)
  224. X    {
  225. X        perror("/dev/kmem");
  226. X        exit(1);
  227. X    }
  228. X}   /* end of open_kmem */
  229. X
  230. X/*+-------------------------------------------------------------------------
  231. X    main(argc,argv,envp)
  232. X--------------------------------------------------------------------------*/
  233. Xmain(argc,argv,envp)
  234. Xint     argc;
  235. Xchar    **argv;
  236. Xchar    **envp;
  237. X{
  238. Xregister int iargv;
  239. Xstruct xlist *xlst;
  240. Xregister struct xlist *xx;
  241. Xint need_kmem = 0;
  242. Xunsigned long *count;
  243. Xchar *cptr;
  244. Xchar *strrchr();
  245. Xchar *calloc();
  246. Xlong atol();
  247. X
  248. X    if(argc < 2)
  249. X        usage();
  250. X
  251. X    if((xlst = (struct xlist *)calloc(argc,sizeof(struct xlist))) ==
  252. X            (struct xlist *)0)
  253. X    {
  254. X        fprintf(stderr,"memory not available\n");
  255. X        exit(1);
  256. X    }
  257. X
  258. X    if((count = (long *)calloc(argc,sizeof(long))) == (long *)0)
  259. X    {
  260. X        fprintf(stderr,"memory not available\n");
  261. X        exit(1);
  262. X    }
  263. X
  264. X    xx = xlst;
  265. X    for(iargv = 1; iargv < argc; iargv++)
  266. X    {
  267. X        if(cptr = strrchr(argv[iargv],':'))
  268. X        {
  269. X            *cptr++ = 0;
  270. X#if defined(M_I286)
  271. X            if((count[iargv - 1] = atol(cptr)) > 32767L)
  272. X            {
  273. X                printf("max count is 32767 on 286: %s\n",argv[iargv]);
  274. X                count[iargv - 1] = 32767;
  275. X            }
  276. X#else
  277. X            count[iargv - 1] = atol(cptr);
  278. X#endif
  279. X            need_kmem = 1;
  280. X        }
  281. X        xx->xl_name = argv[iargv];
  282. X        xx++;
  283. X    }
  284. X
  285. X    xlist(XENIX_KERNEL, xlst);
  286. X
  287. X    if(need_kmem)
  288. X        open_kmem();
  289. X
  290. X    xx = xlst;
  291. X    for(iargv = 1; iargv < argc; iargv++)
  292. X    {
  293. X        if(xx->xl_type == 0)
  294. X        {
  295. X            printf("%s: can't xlist (try _%s ?)\n",
  296. X                xx->xl_name,xx->xl_name);
  297. X            continue;
  298. X        }
  299. X
  300. X        printf("%s  type: %04x seg: %04x value: %08lx\n",
  301. X            xx->xl_name,xx->xl_type,xx->xl_seg,xx->xl_value);
  302. X
  303. X        if(count[iargv - 1])
  304. X            dump_kmem(xx->xl_value,(unsigned int)count[iargv - 1]);
  305. X
  306. X        xx++;
  307. X    }
  308. X
  309. X    exit(0);
  310. X}   /* end of main */
  311. SHAR_EOF
  312. chmod 0644 xlist.c || echo "restore of xlist.c fails"
  313. exit 0
  314.