NetBSD Problem Report #6095

Received: (qmail 5699 invoked from network); 3 Sep 1998 18:54:39 -0000
Message-Id: <199809031856.UAA18864@q610.ebe.uni-c.dk>
Date: Thu, 3 Sep 1998 20:56:33 +0200 (MEST)
From: Erik Bertelsen <erik@q610.ebe.uni-c.dk>
Reply-To: erik@mediator.uni-c.dk
To: gnats-bugs@gnats.netbsd.org
Subject: bcopy->memcpy for arch/powerpc
X-Send-Pr-Version: 3.95

>Number:         6095
>Category:       port-powerpc
>Synopsis:       bcopy->memcpy for arch/powerpc
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    port-powerpc-maintainer
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Sep 03 12:05:00 +0000 1998
>Closed-Date:    Sun Jul 22 13:07:15 +0000 2001
>Last-Modified:  Sun Jul 22 13:07:15 +0000 2001
>Originator:     Erik Bertelsen
>Release:        NetBSD-current 3 Sep 1998
>Organization:

>Environment:

System: NetBSD q610.ebe.uni-c.dk 1.3H NetBSD 1.3H (Q610) #: Wed Sep 2 20:49:28 MEST 1998 erik@q610.ebe.uni-c.dk:/home/src/sys/arch/mac68k/compile/Q610 mac68k


>Description:
	Recently parts of the kernel has been updated to use memcpy and
	friends instead of bcopy.
	Below is the patches to changes calls of bcopy into calls of
	memcpy for powerpc. These patches have been developed while
	building a macppc kernel without bcopy.
>How-To-Repeat:

>Fix:
Index: db_interface.c
===================================================================
RCS file: /home/cvs-base/src/sys/arch/powerpc/powerpc/db_interface.c,v
retrieving revision 1.1.1.3
diff -c -r1.1.1.3 db_interface.c
*** db_interface.c	1998/09/01 17:15:15	1.1.1.3
--- db_interface.c	1998/09/03 18:51:21
***************
*** 28,40 ****
  		    && (frame->srr1 & 0x20000))
  		|| frame->exc == EXC_BPT)) {

! 		bcopy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));
  		DDB_REGS->iar = frame->srr0;
  		DDB_REGS->msr = frame->srr1;

  		db_trap(T_BREAKPOINT, 0);

! 		bcopy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));

  		return 1;
  	}
--- 28,40 ----
  		    && (frame->srr1 & 0x20000))
  		|| frame->exc == EXC_BPT)) {

! 		memcpy(DDB_REGS->r, frame->fixreg, 32 * sizeof(u_int32_t));
  		DDB_REGS->iar = frame->srr0;
  		DDB_REGS->msr = frame->srr1;

  		db_trap(T_BREAKPOINT, 0);

! 		memcpy(frame->fixreg, DDB_REGS->r, 32 * sizeof(u_int32_t));

  		return 1;
  	}
