home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / unix / bsd / 2698 < prev    next >
Encoding:
Text File  |  1992-07-23  |  4.9 KB  |  195 lines

  1. Newsgroups: comp.unix.bsd
  2. Path: sparky!uunet!mcsun!sun4nl!eur.nl!pk
  3. From: pk@cs.few.eur.nl (Paul Kranenburg)
  4. Subject: kvm.c patch
  5. Message-ID: <1992Jul23.173624.11010@cs.few.eur.nl>
  6. Keywords: ps
  7. Sender: news@cs.few.eur.nl
  8. Reply-To: pk@cs.few.eur.nl
  9. Organization: Erasmus University Rotterdam
  10. Date: Thu, 23 Jul 1992 17:36:24 GMT
  11. Lines: 182
  12.  
  13.  
  14. The following patch to ./src/lib/libutil/kvm.c makes commands such as ps(1)
  15. agree with the kernel as to the place in user memory where to the command
  16. arguments can be found. This change has become necessary because the way
  17. the arguments are copied at exec time has changed in the 0.1 kern_execve.c.
  18.  
  19. Remake libutil.a, run ranlib and recompile and install ps.
  20.  
  21. -pk.
  22.  
  23. ------- kvm.c -------
  24. *** /tmp/da28640    Thu Jul 23 18:48:25 1992
  25. --- kvm.c    Thu Jul 23 18:48:01 1992
  26. ***************
  27. *** 634,639 ****
  28. --- 634,644 ----
  29.       }
  30.   }
  31.   
  32. + #ifdef i386
  33. + /* See also ./sys/kern/kern_execve.c */
  34. + #define ARGSIZE        (roundup(ARG_MAX, NBPG))
  35. + #endif
  36.   #ifdef NEWVM
  37.   struct user *
  38.   kvm_getu(p)
  39. ***************
  40. *** 691,713 ****
  41.   #endif
  42.   
  43.   #ifdef i386
  44. !       if (kp->kp_eproc.e_vm.vm_pmap.pm_pdir) {
  45. !               struct pde pde;
  46.   
  47. !               klseek(kmem,
  48. !                       (long)(kp->kp_eproc.e_vm.vm_pmap.pm_pdir + UPTDI), 0);
  49. !               if (read(kmem, (char *)&pde, sizeof pde) == sizeof pde &&
  50. !                       pde.pd_v) {
  51.   
  52. !                       struct pte pte;
  53.   
  54. !                       lseek(mem, (long)ctob(pde.pd_pfnum) +
  55. !                               (ptei(USRSTACK-CLBYTES) * sizeof pte), 0);
  56. !                       if (read(mem, (char *)&pte, sizeof pte) == sizeof pte && +                               pte.pg_v) {
  57. !                               argaddr1 = (long)ctob(pte.pg_pfnum);
  58. !                       }
  59. !               }
  60. !       }
  61.   #endif
  62.       return(&user.user);
  63.   }
  64. --- 696,727 ----
  65.   #endif
  66.   
  67.   #ifdef i386
  68. !     if (kp->kp_eproc.e_vm.vm_pmap.pm_pdir) {
  69. !         struct pde pde;
  70. !         u_int vaddr = USRSTACK-ARGSIZE;
  71.   
  72. !         if ((u_int)kp->kp_eproc.e_vm.vm_maxsaddr + MAXSSIZ < USRSTACK)
  73. !             vaddr -= MAXSSIZ;
  74. ! #if 0
  75. !         klseek(kmem,
  76. !             (long)(kp->kp_eproc.e_vm.vm_pmap.pm_pdir + UPTDI), 0);
  77. ! #else
  78. !         klseek(kmem,
  79. !         (long)(&kp->kp_eproc.e_vm.vm_pmap.pm_pdir[pdei(vaddr)]), 0);
  80. ! #endif
  81. !         if (read(kmem, (char *)&pde, sizeof pde) == sizeof pde
  82. !                 && pde.pd_v) {
  83.   
  84. !             struct pte pte;
  85.   
  86. !             lseek(mem, (long)ctob(pde.pd_pfnum) +
  87. !                 (ptei(vaddr) * sizeof pte), 0);
  88. !             if (read(mem, (char *)&pte, sizeof pte) == sizeof pte
  89. !                     && pte.pg_v) {
  90. !                 argaddr1 = (long)ctob(pte.pg_pfnum);
  91. !             }
  92. !         }
  93. !     }
  94.   #endif
  95.       return(&user.user);
  96.   }
  97. ***************
  98. *** 786,796 ****
  99. --- 800,819 ----
  100.       const struct proc *p;
  101.       const struct user *up;
  102.   {
  103. + #ifdef i386
  104. +     /* See also ./sys/kern/kern_execve.c */
  105. +     static char cmdbuf[ARGSIZE];
  106. +     static union {
  107. +         char    argc[ARGSIZE];
  108. +         int    argi[ARGSIZE/sizeof (int)];
  109. +     } argspac;
  110. + #else
  111.       static char cmdbuf[CLBYTES*2];
  112.       static union {
  113.           char    argc[CLBYTES*2];
  114.           int    argi[CLBYTES*2/sizeof (int)];
  115.       } argspac;
  116. + #endif
  117.       register char *cp;
  118.       register int *ip;
  119.       char c;
  120. ***************
  121. *** 824,829 ****
  122. --- 847,857 ----
  123.           file = swapf;
  124.   #endif
  125.       } else {
  126. + #ifdef i386
  127. +         lseek(mem, (long)argaddr1, 0);
  128. +         if (read(mem, &argspac.argc[0], ARGSIZE) != ARGSIZE)
  129. +             goto bad;
  130. + #else
  131.           if (argaddr0) {
  132.               lseek(mem, (long)argaddr0, 0);
  133.               if (read(mem, (char *)&argspac, CLBYTES) != CLBYTES)
  134. ***************
  135. *** 833,842 ****
  136.           lseek(mem, (long)argaddr1, 0);
  137.           if (read(mem, &argspac.argc[CLBYTES], CLBYTES) != CLBYTES)
  138.               goto bad;
  139.           file = (char *) memf;
  140.       }
  141.   #ifdef i386
  142. !     ip = &argspac.argi[(CLBYTES + CLBYTES/2)/sizeof (int)];
  143.   #else
  144.       ip = &argspac.argi[CLBYTES*2/sizeof (int)];
  145.       ip -= 2;                /* last arg word and .long 0 */
  146. --- 861,873 ----
  147.           lseek(mem, (long)argaddr1, 0);
  148.           if (read(mem, &argspac.argc[CLBYTES], CLBYTES) != CLBYTES)
  149.               goto bad;
  150. + #endif
  151.           file = (char *) memf;
  152.       }
  153.   #ifdef i386
  154. !     ip = &argspac.argi[(ARGSIZE-ARG_MAX)/sizeof (int)];
  155. !     for (cp = (char *)ip; cp < &argspac.argc[ARGSIZE-stkoff]; cp++) {
  156.   #else
  157.       ip = &argspac.argi[CLBYTES*2/sizeof (int)];
  158.       ip -= 2;                /* last arg word and .long 0 */
  159. ***************
  160. *** 848,855 ****
  161.       *(char *)ip = ' ';
  162.       ip++;
  163.       nbad = 0;
  164. ! #endif
  165.       for (cp = (char *)ip; cp < &argspac.argc[CLBYTES*2-stkoff]; cp++) {
  166.           c = *cp & 0177;
  167.           if (c == 0)
  168.               *cp = ' ';
  169. --- 879,887 ----
  170.       *(char *)ip = ' ';
  171.       ip++;
  172.       nbad = 0;
  173.       for (cp = (char *)ip; cp < &argspac.argc[CLBYTES*2-stkoff]; cp++) {
  174. + #endif
  175.           c = *cp & 0177;
  176.           if (c == 0)
  177.               *cp = ' ';
  178. ***************
  179. *** 870,876 ****
  180. --- 902,912 ----
  181.       while (*--cp == ' ')
  182.           *cp = 0;
  183.       cp = (char *)ip;
  184. + #ifdef i386
  185. +     (void) strncpy(cmdbuf, cp, &argspac.argc[ARGSIZE*2] - cp);
  186. + #else
  187.       (void) strncpy(cmdbuf, cp, &argspac.argc[CLBYTES*2] - cp);
  188. + #endif
  189.       if (cp[0] == '-' || cp[0] == '?' || cp[0] <= ' ') {
  190.           (void) strcat(cmdbuf, " (");
  191.           (void) strncat(cmdbuf, p->p_comm, sizeof(p->p_comm));
  192.