Author: andreast
Date: Fri Jan 20 22:34:19 2012
New Revision: 230400
URL: http://svn.freebsd.org/changeset/base/230400

Log:
  This commit adds profiling support for powerpc64. Now we can do application
  profiling and kernel profiling. To enable kernel profiling one has to build
  kgmon(8). I will enable the build once I managed to build and test powerpc
  (32-bit) kernels with profiling support.
  
  - add a powerpc64 PROF_PROLOGUE for _mcount.
  - add macros to avoid adding the PROF_PROLOGUE in certain assembly entries.
  - apply these macros where needed.
  - add size information to the MCOUNT function.
  
  MFC after:    3 weeks, together with r230291

Modified:
  head/lib/libc/powerpc64/sys/cerror.S
  head/sys/powerpc/aim/locore64.S
  head/sys/powerpc/aim/swtch64.S
  head/sys/powerpc/aim/trap_subr64.S
  head/sys/powerpc/include/asm.h
  head/sys/powerpc/include/profile.h
  head/sys/powerpc/ofw/ofwcall64.S
  head/sys/powerpc/powerpc/atomic.S
  head/sys/powerpc/powerpc/setjmp.S

Modified: head/lib/libc/powerpc64/sys/cerror.S
==============================================================================
--- head/lib/libc/powerpc64/sys/cerror.S        Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/lib/libc/powerpc64/sys/cerror.S        Fri Jan 20 22:34:19 2012        
(r230400)
@@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$");
         * programs and the initial threaded in threaded programs,
         * it returns a pointer to the global errno variable.
         */
-ENTRY(HIDENAME(cerror))
+ENTRY_NOPROF(HIDENAME(cerror))
        mflr    %r0
        std     %r0,16(%r1)             /* save lr */
        stdu    %r1,-64(%r1)            /* allocate new stack frame */

Modified: head/sys/powerpc/aim/locore64.S
==============================================================================
--- head/sys/powerpc/aim/locore64.S     Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/aim/locore64.S     Fri Jan 20 22:34:19 2012        
(r230400)
@@ -115,7 +115,7 @@ kernel_text:
  * segment!
  */
        .text
-ASENTRY(__start)
+ASENTRY_NOPROF(__start)
        li      8,0
        li      9,0x100
        mtctr   9
@@ -202,7 +202,7 @@ tocbase:
  * or the (currently used) C code optimized, so it doesn't use any non-volatile
  * registers.
  */
-ASENTRY(setfault)
+ASENTRY_NOPROF(setfault)
        mflr    0
        mfcr    12
        mfsprg  4,0

Modified: head/sys/powerpc/aim/swtch64.S
==============================================================================
--- head/sys/powerpc/aim/swtch64.S      Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/aim/swtch64.S      Fri Jan 20 22:34:19 2012        
(r230400)
@@ -68,7 +68,7 @@
 /*
  * void cpu_throw(struct thread *old, struct thread *new)
  */
-ENTRY(cpu_throw)
+ENTRY_NOPROF(cpu_throw)
        mr      %r13, %r4
        b       cpu_switchin
 
@@ -79,7 +79,7 @@ ENTRY(cpu_throw)
  *
  * Switch to a new thread saving the current state in the old thread.
  */
-ENTRY(cpu_switch)
+ENTRY_NOPROF(cpu_switch)
        ld      %r6,TD_PCB(%r3)         /* Get the old thread's PCB ptr */
        std     %r12,PCB_CONTEXT(%r6)   /* Save the non-volatile GP regs.
                                           These can now be used for scratch */
@@ -237,7 +237,7 @@ blocked_loop:
  * savectx(pcb)
  * Update pcb, saving current processor state
  */
-ENTRY(savectx)
+ENTRY_NOPROF(savectx)
        std     %r12,PCB_CONTEXT(%r3)   /* Save the non-volatile GP regs. */
        std     %r13,PCB_CONTEXT+1*8(%r3)       
        std     %r14,PCB_CONTEXT+2*8(%r3)       
@@ -268,7 +268,8 @@ ENTRY(savectx)
  * fork_trampoline()
  * Set up the return from cpu_fork()
  */
