Source: MontaVista Software, Inc.
Signed-off-by: Frank Rowand <[EMAIL PROTECTED]>

Index: linux-2.6.10/arch/ppc/kernel/entry.S
===================================================================
--- linux-2.6.10.orig/arch/ppc/kernel/entry.S
+++ linux-2.6.10/arch/ppc/kernel/entry.S
@@ -1018,3 +1018,85 @@ machine_check_in_rtas:
        /* XXX load up BATs and panic */
 
 #endif /* CONFIG_PPC_OF */
+
+#ifdef CONFIG_MCOUNT
+
+/*
+ * mcount() is not the same as _mcount().  The callers of mcount() have a
+ * normal context.  The callers of _mcount() do not have a stack frame and
+ * have not saved the "caller saves" registers.
+ */
+_GLOBAL(mcount)
+       stwu    r1,-16(r1)
+       mflr    r3
+       lis     r5,[EMAIL PROTECTED]
+       lwz     r5,[EMAIL PROTECTED](r5)
+       stw     r3,20(r1)
+       cmpwi   r5,0
+       beq     1f
+       /* r3 contains lr (eip), put parent lr (parent_eip) in r4 */
+       lwz     r4,16(r1)
+       lwz     r4,4(r4)
+       bl      __trace
+1:
+       lwz     r0,20(r1)
+       mtlr    r0
+       addi    r1,r1,16
+       blr
+
+/*
+ * The -pg flag, which is specified in the case of CONFIG_MCOUNT, causes the
+ * C compiler to add a call to _mcount() at the start of each function 
preamble,
+ * before the stack frame is created.  An example of this preamble code is:
+ * 
+ *     mflr    r0
+ *     lis     r12,-16354
+ *     stw     r0,4(r1)
+ *     addi    r0,r12,-19652
+ *     bl      0xc00034c8 <_mcount>
+ *     mflr    r0
+ *     stwu    r1,-16(r1)
+ */
+_GLOBAL(_mcount)
+#define M_STK_SIZE 48
+       /* Would not expect to need to save cr, but glibc version of */
+       /* _mcount() does, so cautiously saving it here too.         */
+       stwu    r1,-M_STK_SIZE(r1)
+       stw     r3, 12(r1)
+       stw     r4, 16(r1)
+       stw     r5, 20(r1)
+       stw     r6, 24(r1)
+       mflr    r3              /* will use as first arg to __trace() */
+       mfcr    r4
+       lis     r5,[EMAIL PROTECTED]
+       lwz     r5,[EMAIL PROTECTED](r5)
+       cmpwi   r5,0
+       stw     r3, 44(r1)      /* lr */
+       stw     r4,  8(r1)      /* cr */
+       stw     r7, 28(r1)
+       stw     r8, 32(r1)
+       stw     r9, 36(r1)
+       stw     r10,40(r1)
+       beq     1f
+       /* r3 contains lr (eip), put parent lr (parent_eip) in r4 */
+       lwz     r4,M_STK_SIZE+4(r1)
+       bl      __trace
+1:
+       lwz     r8,  8(r1)      /* cr */
+       lwz     r9, 44(r1)      /* lr */
+       lwz     r3, 12(r1)
+       lwz     r4, 16(r1)
+       lwz     r5, 20(r1)
+       mtcrf   0xff,r8
+       mtctr   r9
+       lwz     r0, 52(r1)
+       lwz     r6, 24(r1)
+       lwz     r7, 28(r1)
+       lwz     r8, 32(r1)
+       lwz     r9, 36(r1)
+       lwz     r10,40(r1)
+       addi    r1,r1,M_STK_SIZE
+       mtlr    r0
+       bctr
+
+#endif /* CONFIG_MCOUNT */
Index: linux-2.6.10/arch/ppc/boot/Makefile
===================================================================
--- linux-2.6.10.orig/arch/ppc/boot/Makefile
+++ linux-2.6.10/arch/ppc/boot/Makefile
@@ -11,6 +11,15 @@
 #
 
 CFLAGS         += -fno-builtin -D__BOOTER__ -Iarch/$(ARCH)/boot/include
+
+ifdef CONFIG_MCOUNT
+# do not trace the boot loader
+nullstring :=
+space      := $(nullstring) # end of the line
+pg_flag     = $(nullstring) -pg # end of the line
+CFLAGS     := $(subst ${pg_flag},${space},${CFLAGS})
+endif
+
 HOSTCFLAGS     += -Iarch/$(ARCH)/boot/include
 
 BOOT_TARGETS   = zImage zImage.initrd znetboot znetboot.initrd
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to