Index: pmap.c
===================================================================
RCS file: /home/cvs-base/src/sys/arch/powerpc/powerpc/pmap.c,v
retrieving revision 1.1.1.7
diff -c -r1.1.1.7 pmap.c
*** pmap.c	1998/09/01 17:15:17	1.1.1.7
--- pmap.c	1998/09/03 18:51:21
***************
*** 389,395 ****
  		 */
  		if (sz == 0) {
  		empty:
! 			bcopy(mp + 1, mp,
  			      (cnt - (mp - avail)) * sizeof *mp);
  			cnt--;
  			mp--;
--- 389,395 ----
  		 */
  		if (sz == 0) {
  		empty:
! 			memcpy(mp, mp + 1,
  			      (cnt - (mp - avail)) * sizeof *mp);
  			cnt--;
  			mp--;
***************
*** 403,409 ****
  			if (s < mp1->start)
  				break;
  		if (mp1 < mp) {
! 			bcopy(mp1, mp1 + 1, (void *)mp - (void *)mp1);
  			mp1->start = s;
  			mp1->size = sz;
  		} else {
--- 403,409 ----
  			if (s < mp1->start)
  				break;
  		if (mp1 < mp) {
! 			memcpy(mp1 + 1, mp1, (void *)mp - (void *)mp1);
  			mp1->start = s;
  			mp1->size = sz;
  		} else {
***************
*** 432,445 ****
  			if (s)
  				mp->size = s;
  			else {
! 				bcopy(mp + 1, mp,
  				      (cnt - (mp - avail)) * sizeof *mp);
  				mp = avail;
  			}
  			break;
  		}
  		if (s != 0) {
! 			bcopy(mp, mp + 1,
  			      (cnt - (mp - avail)) * sizeof *mp);
  			mp++->size = s;
  		}
--- 432,445 ----
  			if (s)
  				mp->size = s;
  			else {
! 				memcpy(mp, mp + 1,
  				      (cnt - (mp - avail)) * sizeof *mp);
  				mp = avail;
  			}
  			break;
  		}
  		if (s != 0) {
! 			memcpy(mp + 1, mp, 
  			      (cnt - (mp - avail)) * sizeof *mp);
  			mp++->size = s;
  		}
***************
*** 471,477 ****
  	mp->size -= sz;
  	mp->start += sz;
  	if (mp->size <= 0)
! 		bcopy(mp + 1, mp, (cnt - (mp - avail)) * sizeof *mp);
  	for (i = 0; i < ptab_cnt; i++)
  		LIST_INIT(potable + i);
  	LIST_INIT(&pv_page_freelist);
--- 471,477 ----
  	mp->size -= sz;
  	mp->start += sz;
  	if (mp->size <= 0)
! 		memcpy(mp, mp + 1, (cnt - (mp - avail)) * sizeof *mp);
  	for (i = 0; i < ptab_cnt; i++)
  		LIST_INIT(potable + i);
  	LIST_INIT(&pv_page_freelist);
***************
*** 492,498 ****
  	mp->size -= sz;
  	mp->start += sz;
  	if (mp->size <= 0)
! 		bcopy(mp + 1, mp, (cnt - (mp - avail)) * sizeof *mp);
  #endif

  #if defined(MACHINE_NEW_NONCONTIG)
--- 492,498 ----
  	mp->size -= sz;
  	mp->start += sz;
  	if (mp->size <= 0)
! 		memcpy(mp, mp + 1, (cnt - (mp - avail)) * sizeof *mp);
  #endif

  #if defined(MACHINE_NEW_NONCONTIG)
***************
*** 822,828 ****
  pmap_copy_page(src, dst)
  	paddr_t src, dst;
  {
! 	bcopy((caddr_t)src, (caddr_t)dst, NBPG);
  }

  static struct pv_entry *
--- 822,828 ----
  pmap_copy_page(src, dst)
  	paddr_t src, dst;
  {
! 	memcpy((void *)dst, (void *)src, NBPG);
  }

  static struct pv_entry *
Index: trap.c
===================================================================
RCS file: /home/cvs-base/src/sys/arch/powerpc/powerpc/trap.c,v
retrieving revision 1.1.1.5
diff -c -r1.1.1.5 trap.c
*** trap.c	1998/09/01 17:15:18	1.1.1.5
--- trap.c	1998/09/03 18:51:21
***************
*** 117,123 ****
  				frame->srr0 = (*fb)[0];
  				frame->fixreg[1] = (*fb)[1];
  				frame->cr = (*fb)[2];
! 				bcopy(&(*fb)[3], &frame->fixreg[13],
  				      19 * sizeof(register_t));
  				return;
  			}
--- 117,123 ----
  				frame->srr0 = (*fb)[0];
  				frame->fixreg[1] = (*fb)[1];
  				frame->cr = (*fb)[2];
! 				memcpy(&frame->fixreg[13], &(*fb)[3],
  				      19 * sizeof(register_t));
  				return;
  			}
