From: pk@cs.few.eur.nl (Paul Kranenburg)
Subject: kvm.c patch
Keywords: ps
Reply-To: pk@cs.few.eur.nl
Organization: Erasmus University Rotterdam
Date: Thu, 23 Jul 1992 17:36:24 GMT


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));