Return to BSD News archive
Newsgroups: comp.unix.bsd Path: sserve!manuel!munnari.oz.au!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));