home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.unix.bsd
- Path: sparky!uunet!mcsun!sun4nl!eur.nl!pk
- From: pk@cs.few.eur.nl (Paul Kranenburg)
- Subject: kvm.c patch
- Message-ID: <1992Jul23.173624.11010@cs.few.eur.nl>
- Keywords: ps
- Sender: news@cs.few.eur.nl
- Reply-To: pk@cs.few.eur.nl
- Organization: Erasmus University Rotterdam
- Date: Thu, 23 Jul 1992 17:36:24 GMT
- Lines: 182
-
-
- The following patch to ./src/lib/libutil/kvm.c makes commands such as ps(1)
- agree with the kernel as to the place in user memory where to the command
- arguments can be found. This change has become necessary because the way
- the arguments are copied at exec time has changed in the 0.1 kern_execve.c.
-
- Remake libutil.a, run ranlib and recompile and install ps.
-
- -pk.
-
- ------- kvm.c -------
- *** /tmp/da28640 Thu Jul 23 18:48:25 1992
- --- kvm.c Thu Jul 23 18:48:01 1992
- ***************
- *** 634,639 ****
- --- 634,644 ----
- }
- }
-
- + #ifdef i386
- + /* See also ./sys/kern/kern_execve.c */
- + #define ARGSIZE (roundup(ARG_MAX, NBPG))
- + #endif
- +
- #ifdef NEWVM
- struct user *
- kvm_getu(p)
- ***************
- *** 691,713 ****
- #endif
-
- #ifdef i386
- ! if (kp->kp_eproc.e_vm.vm_pmap.pm_pdir) {
- ! struct pde pde;
-
- ! klseek(kmem,
- ! (long)(kp->kp_eproc.e_vm.vm_pmap.pm_pdir + UPTDI), 0);
- ! if (read(kmem, (char *)&pde, sizeof pde) == sizeof pde &&
- ! pde.pd_v) {
-
- ! struct pte pte;
-
- ! lseek(mem, (long)ctob(pde.pd_pfnum) +
- ! (ptei(USRSTACK-CLBYTES) * sizeof pte), 0);
- ! if (read(mem, (char *)&pte, sizeof pte) == sizeof pte && + pte.pg_v) {
- ! argaddr1 = (long)ctob(pte.pg_pfnum);
- ! }
- ! }
- ! }
- #endif
- return(&user.user);
- }
- --- 696,727 ----
- #endif
-
- #ifdef i386
- ! if (kp->kp_eproc.e_vm.vm_pmap.pm_pdir) {
- ! struct pde pde;
- ! u_int vaddr = USRSTACK-ARGSIZE;
-
- ! if ((u_int)kp->kp_eproc.e_vm.vm_maxsaddr + MAXSSIZ < USRSTACK)
- ! vaddr -= MAXSSIZ;
- ! #if 0
- ! klseek(kmem,
- ! (long)(kp->kp_eproc.e_vm.vm_pmap.pm_pdir + UPTDI), 0);
- ! #else
- ! klseek(kmem,
- ! (long)(&kp->kp_eproc.e_vm.vm_pmap.pm_pdir[pdei(vaddr)]), 0);
- ! #endif
- ! if (read(kmem, (char *)&pde, sizeof pde) == sizeof pde
- ! && pde.pd_v) {
-
- ! struct pte pte;
-
- ! lseek(mem, (long)ctob(pde.pd_pfnum) +
- ! (ptei(vaddr) * sizeof pte), 0);
- ! if (read(mem, (char *)&pte, sizeof pte) == sizeof pte
- ! && pte.pg_v) {
- ! argaddr1 = (long)ctob(pte.pg_pfnum);
- ! }
- ! }
- ! }
- #endif
- return(&user.user);
- }
- ***************
- *** 786,796 ****
- --- 800,819 ----
- const struct proc *p;
- const struct user *up;
- {
- + #ifdef i386
- + /* See also ./sys/kern/kern_execve.c */
- + static char cmdbuf[ARGSIZE];
- + static union {
- + char argc[ARGSIZE];
- + int argi[ARGSIZE/sizeof (int)];
- + } argspac;
- + #else
- static char cmdbuf[CLBYTES*2];
- static union {
- char argc[CLBYTES*2];
- int argi[CLBYTES*2/sizeof (int)];
- } argspac;
- + #endif
- register char *cp;
- register int *ip;
- char c;
- ***************
- *** 824,829 ****
- --- 847,857 ----
- file = swapf;
- #endif
- } else {
- + #ifdef i386
- + lseek(mem, (long)argaddr1, 0);
- + if (read(mem, &argspac.argc[0], ARGSIZE) != ARGSIZE)
- + goto bad;
- + #else
- if (argaddr0) {
- lseek(mem, (long)argaddr0, 0);
- if (read(mem, (char *)&argspac, CLBYTES) != CLBYTES)
- ***************
- *** 833,842 ****
- lseek(mem, (long)argaddr1, 0);
- if (read(mem, &argspac.argc[CLBYTES], CLBYTES) != CLBYTES)
- goto bad;
- file = (char *) memf;
- }
- #ifdef i386
- ! ip = &argspac.argi[(CLBYTES + CLBYTES/2)/sizeof (int)];
- #else
- ip = &argspac.argi[CLBYTES*2/sizeof (int)];
- ip -= 2; /* last arg word and .long 0 */
- --- 861,873 ----
- lseek(mem, (long)argaddr1, 0);
- if (read(mem, &argspac.argc[CLBYTES], CLBYTES) != CLBYTES)
- goto bad;
- + #endif
- file = (char *) memf;
- }
- #ifdef i386
- ! ip = &argspac.argi[(ARGSIZE-ARG_MAX)/sizeof (int)];
- !
- ! for (cp = (char *)ip; cp < &argspac.argc[ARGSIZE-stkoff]; cp++) {
- #else
- ip = &argspac.argi[CLBYTES*2/sizeof (int)];
- ip -= 2; /* last arg word and .long 0 */
- ***************
- *** 848,855 ****
- *(char *)ip = ' ';
- ip++;
- nbad = 0;
- ! #endif
- for (cp = (char *)ip; cp < &argspac.argc[CLBYTES*2-stkoff]; cp++) {
- c = *cp & 0177;
- if (c == 0)
- *cp = ' ';
- --- 879,887 ----
- *(char *)ip = ' ';
- ip++;
- nbad = 0;
- !
- for (cp = (char *)ip; cp < &argspac.argc[CLBYTES*2-stkoff]; cp++) {
- + #endif
- c = *cp & 0177;
- if (c == 0)
- *cp = ' ';
- ***************
- *** 870,876 ****
- --- 902,912 ----
- while (*--cp == ' ')
- *cp = 0;
- cp = (char *)ip;
- + #ifdef i386
- + (void) strncpy(cmdbuf, cp, &argspac.argc[ARGSIZE*2] - cp);
- + #else
- (void) strncpy(cmdbuf, cp, &argspac.argc[CLBYTES*2] - cp);
- + #endif
- if (cp[0] == '-' || cp[0] == '?' || cp[0] <= ' ') {
- (void) strcat(cmdbuf, " (");
- (void) strncat(cmdbuf, p->p_comm, sizeof(p->p_comm));
-