-ENTRY(fork_trampoline)
+
+ENTRY_NOPROF(fork_trampoline)
        ld      %r3,CF_FUNC(%r1)
        ld      %r4,CF_ARG0(%r1)
        ld      %r5,CF_ARG1(%r1)

Modified: head/sys/powerpc/aim/trap_subr64.S
==============================================================================
--- head/sys/powerpc/aim/trap_subr64.S  Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/aim/trap_subr64.S  Fri Jan 20 22:34:19 2012        
(r230400)
@@ -703,7 +703,7 @@ CNAME(asttrapexit):
 /*
  * Deliberate entry to dbtrap
  */
-ASENTRY(breakpoint)
+ASENTRY_NOPROF(breakpoint)
        mtsprg1 %r1
        mfmsr   %r3
        mtsrr1  %r3

Modified: head/sys/powerpc/include/asm.h
==============================================================================
--- head/sys/powerpc/include/asm.h      Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/include/asm.h      Fri Jan 20 22:34:19 2012        
(r230400)
@@ -76,15 +76,35 @@
 #endif
 
 #if defined(PROF) || (defined(_KERNEL) && defined(GPROF))
-# define       _PROF_PROLOGUE  mflr 0; stw 0,4(1); bl _mcount
+# ifdef __powerpc64__
+#   define     _PROF_PROLOGUE  mflr 0;                                 \
+                               std 3,48(1);                            \
+                               std 4,56(1);                            \
+                               std 5,64(1);                            \
+                               std 0,16(1);                            \
+                               stdu 1,-112(1);                         \
+                               bl _mcount;                             \
+                               nop;                                    \
+                               ld 0,112+16(1);                         \
+                               ld 3,112+48(1);                         \
+                               ld 4,112+56(1);                         \
+                               ld 5,112+64(1);                         \
+                               mtlr 0;                                 \
+                               addi 1,1,112
+# else
+#   define     _PROF_PROLOGUE  mflr 0; stw 0,4(1); bl _mcount
+# endif
 #else
 # define       _PROF_PROLOGUE
 #endif
 
-#define        ENTRY(y)        _ENTRY(CNAME(y)); _PROF_PROLOGUE
 #define        ASENTRY(y)      _ENTRY(ASMNAME(y)); _PROF_PROLOGUE
+#define        ENTRY(y)        _ENTRY(CNAME(y)); _PROF_PROLOGUE
 #define        GLOBAL(y)       _GLOBAL(CNAME(y))
 
+#define        ASENTRY_NOPROF(y)       _ENTRY(ASMNAME(y))
+#define        ENTRY_NOPROF(y)         _ENTRY(CNAME(y))
+
 #define        ASMSTR          .asciz
 
 #define        RCSID(x)        .text; .asciz x

Modified: head/sys/powerpc/include/profile.h
==============================================================================
--- head/sys/powerpc/include/profile.h  Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/include/profile.h  Fri Jan 20 22:34:19 2012        
(r230400)
@@ -85,6 +85,7 @@ __asm(        "       .text                           \n" \
        "_mcount:                               \n" \
        "       .quad .L._mcount,.TOC.@tocbase,0\n" \
        "       .previous                       \n" \
+       "       .size   main,24                 \n" \
        "       .type   _mcount,@function       \n" \
        "       .align  4                       \n" \
        ".L._mcount:                            \n" \

Modified: head/sys/powerpc/ofw/ofwcall64.S
==============================================================================
--- head/sys/powerpc/ofw/ofwcall64.S    Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/ofw/ofwcall64.S    Fri Jan 20 22:34:19 2012        
(r230400)
@@ -56,7 +56,7 @@ GLOBAL(rtas_entry)
  * Open Firmware Real-mode Entry Point. This is a huge pain.
  */
 
-ASENTRY(ofwcall)
+ASENTRY_NOPROF(ofwcall)
        mflr    %r0
        std     %r0,16(%r1)
        stdu    %r1,-208(%r1)
@@ -175,7 +175,7 @@ ASENTRY(ofwcall)
  * C prototype: int rtascall(void *callbuffer, void *rtas_privdat);
  */
 
-ASENTRY(rtascall)
+ASENTRY_NOPROF(rtascall)
        mflr    %r0
        std     %r0,16(%r1)
        stdu    %r1,-208(%r1)

Modified: head/sys/powerpc/powerpc/atomic.S
==============================================================================
--- head/sys/powerpc/powerpc/atomic.S   Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/powerpc/atomic.S   Fri Jan 20 22:34:19 2012        
(r230400)
@@ -30,7 +30,7 @@
        
        .text
        
-ASENTRY(atomic_set_8)
+ASENTRY_NOPROF(atomic_set_8)
 0:     lwarx   0, 0, 3         /* load old value */
        slwi    4, 4, 24        /* shift the byte so it's in the right place */
        or      0, 0, 4         /* generate new value */
@@ -40,7 +40,7 @@ ASENTRY(atomic_set_8)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_clear_8)
+ASENTRY_NOPROF(atomic_clear_8)
 0:     lwarx   0, 0, 3         /* load old value */
        slwi    4, 4, 24        /* shift the byte so it's in the right place */
        andc    0, 0, 4         /* generate new value */
