home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sps3 / part02 / getupage.c < prev    next >
C/C++ Source or Header  |  1992-05-08  |  5KB  |  175 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)getupage.c    1.6\t12/4/91" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6. # ifdef KVM
  7. #  include      <kvm.h>
  8. # else
  9. #  include      <h/vm.h>
  10. #  ifdef BSD42
  11. #  include    <machine/pte.h>
  12. #  else
  13. #  include      <h/pte.h>
  14. #  endif
  15. # endif
  16. # include       <stdio.h>
  17.  
  18. /*
  19. ** GETUPAGE - Reads the upage for the specified process as well as sufficient
  20. ** page tables entries for reading the command arguments. The pte's are read
  21. ** into the argument `ptetbl'. The upage is read into the external variable
  22. ** `User'. This procedure returns 1 if the upage was successfully read.
  23. */
  24.  
  25. # ifndef KVM
  26.  
  27. # define        usrpt           (Info.i_usrpt)
  28.  
  29. getupage ( p, ptetbl )
  30.  
  31. register struct process         *p ;
  32. register struct pte             *ptetbl ;
  33.  
  34. {
  35.     register int            i ;
  36.     register int            ncl ;
  37.     struct pte              pte ;
  38.  
  39.     extern struct info      Info ;
  40.     extern union userstate  User ;
  41.     extern int              Flmem, Flkmem, Flswap ;
  42.  
  43.     /* If the process is not loaded, look for the upage on the swap device*/
  44. # ifdef ULTRIX40
  45.     if ( !(p->pr_p.p_sched & SLOAD) )
  46.     {
  47.         struct dmap        l_dmap ;
  48.         int            ublkno ;
  49.         int            swap ;
  50.  
  51.         memseek( Flkmem, (long)p->pr_p.p_smap ) ;
  52.         if ( read( Flkmem, (char*)&l_dmap, sizeof( struct dmap ) )
  53.         != sizeof( struct dmap ) )
  54.         {
  55.             fprintf( stderr,
  56.                 "sps - Can't read data segment map of process %d\n",
  57.                 p->pr_p.p_pid ) ;
  58.             return ( 0 ) ;
  59.         }
  60.         memseek( Flkmem, (long)l_dmap.dm_ptdaddr ) ;
  61.         if ( read( Flkmem, (char*)&ublkno, sizeof( ublkno ) )
  62.         != sizeof( ublkno ) )
  63.         {
  64.             fprintf( stderr,
  65.                 "sps - Can't read user block numer of process %d\n",
  66.                 p->pr_p.p_pid ) ;
  67.             return ( 0 ) ;
  68.         }
  69.         swseek( (long)dtob( ublkno ) ) ;
  70. # else ULTRIX40
  71.     if ( !(p->pr_p.p_flag & SLOAD) )
  72.     {                               
  73. #  ifdef BSD42
  74.         swseek( (long)dtob( p->pr_p.p_swaddr ) ) ;
  75. #  else BSD42
  76.         swseek( (long)ctob( p->pr_p.p_swaddr ) ) ;
  77. #  endif BSD42
  78. # endif ULTRIX40
  79. # ifdef SUN
  80.         if ( read( Flswap, (char*)&User.u_us, sizeof( union userstate ))
  81.         != sizeof( union userstate ) )
  82. # else SUN
  83.         if ( read( Flswap, (char*)&User.u_us, sizeof( struct user ) )
  84.         != sizeof( struct user ) )
  85. # endif SUN
  86.         {
  87.             fprintf( stderr,
  88.                 "sps - Can't read upage of process %d\n",
  89.                 p->pr_p.p_pid ) ;
  90.             return ( 0 ) ;
  91.         }
  92.         return ( 1 ) ;          
  93.     }                               
  94.     /* The process is loaded. Locate the process pte's by reading
  95.        the pte of their base address from system virtual address space. */
  96. # ifdef ULTRIX40
  97.     /* This method of accessing the upage suffices on the DEC Station
  98.        but only provides sufficient pte's to read the upage, leaving the
  99.        command arguments inaccessible. */
  100.     memseek( Flkmem, (long)p->pr_p.p_addr ) ;
  101.     if ( read( Flkmem, (char*)ptetbl, (UPAGES+CLSIZE)*sizeof( struct pte ) )
  102.     != (UPAGES+CLSIZE)*sizeof( struct pte ) )
  103.     {
  104.         fprintf( stderr, "sps - Can't read page table of process %d\n",
  105.             p->pr_p.p_pid ) ;
  106.         return ( 0 ) ;
  107.     }
  108. # else ULTRIX40
  109.     memseek( Flkmem, (long)&Info.i_usrptmap[ btokmx(p->pr_p.p_p0br)
  110.         + p->pr_p.p_szpt-1 ] ) ;
  111.     if ( read( Flkmem, (char*)&pte, sizeof( struct pte ) )
  112.     != sizeof( struct pte ) )
  113.     {
  114.         fprintf( stderr,
  115.               "sps - Can't read indir pte for upage of process %d\n",
  116.             p->pr_p.p_pid ) ;
  117.         return ( 0 ) ;
  118.     }                               
  119.     /* Now read the process' pte's from physical memory. We need to access
  120.        sufficient pte's for the upage and for the command arguments. */
  121.     memseek( Flmem, (long)ctob( pte.pg_pfnum+1 )
  122.         - (UPAGES+CLSIZE)*sizeof( struct pte ) ) ;
  123.     if ( read( Flmem, (char*)ptetbl, (UPAGES+CLSIZE)*sizeof( struct pte ) )
  124.     != (UPAGES+CLSIZE)*sizeof( struct pte ) )
  125.     {
  126.         fprintf( stderr, "sps - Can't read page table of process %d\n",
  127.             p->pr_p.p_pid ) ;
  128.         return ( 0 ) ;
  129.     }
  130. # endif ULTRIX40
  131.     /* Now we can read the pages belonging to the upage.
  132.        Here we read in an entire click at one go. */
  133.     ncl = (sizeof( struct user ) + NBPG*CLSIZE - 1) / (NBPG*CLSIZE) ;
  134.     while ( --ncl >= 0 )            
  135.     {                               
  136.         i = ncl * CLSIZE ;
  137. # ifdef ULTRIX40
  138.         memseek( Flmem, (long)ctob( ptetbl[ i ].pg_pfnum ) ) ;
  139. # else ULTRIX40
  140.         memseek( Flmem, (long)ctob( ptetbl[ CLSIZE+i ].pg_pfnum ) ) ;
  141. # endif ULTRIX40
  142.         if ( read( Flmem, User.u_pg[i], CLSIZE*NBPG ) != CLSIZE*NBPG )
  143.         {
  144.             fprintf( stderr,
  145.                 "sps - Can't read page 0x%x of process %d\n",
  146.                 ptetbl[ CLSIZE+i ].pg_pfnum, p->pr_p.p_pid ) ;
  147.             return ( 0 ) ;
  148.         }
  149.     }
  150.     return ( 1 ) ;
  151. }
  152.  
  153. # else KVM
  154.  
  155. getupage ( p )
  156.  
  157. register struct process         *p ;
  158.  
  159. {
  160.         struct user            *upage ;
  161.     extern union userstate  User ;
  162.     extern kvm_t           *Flkvm ;
  163.  
  164.     if (upage = kvm_getu( Flkvm, &p->pr_p ) )
  165.     {
  166.             bcopy( (char *)upage, User.u_pg[0], sizeof( struct user ) ) ;
  167.         return ( 1 ) ;
  168.     }
  169.     fprintf( stderr, "sps - Can't read upage of process %d\n",
  170.         p->pr_p.p_pid ) ;
  171.     return ( 0 ) ;
  172. }
  173.  
  174. # endif KVM
  175.