Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 21 Dec 1997 19:52:40 -0500 (EST)
From:      "John S. Dyson" <dyson@FreeBSD.ORG>
To:        pb@fasterix.freenix.org (Pierre Beyssac)
Cc:        ache@nagual.pp.ru, current@FreeBSD.ORG
Subject:   Re: vfork (exec?) bug confirmation
Message-ID:  <199712220052.TAA02333@dyson.iquest.net>
In-Reply-To: <19971222005543.CE52615@@> from Pierre Beyssac at "Dec 22, 97 00:55:43 am"

next in thread | previous in thread | raw e-mail | index | archive | help
Pierre Beyssac said:
> ??????????????? writes:
> > I can confirm that following script cause immediate kernel page fault
> > even with very recent -current.
> 
> >From what I understand, it looks more and more like a vfork() bug.
> The bug in execve() may be explained by a weird stack left by
> vfork() which causes arguments passed by value to fail.
> 
Bruce Evans might have found the bug.  He has a fix, and I have
tried a slightly more efficient fix, and have committed it to
-current.  Please let me know as soon as reasonably possible
if my fix works.  If it doesn't, I'll look at it again.  I think
that the problem mostly manifested itself on non-PPro's.  The patch
follows my signature.  Thanks for your persistence!

-- 
John                  | Never try to teach a pig to sing,
dyson@freebsd.org     | it just makes you look stupid,
jdyson@nc.com         | and it irritates the pig.


Index: pmap.c
===================================================================
RCS file: /local/home/ncvs/src/sys/i386/i386/pmap.c,v
retrieving revision 1.174
diff -C2 -r1.174 pmap.c
*** pmap.c	1997/12/14 02:11:04	1.174
--- pmap.c	1997/12/22 00:51:00
***************
*** 40,44 ****
   *
   *	from:	@(#)pmap.c	7.7 (Berkeley)	5/12/91
!  *	$Id: pmap.c,v 1.174 1997/12/14 02:11:04 dyson Exp $
   */
  
--- 40,44 ----
   *
   *	from:	@(#)pmap.c	7.7 (Berkeley)	5/12/91
!  *	$Id: pmap.c,v 1.175 1997/12/22 00:36:48 dyson Exp $
   */
  
***************
*** 926,935 ****
  
  	for(i=0;i<UPAGES;i++) {
- 		unsigned oldpte;
  		if ((m = vm_page_lookup(upobj, i)) == NULL)
  			panic("pmap_dispose_proc: upage already missing???");
- 		oldpte = *(ptek + i);
  		*(ptek + i) = 0;
! 		if (oldpte & PG_G)
  			invlpg((vm_offset_t) p->p_addr + i * PAGE_SIZE);
  		vm_page_unwire(m);
--- 926,933 ----
  
  	for(i=0;i<UPAGES;i++) {
  		if ((m = vm_page_lookup(upobj, i)) == NULL)
  			panic("pmap_dispose_proc: upage already missing???");
  		*(ptek + i) = 0;
! 		if (cpu_class != CPUCLASS_386)
  			invlpg((vm_offset_t) p->p_addr + i * PAGE_SIZE);
  		vm_page_unwire(m);
***************
*** 937,942 ****
  	}
  
! 	vm_object_deallocate(upobj);
  
  	kmem_free(u_map, (vm_offset_t)p->p_addr, ctob(UPAGES));
  }
--- 935,944 ----
  	}
  
! #if defined(I386_CPU)
! 	if (cpu_class == CPUCLASS_386)
! 		invltlb();
! #endif
  
+ 	vm_object_deallocate(upobj);
  	kmem_free(u_map, (vm_offset_t)p->p_addr, ctob(UPAGES));
  }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712220052.TAA02333>