NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-macppc/59177: NetBSD/macppc -current fails to boot on qemu



The following reply was made to PR port-macppc/59177; it has been noted by GNATS.

From: Tobias Nygren <tnn%NetBSD.org@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: port-macppc/59177: NetBSD/macppc -current fails to boot on qemu
Date: Sat, 31 May 2025 15:56:23 +0200

 This is a multi-part message in MIME format.
 
 --Multipart=_Sat__31_May_2025_15_56_23_+0200_MWlCQJBXL+3Nmzpc
 Content-Type: text/plain; charset=US-ASCII
 Content-Transfer-Encoding: 7bit
 
 I reverted the asm portion of the suspect change locally and HEAD now boots.
 It was pointed out privately that this is likely some QEMU firmware bug.
 Anyway, I'll attach the diff for reference.
 
 # uname -a
 NetBSD  10.99.14 NetBSD 10.99.14 (GENERIC) #6: Sat May 31 15:48:46 CEST 2025  tnn%altra.rymdfartsverket.se@localhost:/work/macppc-bisect/HEAD/obj/sys/arch/macppc/compile/GENERIC macppc
 
 --Multipart=_Sat__31_May_2025_15_56_23_+0200_MWlCQJBXL+3Nmzpc
 Content-Type: text/plain;
  name="powerpc.diff.txt"
 Content-Disposition: attachment;
  filename="powerpc.diff.txt"
 Content-Transfer-Encoding: 7bit
 
 ? sys/arch/powerpc/powerpc/wd
 ? sys/arch/powerpc/powerpc/wdwd
 Index: sys/arch/powerpc/oea/ofw_subr.S
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/powerpc/oea/ofw_subr.S,v
 retrieving revision 1.20
 diff -p -u -r1.20 ofw_subr.S
 --- sys/arch/powerpc/oea/ofw_subr.S	28 Feb 2021 19:01:11 -0000	1.20
 +++ sys/arch/powerpc/oea/ofw_subr.S	31 May 2025 13:49:56 -0000
 @@ -52,7 +52,7 @@
  
  	/* MSR used in OpenFirmware */
  	.globl	ofwmsr
 -	.comm	ofwmsr,4,4
 +	.comm	ofwmsr,20,4
  
  #ifdef FIRMWORKSBUGS
  	.lcomm	ofwreal_incharge,4,4
 @@ -101,7 +101,16 @@ ENTRY_NOPROFILE(ofwinit)
  	/* Save the MSR that OpenFirmware is using. */
  	mfmsr	%r0
  	lis	%r9,ofwmsr@ha
 -	stw	%r0,ofwmsr@l(%r9)
 +	stwu	%r0,ofwmsr@l(%r9)
 +
 +	mfsprg0	%r0				/* save SPRGs */
 +	stw	%r0,4(%r9)
 +	mfsprg1	%r0
 +	stw	%r0,8(%r9)
 +	mfsprg2	%r0
 +	stw	%r0,12(%r9)
 +	mfsprg3	%r0
 +	stw	%r0,16(%r9)
  
  	lis	%r8,OF_buffer@ha
  	addi	%r8,%r8,OF_buffer@l
 @@ -148,6 +157,19 @@ ENTRY_NOPROFILE(openfirmware_trampoline)
  	 */
  	stwu	%r1,-48(%r1)
  
 +	lis	%r4,ofentry@ha		/* get firmware entry point */
 +	lwz	%r4,ofentry@l(%r4)
 +	mtlr	%r4
 +
 +	mfsprg0	%r5			/* save current sprg0 (curcpu) */
 +	stw	%r5,16(%r1)
 +	mfsprg1	%r5			/* save current sprg1 */
 +	stw	%r5,20(%r1)
 +	mfsprg2	%r5			/* save current sprg1 */
 +	stw	%r5,24(%r1)
 +	mfsprg3	%r5			/* save current sprg3 */
 +	stw	%r5,28(%r1)
 +
  #ifdef FIRMWORKSBUGS
  	lis	%r4,ofwreal_incharge@ha
  	lwz	%r4,ofwreal_incharge@l(%r4)
 @@ -195,33 +217,21 @@ ENTRY_NOPROFILE(openfirmware_trampoline)
  	cmpwi	%r5,0
  	bne	1b
  2:
 -	/* curcpu()->ci_battable = &ofw_battable */
 -	GET_CPUINFO(%r4)
 -	lis	%r5,_C_LABEL(ofw_battable)@ha
 -	addi	%r5,%r5,_C_LABEL(ofw_battable)@l
 -	stw	%r5,CI_BATTABLE(%r4)
 -
 -	lis	%r4,ofentry@ha		/* get firmware entry point */
 -	lwz	%r4,ofentry@l(%r4)
 -	mtlr	%r4
 -
 -	lis	%r4,ofwmsr@ha		/* load Open Firmware MSR */
 -	lwz	%r5,ofwmsr@l(%r4)
 +	lis	%r4,ofwmsr+16@ha	/* Open Firmware msr + sprg[0-3] */
 +	lwzu	%r5,ofwmsr+16@l(%r4)
 +	mtsprg3	%r5
 +	lwz	%r5,-4(%r4)
 +	mtsprg2	%r5
 +	lwz	%r5,-8(%r4)
 +	mtsprg1	%r5
 +	lwz	%r5,-12(%r4)
 +	mtsprg0	%r5
 +	lwz	%r5,-16(%r4)
  	mtmsr	%r5
  	isync
  
  	blrl				/* call Open Firmware */
  
 -	li	%r0,0			/* ensure disable MMU is disabled */
 -	mtmsr	%r0
 -	isync
 -
 -	/* curcpu()->ci_battable = &battable */
 -	GET_CPUINFO(%r4)
 -	lis	%r5,_C_LABEL(battable)@ha
 -	addi	%r5,%r5,_C_LABEL(battable)@l
 -	stw	%r5,CI_BATTABLE(%r4)
 -
  	lis	%r4,clsrsave@ha		/* restore saved SRs */
  	addi	%r4,%r4,clsrsave@l
  	li	%r5,0
 @@ -236,6 +246,15 @@ ENTRY_NOPROFILE(openfirmware_trampoline)
  	mtmsr	%r4
  	isync
  4:	
 +	lwz	%r5,16(%r1)		/* restore saved sprgs (curcpu) */
 +	mtsprg0	%r5
 +	lwz	%r5,20(%r1)
 +	mtsprg1	%r5
 +	lwz	%r5,24(%r1)
 +	mtsprg2	%r5
 +	lwz	%r5,28(%r1)
 +	mtsprg3	%r5
 +
  	addi	%r1,%r1,48		/* pop stack frame and save area */
  	lwz	%r0,4(%r1)		/* return address */
  	mtlr	%r0
 Index: sys/arch/powerpc/powerpc/trap_subr.S
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/trap_subr.S,v
 retrieving revision 1.87
 diff -p -u -r1.87 trap_subr.S
 --- sys/arch/powerpc/powerpc/trap_subr.S	29 Apr 2025 14:33:26 -0000	1.87
 +++ sys/arch/powerpc/powerpc/trap_subr.S	31 May 2025 13:49:56 -0000
 @@ -268,20 +268,14 @@ _C_LABEL(dsitrap):
  	rlwinm	%r31,%r31,3+(32-BAT_ADDR_SHIFT),BAT_ADDR_SHIFT-3,28
  					/* get segment * 8 */
  
 -	/* Get address of this CPU's current battable */
 -	GET_CPUINFO(%r30)
 -	ldreg	%r30,CI_BATTABLE(%r30)
 -
 -	/* Add offset to the slot we care about. */
 -	add	%r31,%r31,%r30
 -
  	/* get batu */
 -	ldreg	%r30,0(%r31)
 +	addis	%r31,%r31,_C_LABEL(battable)@ha
 +	ldreg	%r30,_C_LABEL(battable)@l(%r31)
  	mtcr	%r30
  	bf	30,1f			/* branch if supervisor valid is
  					   false */
  	/* get batl */
 -	ldreg	%r31,SZREG(%r31)
 +	ldreg	%r31,_C_LABEL(battable)+SZREG@l(%r31)
  /* We randomly use the highest two bat registers here */
  	mftb	%r28
  	mtcr	%r28
 @@ -369,21 +363,15 @@ _C_LABEL(dsi601trap):
  	mfdar	%r31			/* get fault address */
  	rlwinm	%r31,%r31,12,20,28	/* get "segment" battable offset */
  
 -	/* Get address of this CPU's current battable */
 -	GET_CPUINFO(%r30)
 -	ldreg	%r30,CI_BATTABLE(%r30)
 -
 -	/* Add offset to the slot we care about. */
 -	add	%r31,%r31,%r30
 -
  	/* get batl */
 -	ldreg	%r30,SZREG(%r31)
 +	addis	%r31,%r31,_C_LABEL(battable)@ha
 +	ldreg	%r30,_C_LABEL(battable)+SZREG@l(%r31)
  	mtcr	%r30
  	bf	25,1f			/* branch if Valid is false,
  					   presently assumes supervisor only */
  
  	/* get batu */
 -	ldreg	%r31,0(%r31)
 +	ldreg	%r31,_C_LABEL(battable)@l(%r31)
  /* We randomly use the highest two bat registers here */
  	mfspr	%r28,SPR_RTCL_R
  	andi.	%r28,%r28,128
 
 --Multipart=_Sat__31_May_2025_15_56_23_+0200_MWlCQJBXL+3Nmzpc--
 


Home | Main Index | Thread Index | Old Index