home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sysinfo-1.0 / part01 / kvm.c < prev    next >
C/C++ Source or Header  |  1993-04-10  |  4KB  |  226 lines

  1. /*
  2.  * Copyright (c) 1992 Michael A. Cooper.
  3.  * This software may be freely distributed provided it is not sold for 
  4.  * profit and the author is credited appropriately.
  5.  */
  6.  
  7. #ifndef lint
  8. static char *RCSid = "$Header: /src/common/usc/bin/sysinfo/RCS/kvm.c,v 1.11 1992/04/26 23:32:06 mcooper Exp $";
  9. #endif
  10.  
  11. /*
  12.  * $Log: kvm.c,v $
  13.  * Revision 1.11  1992/04/26  23:32:06  mcooper
  14.  * Add Copyright notice
  15.  *
  16.  * Revision 1.10  1992/04/17  01:07:59  mcooper
  17.  * More de-linting
  18.  *
  19.  * Revision 1.9  1992/03/22  00:20:10  mcooper
  20.  * Major cleanup and re-org.
  21.  *
  22.  * Revision 1.8  1992/03/13  00:24:41  mcooper
  23.  * Always copy vmfile and namelist because we free()
  24.  * them in kvm_close().  GCC compiled stuff blows up
  25.  * if we free() a constant.
  26.  *
  27.  * Revision 1.7  1992/03/12  02:03:33  mcooper
  28.  * Change unix image to be /mach on NeXT machines.
  29.  *
  30.  * Revision 1.6  1992/03/04  00:01:59  mcooper
  31.  * Make HAVE_KVM and HAVE_NLIST consistant.
  32.  *
  33.  * Revision 1.5  1992/03/03  03:18:59  mcooper
  34.  * Seperate and cleanup KVM*() from kvm*().
  35.  *
  36.  * Revision 1.4  1992/03/01  23:28:33  mcooper
  37.  * Add kvm_close() support and changed to work with picky
  38.  * Alliant compiler.
  39.  *
  40.  * Revision 1.3  1992/02/22  02:20:19  mcooper
  41.  * Major changes to support scanning kernel mainbus and
  42.  * openprom data for device's.
  43.  *
  44.  * Revision 1.2  1992/02/10  04:13:18  mcooper
  45.  * Move strdup() to sysinfo.c
  46.  *
  47.  * Revision 1.1  1991/09/28  03:14:49  mcooper
  48.  * Initial revision
  49.  *
  50.  */
  51.  
  52. #include "system.h"
  53.  
  54. #if defined(NEED_KVM)
  55.  
  56. #include <stdio.h>
  57. #include <sys/errno.h>
  58. #include "kvm.h"
  59.  
  60. #ifndef SYSFAIL
  61. #define SYSFAIL -1
  62. #endif
  63.  
  64. #if defined(DEBUG) && !defined(SYSERR)
  65. extern int errno;
  66. extern char sys_errlist[];
  67. #define SYSERR sys_errlist[errno]
  68. #endif
  69.  
  70. char *strdup();
  71.  
  72. #if defined(alliant) || defined(_AIX)
  73. #define NAMELIST    "/unix"
  74. #else
  75. #if defined(NeXT)
  76. #define NAMELIST    "/mach"
  77. #else
  78. #define NAMELIST    "/vmunix"
  79. #endif
  80. #endif
  81. #define MEMFILE        "/dev/mem"
  82. #define KMEMFILE    "/dev/kmem"
  83.  
  84. /*
  85.  * Close things down.
  86.  */
  87. extern int kvm_close(kd)
  88.     kvm_t                *kd;
  89. {
  90.     if (!kd)
  91.     return(-1);
  92.  
  93.     if (kd->kmemd)
  94.     close(kd->kmemd);
  95.     if (kd->namelist)
  96.     free(kd->namelist);
  97.     if (kd->vmfile)
  98.     free(kd->vmfile);
  99.  
  100.     free(kd);
  101.  
  102.     return(0);
  103. }
  104.  
  105. /*
  106.  * Open things up.
  107.  */
  108. extern kvm_t *kvm_open(NameList, CoreFile, SwapFile, Flag, ErrStr)
  109.     char                *NameList;
  110.     char                *CoreFile;
  111.     char                *SwapFile;
  112.     int             Flag;
  113.     char                *ErrStr;
  114. {
  115.     kvm_t *kd;
  116.  
  117.     if ((kd = (kvm_t *) malloc(sizeof(kvm_t))) == NULL) {
  118. #ifdef DEBUG
  119.     fprintf(stderr, "kvm_open() malloc %d bytes failed!\n", sizeof(kvm_t));
  120. #endif
  121.     return((kvm_t *) NULL);
  122.     }
  123.  
  124.     if (NameList)
  125.     kd->namelist = strdup(NameList);
  126.     else
  127.     kd->namelist = strdup(NAMELIST);
  128.  
  129.     if (CoreFile)
  130.     kd->vmfile = strdup(CoreFile);
  131.     else
  132.     kd->vmfile = strdup(KMEMFILE);
  133.  
  134.     if ((kd->kmemd = open(kd->vmfile, Flag, 0)) == SYSFAIL) {
  135. #ifdef DEBUG
  136.     fprintf(stderr, "kvm_open() open '%s' failed: %s.\n", kd->vmfile, 
  137.         SYSERR);
  138. #endif
  139.     return((kvm_t *) NULL);
  140.     }
  141.  
  142.     return(kd);
  143. }
  144.  
  145. /*
  146.  * KVM read function
  147.  */
  148. extern int kvm_read(kd, Addr, Buf, NBytes)
  149.      kvm_t                *kd;
  150.      unsigned long         Addr;
  151.      char                *Buf;
  152.      unsigned             NBytes;
  153. {
  154.     unsigned             ret;
  155.  
  156.     if (!kd) {
  157. #ifdef DEBUG
  158.     fprintf(stderr, "kvm_read(): invalid kd param.\n");
  159. #endif
  160.     return(SYSFAIL);
  161.     }
  162.  
  163.     if (lseek(kd->kmemd, Addr, 0) == SYSFAIL) {
  164. #ifdef DEBUG
  165.     fprintf(stderr, "kvm_read(): lseek failed (desc %d addr 0x%x): %s.\n",
  166.         kd->kmemd, Addr, SYSERR);
  167. #endif
  168.     return(SYSFAIL);
  169.     }
  170.  
  171.     if ((ret = read(kd->kmemd, Buf, NBytes)) != NBytes) {
  172. #ifdef DEBUG
  173.     fprintf(stderr, 
  174.         "kvm_read(): read failed (desc %d buf 0x%x size %d): %s.\n",
  175.         kd->kmemd, Buf, NBytes, SYSERR);
  176. #endif
  177.     return(SYSFAIL);
  178.     }
  179.  
  180.     return(ret);
  181. }
  182.  
  183. /*
  184.  * KVM write function
  185.  */
  186. extern int kvm_write(kd, Addr, Buf, NBytes)
  187.      kvm_t                *kd;
  188.      unsigned long         Addr;
  189.      char                *Buf;
  190.      unsigned             NBytes;
  191. {
  192.     unsigned             ret;
  193.  
  194.     if (!kd) {
  195.     return(SYSFAIL);
  196.     }
  197.  
  198.     if (lseek(kd->kmemd, Addr, 0) == SYSFAIL) {
  199.     return(SYSFAIL);
  200.     }
  201.  
  202.     if ((ret = write(kd->kmemd, Buf, NBytes)) != NBytes) {
  203.     return(SYSFAIL);
  204.     }
  205.  
  206.     return(ret);
  207. }
  208.  
  209. /*
  210.  * Perform an nlist()
  211.  */
  212. #if    defined(HAVE_NLIST)
  213. extern int kvm_nlist(kd, nl)
  214.      kvm_t                *kd;
  215.      struct nlist            *nl;
  216. {
  217.     if (!kd) {
  218.     return(SYSFAIL);
  219.     }
  220.  
  221.     return(nlist(kd->namelist, nl));
  222. }
  223. #endif    /* HAVE_NLIST */
  224.  
  225. #endif /* NEED_KVM */
  226.