PERFORCE change 140746 for review

Marcel Moolenaar marcel at FreeBSD.org
Sun Apr 27 18:42:49 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=140746

Change 140746 by marcel at marcel_xcllnt on 2008/04/27 18:42:28

	Improve profiling support.
	
	Obtained from: Juniper.

Affected files ...

.. //depot/projects/e500/sys/powerpc/include/cpu.h#3 edit
.. //depot/projects/e500/sys/powerpc/include/profile.h#2 edit

Differences ...

==== //depot/projects/e500/sys/powerpc/include/cpu.h#3 (text+ko) ====

@@ -69,6 +69,9 @@
 #define	cpu_getstack(td)	((td)->td_frame->fixreg[1])
 #define	cpu_spinwait()		/* nothing */
 
+extern char btext[];
+extern char etext[];
+
 void	cpu_halt(void);
 void	cpu_reset(void);
 void	fork_trampoline(void);

==== //depot/projects/e500/sys/powerpc/include/profile.h#2 (text+ko) ====

@@ -81,61 +81,67 @@
 #define _PLT
 #endif
 
-#define	MCOUNT \
-__asm("	.globl	_mcount						\n" \
-"	.type	_mcount, at function				\n" \
-"_mcount:							\n" \
-"	stwu	%r1,-64(%r1)	/* alloca for reg save space */	\n" \
-"	stw	%r3,16(%r1)	/* save parameter registers, */	\n" \
-"	stw	%r4,20(%r1)    	/*  r3-10		     */	\n" \
-"	stw	%r5,24(%r1)	       				\n" \
-"	stw	%r6,28(%r1)	       				\n" \
-"	stw	%r7,32(%r1)	       				\n" \
-"	stw	%r8,36(%r1)	       				\n" \
-"	stw	%r9,40(%r1)	       				\n" \
-"	stw	%r10,44(%r1)					\n" \
-"								\n" \
-"	mflr	%r4		/* link register is 'selfpc' */	\n" \
-"	stw	%r4,48(%r1)    	/* save since bl will scrub  */	\n" \
-"	lwz	%r3,68(%r1)    	/* get 'frompc' from LR-save */	\n" \
-"	bl	__mcount" _PLT "  /* __mcount(frompc, selfpc)*/	\n" \
-"	lwz	%r3,68(%r1)					\n" \
-"	mtlr	%r3		/* restore caller's lr	     */	\n" \
-"	lwz	%r4,48(%r1)     			       	\n" \
-"	mtctr	%r4		/* set up ctr for call back  */	\n" \
-"				/* note that blr is not used!*/	\n" \
-"	lwz	%r3,16(%r1)	/* restore r3-10 parameters  */	\n" \
-"	lwz	%r4,20(%r1)	       				\n" \
-"	lwz	%r5,24(%r1)	       				\n" \
-"	lwz	%r6,28(%r1)	       				\n" \
-"	lwz	%r7,32(%r1)	       				\n" \
-"	lwz	%r8,36(%r1)	       				\n" \
-"	lwz	%r9,40(%r1)	       				\n" \
-"	lwz	%r10,44(%r1)					\n" \
-"	addi	%r1,%r1,64	/* blow away alloca save area */ \n" \
-"	bctr			/* return with indirect call */	\n" \
-"_mcount_end:				\n" \
-"	.size	_mcount,_mcount_end-_mcount");
+#define	MCOUNT					\
+__asm(	"	.globl	_mcount			\n" \
+	"	.type	_mcount, at function	\n" \
+	"	.align	4			\n" \
+	"_mcount:				\n" \
+	"	stwu	%r1,-64(%r1)		\n" \
+	"	stw	%r3,16(%r1)		\n" \
+	"	stw	%r4,20(%r1)		\n" \
+	"	stw	%r5,24(%r1)		\n" \
+	"	stw	%r6,28(%r1)		\n" \
+	"	stw	%r7,32(%r1)		\n" \
+	"	stw	%r8,36(%r1)		\n" \
+	"	stw	%r9,40(%r1)		\n" \
+	"	stw	%r10,44(%r1)		\n" \
+	"	mflr	%r4			\n" \
+	"	stw	%r4,48(%r1)		\n" \
+	"	lwz	%r3,68(%r1)		\n" \
+	"	bl	__mcount" _PLT "	\n" \
+	"	lwz	%r3,68(%r1)		\n" \
+	"	mtlr	%r3			\n" \
+	"	lwz	%r4,48(%r1)		\n" \
+	"	mtctr	%r4			\n" \
+	"	lwz	%r3,16(%r1)		\n" \
+	"	lwz	%r4,20(%r1)		\n" \
+	"	lwz	%r5,24(%r1)		\n" \
+	"	lwz	%r6,28(%r1)		\n" \
+	"	lwz	%r7,32(%r1)		\n" \
+	"	lwz	%r8,36(%r1)		\n" \
+	"	lwz	%r9,40(%r1)		\n" \
+	"	lwz	%r10,44(%r1)		\n" \
+	"	addi	%r1,%r1,64		\n" \
+	"	bctr				\n" \
+	"_mcount_end:				\n" \
+	"	.size	_mcount,_mcount_end-_mcount");
 
+#ifdef _KERNEL
+#define	MCOUNT_ENTER(s)		s = intr_disable()
+#define	MCOUNT_EXIT(s)		intr_restore(s)
+#define	MCOUNT_DECL(s)		register_t s;
 
-#ifdef _KERNEL
-#define MCOUNT_ENTER(s)		s = intr_disable();
-#define MCOUNT_EXIT(s)		intr_restore(s);
-#define	MCOUNT_DECL(s)		register_t s
+extern char interrupt_vector_base[];
+extern char interrupt_vector_top[];
 
-void bintr(void);
-void btrap(void);
-void eintr(void);
-void user(void);
+static __inline void
+profile_sentinel_interrupt(void)
+{
+}
 
-#define	MCOUNT_FROMPC_USER(pc)					\
-	((pc < (uintfptr_t)VM_MAXUSER_ADDRESS) ? (uintfptr_t)user : pc)
+static __inline void
+profile_sentinel_userspace(void)
+{
+}
 
-#define	MCOUNT_FROMPC_INTR(pc)					\
-	((pc >= (uintfptr_t)btrap && pc < (uintfptr_t)eintr) ?	\
-	    ((pc >= (uintfptr_t)bintr) ? (uintfptr_t)bintr :	\
-		(uintfptr_t)btrap) : ~0U)
+#define	MCOUNT_FROMPC_USER(pc)				\
+	((pc < (uintfptr_t)VM_MAXUSER_ADDRESS) ?	\
+	    (uintfptr_t)profile_sentinel_userspace : pc)
 
+#define	MCOUNT_FROMPC_INTR(pc)				\
+	((pc >= (uintfptr_t)interrupt_vector_base &&	\
+	  pc < (uintfptr_t)interrupt_vector_top) ?	\
+	    (uintfptr_t)profile_sentinel_interrupt : ~0U)
 
 #else	/* !_KERNEL */
 


More information about the p4-projects mailing list