Module Name:    src
Committed By:   matt
Date:           Sun Jun 12 16:35:10 UTC 2011

Modified Files:
        src/sys/arch/powerpc/oea: ofw_subr.S ofwoea_machdep.c

Log Message:
Save/restore all sprgs when calling OFW.
Move all-zero variables from .data to .bss
Use .lcomm for local variables.
Cleanup a bit of assembly.
Clear PSL_IP in the saved ofmsr (was previously done in ofwoea_machdep.c)


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/powerpc/oea/ofw_subr.S
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/powerpc/oea/ofwoea_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/oea/ofw_subr.S
diff -u src/sys/arch/powerpc/oea/ofw_subr.S:1.8 src/sys/arch/powerpc/oea/ofw_subr.S:1.9
--- src/sys/arch/powerpc/oea/ofw_subr.S:1.8	Tue Apr  8 02:33:03 2008
+++ src/sys/arch/powerpc/oea/ofw_subr.S	Sun Jun 12 16:35:10 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofw_subr.S,v 1.8 2008/04/08 02:33:03 garbled Exp $	*/
+/*	$NetBSD: ofw_subr.S,v 1.9 2011/06/12 16:35:10 matt Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -37,20 +37,12 @@
 	.local	ofwsrsave
 	.local	OF_buffer
 
-	.data
-GLOBAL(ofmsr)
-	.long	0,0,0,0,0		/* msr & sprg[0-3] used in OF */
-
-GLOBAL(ofwsprg0save)
-	.long	0
-
-GLOBAL(ofwreal_incharge)
-	.long	0
-
-	.comm	firmstk,NBPG,8
-	.comm	OF_buffer,NBPG,4
+	.lcomm	firmstk,NBPG,16
+	.lcomm	OF_buffer,NBPG,4
 	.comm	openfirmware_entry,4,4	/* openfirmware entry point */
-	.comm	ofwsrsave,64,4		/* openfirmware SR savearea */
+	.lcomm	ofwsrsave,64,4		/* openfirmware SR savearea */
+	.lcomm	ofwmsr,20,4		/* msr & sprg[0-3] used in OF */
+	.comm	ofwreal_incharge,4,4
 
 /*
  * Called by start to save the initial OFW state so we can restore it
@@ -64,7 +56,7 @@
 
 	li	%r8,1
 	lis	%r9,ofwreal_incharge@ha
-	stw	%r8,ofwreal_incharge@l(9)
+	stw	%r8,ofwreal_incharge@l(%r9)
 
 	mflr	%r30
 	bl	_C_LABEL(ofwr_init)
@@ -75,17 +67,19 @@
 	stw	%r5,openfirmware_entry@l(%r8) /* save client interface handler*/
 
 	mfmsr	%r0
-	lis	%r9,ofmsr@ha
-	stwu	%r0,ofmsr@l(%r9)		/* save initial MSR value */
-
-        mfsprg  %r0,0			/* save SPRGs */
-       	stwu	%r0,4(%r9)
-        mfsprg  %r0,1
-       	stwu	%r0,4(%r9)
-        mfsprg  %r0,2
-       	stwu	%r0,4(%r9)
-        mfsprg  %r0,3
-       	stw	%r0,4(%r9)
+	li	%r8,PSL_IP
+	andc	%r0,%r0,%r8			/* make sure PSL_IP is off */
+	lis	%r9,ofwmsr@ha
+	stwu	%r0,ofwmsr@l(%r9)		/* save initial MSR value */
+
+	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
@@ -101,16 +95,20 @@
 ENTRY(openfirmware)
 	mflr	%r0			/* save return address */
 	stw	%r0,4(%r1)
-	stwu	%r1,-16(%r1)		/* setup stack frame */
+	stwu	%r1,-32(%r1)		/* setup stack frame */
 
 	lis	%r4,openfirmware_entry@ha	/* get firmware entry point */
 	lwz	%r4,openfirmware_entry@l(%r4)
 	mtlr	%r4
 
-	mfsprg	%r5,0			/* save current sprg0 (curcpu) */
-	lis	%r4,ofwsprg0save@ha
-	addi	%r4,%r4,ofwsprg0save@l
-	stw	%r5,0(%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
@@ -156,16 +154,16 @@
 	cmpwi	%r5,0
 	bne	1b
 2:
-	lis	%r4,ofmsr@ha		/* Open Firmware msr + sprg[0-3] */
-	lwzu	%r5,ofmsr+16@l(%r4)
-	mtsprg	3,%r5
-	lwzu	%r5,-4(%r4)
-	mtsprg	2,%r5
-	lwzu	%r5,-4(%r4)
-	mtsprg	1,%r5
-	lwzu	%r5,-4(%r4)
-	mtsprg	0,%r5
+	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
 
@@ -185,10 +183,14 @@
 	mtmsr	%r4
 	isync
 4:	
-	lis	%r4,ofwsprg0save@ha	/* restore saved sprg0 (curcpu) */
-	addi	%r4,%r4,ofwsprg0save@l
-	lwz	%r5,0(%r4)
-	mtsprg	0,%r5
+	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
 
 	lwz	%r1,0(%r1)		/* and return */
 	lwz	%r0,4(%r1)

Index: src/sys/arch/powerpc/oea/ofwoea_machdep.c
diff -u src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.20 src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.21
--- src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.20	Sun Mar 14 10:03:49 2010
+++ src/sys/arch/powerpc/oea/ofwoea_machdep.c	Sun Jun 12 16:35:10 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ofwoea_machdep.c,v 1.20 2010/03/14 10:03:49 kiyohara Exp $ */
+/* $NetBSD: ofwoea_machdep.c,v 1.21 2011/06/12 16:35:10 matt Exp $ */
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.20 2010/03/14 10:03:49 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.21 2011/06/12 16:35:10 matt Exp $");
 
 #include "opt_ppcarch.h"
 #include "opt_compat_netbsd.h"
@@ -120,7 +120,6 @@
 u_int timebase_freq = 0;
 #endif
 
-extern int ofmsr;
 extern int chosen;
 extern uint32_t ticks_per_sec;
 extern uint32_t ns_per_tick;
@@ -196,8 +195,6 @@
 	if (ofmaplen > 0)
 		save_ofmap(ofmap, ofmaplen);
 
-	ofmsr &= ~PSL_IP;
-
 	/* Parse the args string */
 	if (args) {
 		strcpy(bootpath, args);

Reply via email to