@@ -50,7 +50,7 @@ ASENTRY(atomic_clear_8)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_add_8)
+ASENTRY_NOPROF(atomic_add_8)
 0:     lwarx   9, 0, 3         /* load old value */
        srwi    0, 9, 24        /* byte alignment */
        add     0, 4, 0         /* calculate new value */
@@ -63,7 +63,7 @@ ASENTRY(atomic_add_8)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_subtract_8)
+ASENTRY_NOPROF(atomic_subtract_8)
 0:     lwarx   9, 0, 3         /* load old value */
        srwi    0, 9, 24        /* byte alignment */
        subf    0, 4, 0         /* calculate new value */
@@ -76,7 +76,7 @@ ASENTRY(atomic_subtract_8)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_set_16)
+ASENTRY_NOPROF(atomic_set_16)
        li      11, 3           /* mask to test for alignment */
        andc.   11, 3, 11       /* force address to be word-aligned */
 0:     lwarx   12, 0, 11       /* load old value */
@@ -89,7 +89,7 @@ ASENTRY(atomic_set_16)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_clear_16)
+ASENTRY_NOPROF(atomic_clear_16)
        li      11, 3           /* mask to test for alignment */
        andc.   11, 3, 11       /* force address to be word-aligned */
 0:     lwarx   12, 0, 11       /* load old value */
@@ -102,7 +102,7 @@ ASENTRY(atomic_clear_16)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_add_16)
+ASENTRY_NOPROF(atomic_add_16)
        li      11, 3           /* mask to test for alignment */
        andc.   11, 3, 11       /* force address to be word-aligned */
 0:     lwarx   12, 0, 11       /* load old value */
@@ -119,7 +119,7 @@ ASENTRY(atomic_add_16)
        sync
        blr                     /* return */
 
-ASENTRY(atomic_subtract_16)
+ASENTRY_NOPROF(atomic_subtract_16)
        li      11, 3           /* mask to test for alignment */
        andc.   11, 3, 11       /* force address to be word-aligned */
 0:     lwarx   12, 0, 11       /* load old value */

Modified: head/sys/powerpc/powerpc/setjmp.S
==============================================================================
--- head/sys/powerpc/powerpc/setjmp.S   Fri Jan 20 22:31:52 2012        
(r230399)
+++ head/sys/powerpc/powerpc/setjmp.S   Fri Jan 20 22:34:19 2012        
(r230400)
@@ -42,7 +42,7 @@
 #define JMP_xer        24*REGWIDTH
 #define JMP_sig        25*REGWIDTH
 
-ASENTRY(setjmp)
+ASENTRY_NOPROF(setjmp)
        ST_REG 31, JMP_r31(3)
        /* r1, r2, r14-r30 */
        ST_REG 1,  JMP_r1 (3)
@@ -79,7 +79,7 @@ ASENTRY(setjmp)
 
 
 .extern sigsetmask
-ASENTRY(longjmp)
+ASENTRY_NOPROF(longjmp)
        LD_REG 31, JMP_r31(3)
        /* r1, r2, r14-r30 */
        LD_REG 1,  JMP_r1 (3)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to