***************
*** 215,221 ****
  			argsize = callp->sy_argsize;
  			n = NARGREG - (params - (frame->fixreg + FIRSTARG));
  			if (argsize > n * sizeof(register_t)) {
! 				bcopy(params, args, n * sizeof(register_t));
  				if (error = copyin(MOREARGS(frame->fixreg[1]),
  						   args + n,
  						   argsize - n * sizeof(register_t))) {
--- 215,221 ----
  			argsize = callp->sy_argsize;
  			n = NARGREG - (params - (frame->fixreg + FIRSTARG));
  			if (argsize > n * sizeof(register_t)) {
! 				memcpy(args, params, n * sizeof(register_t));
  				if (error = copyin(MOREARGS(frame->fixreg[1]),
  						   args + n,
  						   argsize - n * sizeof(register_t))) {
***************
*** 406,412 ****
  		if (l > len)
  			l = len;
  		setusr(curpcb->pcb_pm->pm_sr[(u_int)udaddr >> ADDR_SR_SHFT]);
! 		bcopy(p, kaddr, l);
  		udaddr += l;
  		kaddr += l;
  		len -= l;
--- 406,412 ----
  		if (l > len)
  			l = len;
  		setusr(curpcb->pcb_pm->pm_sr[(u_int)udaddr >> ADDR_SR_SHFT]);
! 		memcpy(kaddr, p, l);
  		udaddr += l;
  		kaddr += l;
  		len -= l;
***************
*** 433,439 ****
  		if (l > len)
  			l = len;
  		setusr(curpcb->pcb_pm->pm_sr[(u_int)udaddr >> ADDR_SR_SHFT]);
! 		bcopy(kaddr, p, l);
  		udaddr += l;
  		kaddr += l;
  		len -= l;
--- 433,439 ----
  		if (l > len)
  			l = len;
  		setusr(curpcb->pcb_pm->pm_sr[(u_int)udaddr >> ADDR_SR_SHFT]);
! 		memcpy(p, kaddr, l);
  		udaddr += l;
  		kaddr += l;
  		len -= l;
***************
*** 466,472 ****
  		return EFAULT;
  	}

! 	bcopy(src, dst, len);

  	curpcb->pcb_onfault = 0;
  	return 0;
--- 466,472 ----
  		return EFAULT;
  	}

! 	memcpy(dst, src, len);

  	curpcb->pcb_onfault = 0;
  	return 0;
Index: vm_machdep.c
===================================================================
RCS file: /home/cvs-base/src/sys/arch/powerpc/powerpc/vm_machdep.c,v
retrieving revision 1.1.1.3
diff -c -r1.1.1.3 vm_machdep.c
*** vm_machdep.c	1998/09/01 17:15:19	1.1.1.3
--- vm_machdep.c	1998/09/03 18:51:21
***************
*** 77,83 ****
  	 */
  	stktop1 = (caddr_t)trapframe(p1);
  	stktop2 = (caddr_t)trapframe(p2);
! 	bcopy(stktop1, stktop2, sizeof(struct trapframe));
  	stktop2 = (caddr_t)((u_long)stktop2 & ~15);	/* Align stack pointer */

  	/*
--- 77,83 ----
  	 */
  	stktop1 = (caddr_t)trapframe(p1);
  	stktop2 = (caddr_t)trapframe(p2);
! 	memcpy(stktop2, stktop1, sizeof(struct trapframe));
  	stktop2 = (caddr_t)((u_long)stktop2 & ~15);	/* Align stack pointer */

  	/*
***************
*** 197,203 ****
  	chdr->c_cpusize = sizeof md_core;

  	tf = trapframe(p);
! 	bcopy(tf, &md_core.frame, sizeof md_core.frame);

  	CORE_SETMAGIC(cseg, CORESEGMAGIC, MID_POWERPC, CORE_CPU);
  	cseg.c_addr = 0;
--- 197,203 ----
  	chdr->c_cpusize = sizeof md_core;

  	tf = trapframe(p);
! 	memcpy(&md_core.frame, tf, sizeof md_core.frame);

  	CORE_SETMAGIC(cseg, CORESEGMAGIC, MID_POWERPC, CORE_CPU);
  	cseg.c_addr = 0;

regards
Erik Bertelsen
>Release-Note:
>Audit-Trail:

From: Matthias Drochner <drochner@zelux6.zel.kfa-juelich.de>
To: gnats-bugs@gnats.netbsd.org, erik@mediator.uni-c.dk
Cc:  Subject: Re: port-powerpc/6095: bcopy->memcpy for arch/powerpc
Date: Thu,  3 Sep 1998 21:25:20 +0200 (MET DST)

 Excerpts from netbsd: 3-Sep-98 port-powerpc/6095: bcopy->m.. Erik
 Bertelsen@q610.ebe. (8331)

 > ! 			memcpy(mp, mp + 1,
 >   			      (cnt - (mp - avail)) * sizeof *mp);

 Without exactly knowing what I'm speaking about:
 This looks a lot like overlapping regions.
 Do you want to use memmove() instead?

 best regards
 Matthias


From: Erik Bertelsen <erik@mediator.uni-c.dk>
To: Matthias Drochner <drochner@zelux6.zel.kfa-juelich.de>,
        gnats-bugs@gnats.netbsd.org, erik@mediator.uni-c.dk
Cc:  Subject: Re: port-powerpc/6095: bcopy->memcpy for arch/powerpc
Date: Thu, 3 Sep 1998 22:22:14 +0200

 On Thu, Sep 03, 1998 at 09:25:20PM +0200, Matthias Drochner wrote:
 > Excerpts from netbsd: 3-Sep-98 port-powerpc/6095: bcopy->m.. Erik
 > Bertelsen@q610.ebe. (8331)
 > 
 > > ! 			memcpy(mp, mp + 1,
 > >   			      (cnt - (mp - avail)) * sizeof *mp);
 > 
 > Without exactly knowing what I'm speaking about:
 > This looks a lot like overlapping regions.
 > Do you want to use memmove() instead?

 Actually, I was wondering about this as well, and re-reading the manual
 page for bcopy (that states that overlapping copies are handled correctly),
 I tend to agree that memmove is better in this case. There are a few examples
 of this in my patches, but (IIRC) only in one of the source files.

 - Erik
Responsible-Changed-From-To: gnats-admin->port-powerpc-maintainer 
Responsible-Changed-By: fair 
Responsible-Changed-When: Mon Dec 28 09:46:14 PST 1998 
Responsible-Changed-Why:  
This PR is the responsibility of the portmaster, 
not the GNATS database administrator. 
State-Changed-From-To: open->closed 
State-Changed-By: wiz 
State-Changed-When: Sun Jul 22 06:06:23 PDT 2001 
State-Changed-Why:  
I recently replaced all bcopys/bcmps/bzeros in arch/powerpc with their 
mem*-equivalent. 
Thanks for the PR! 
>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.