home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / cputt / init.c < prev    next >
C/C++ Source or Header  |  1992-04-18  |  2KB  |  74 lines

  1. # include       "cputt.h"
  2. # include       <sys/file.h>
  3. # include       <kvm.h>
  4. # include       <nlist.h>
  5. # include       <stdio.h>
  6.  
  7. /*
  8.    INIT - Reads the kernel's symbol table for critical system
  9.    information and stores this information in the Symbollist array.
  10. */
  11.  
  12. init ()
  13. {
  14.      register struct nlist   *np ;
  15.      register struct symbol  *s ;
  16.      register struct nlist   *np0 ;
  17.      extern kvm_t            *Flkvm ;
  18.      extern struct symbol     Symbollist[] ;
  19.      extern struct info       Info ;
  20.      char                    *getcore() ;
  21.  
  22.      /* find length of the list of desired symbols */
  23.  
  24.      for ( s = Symbollist ; s->s_kname ; s++ )
  25.           ;
  26.      /* allocate core for nlist array */
  27.  
  28.      np0 = (struct nlist*)getcore( (s-Symbollist+1)*sizeof( struct nlist ));
  29.  
  30.      /* initialize nlist array */
  31.  
  32.      for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ )
  33.      {
  34.           np->n_name = s->s_kname ;
  35.           np[1].n_name = (char*)0 ;
  36.           np->n_value = 0 ;
  37.      }
  38.  
  39.      /* read symbols from symbol table into nlist array */
  40.  
  41.      if ( kvm_nlist( Flkvm, np0 ) == -1 )
  42.      {
  43.           fprintf( stderr, "sps - Can't read symbol file \n");
  44.           sysperror() ;
  45.      }
  46.  
  47.      /* derive system info from nlist and store in Symbollist */
  48.  
  49.      for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ )
  50.      {                                       
  51.           if ( !np->n_value )             
  52.           {
  53.               fprintf( stderr, "sps - Can't find symbol %s in %s", np->n_name);
  54.               *s->s_info = (caddr_t)0 ;
  55.               continue ;
  56.           }
  57.  
  58.           /* If no indirection is required, just copy the obtained value
  59.              into the `Info' structure. */
  60.  
  61.           if ( !s->s_indirect )           
  62.           {                               
  63.                *s->s_info = (caddr_t)np->n_value ;
  64.                continue ;              
  65.           }                               
  66.  
  67.           /* Otherwise one level of indirection is required. Using the
  68.              obtained address, look again in the kernel for the value */
  69.  
  70.           (void)getkmem((long)np->n_value, (char*)s->s_info, sizeof(caddr_t));
  71.      }
  72.      free( (char*)np0 ) ;
  73. }
  74.