vkernel: Fix compilation with profiling support.
authorSascha Wildner <saw@online.de>
Thu, 17 May 2012 14:17:22 +0000 (16:17 +0200)
committerSascha Wildner <saw@online.de>
Thu, 17 May 2012 14:17:22 +0000 (16:17 +0200)
The vkernel is a special userland program in the regard that its Makefile
is generated by config(8), which is kind of tailored to the real kernel.

So first of all, we have to modify config(8) to detect it's a vkernel we
want to build and in this case it should not define GPROF which otherwise
activates the real kernel's profiling bits.

Then, modify libkern's mcount.c to skip kernel specific parts too.

Then, modify the vkernels' Makefiles to take into account ${PROF} (and
while we're here, ${DEBUG} too) which are set by the surrounding Makefile
which is generated by config(8).

The vkernel is now (from profiling point of view) treated like any other
userland program.

Last but not least, add some documentation about building a vkernel with
profiling support to vkernel's manpage.

To build with profiling, simply add CONFIGARGS=-p to the buildkernel
command line. It will need the config(8) program to be in /usr/obj's
btools dir, so either a buildworld with this commit needs to be done,
or config can be installed manually to /usr/sbin and nativekernel can
be used.

Tested-by: tuxillo
share/man/man7/vkernel.7
sys/libkern/mcount.c
sys/platform/vkernel/conf/Makefile
sys/platform/vkernel64/conf/Makefile
usr.sbin/config/mkmakefile.c

index dfbba05..faae0b3 100644 (file)
@@ -29,7 +29,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd August 10, 2011
+.Dd May 17, 2012
 .Dt VKERNEL 7
 .Os
 .Sh NAME
@@ -296,6 +296,17 @@ to ignore page faults processed by the virtual kernel itself and
 .Ql handle SIGUSR1 noprint
 to ignore signals used for simulating inter-processor interrupts (SMP build
 only).
+.Sh PROFILING
+To compile a vkernel with profiling support, the
+.Va CONFIGARGS
+variable needs to be used to pass
+.Fl p
+to
+.Xr config 8 .
+.Bd -literal
+cd /usr/src
+make -DNO_MODULES CONFIGARGS=-p buildkernel KERNCONF=VKERNEL
+.Ed
 .Sh FILES
 .Bl -tag -width ".It Pa /sys/config/VKERNEL" -compact
 .It Pa /sys/config/VKERNEL
@@ -487,6 +498,7 @@ vkernel# make MACHINE_PLATFORM=pc32 installworld
 .Xr vn 4 ,
 .Xr sysctl.conf 5 ,
 .Xr build 7 ,
+.Xr config 8 ,
 .Xr disklabel 8 ,
 .Xr ifconfig 8 ,
 .Xr vknetd 8 ,
index 1aa815e..adddc80 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/libkern/mcount.c,v 1.16 1999/12/29 04:54:41 peter Exp $
- * $DragonFly: src/sys/libkern/mcount.c,v 1.9 2007/01/12 22:12:50 dillon Exp $
  */
 
 #include <sys/param.h>
 #include <sys/gmon.h>
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
 #ifndef GUPROF
 #include <sys/systm.h>
 #endif
@@ -75,7 +74,7 @@ _MCOUNT_DECL(uintfptr_t frompc, uintfptr_t selfpc)
        struct tostruct *top, *prevtop;
        struct gmonparam *p;
        long toindex;
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
        MCOUNT_DECL(s)
 #endif
 
@@ -88,14 +87,14 @@ _MCOUNT_DECL(uintfptr_t frompc, uintfptr_t selfpc)
        if (p->state != GMON_PROF_ON)
                return;
 #endif
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
        MCOUNT_ENTER(s);
 #else
        p->state = GMON_PROF_BUSY;
 #endif
        frompci = frompc - p->lowpc;
 
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
        /*
         * When we are called from an exception handler, frompci may be
         * for a user address.  Convert such frompci's to the index of
@@ -143,7 +142,7 @@ _MCOUNT_DECL(uintfptr_t frompc, uintfptr_t selfpc)
        }
 #endif /* GUPROF */
 
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
        /*
         * When we are called from an exception handler, frompc is faked
         * to be for where the exception occurred.  We've just solidified
@@ -241,7 +240,7 @@ _MCOUNT_DECL(uintfptr_t frompc, uintfptr_t selfpc)
 
        }
 done:
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
        MCOUNT_EXIT(s);
 #else
        p->state = GMON_PROF_ON;
@@ -249,7 +248,7 @@ done:
        return;
 overflow:
        p->state = GMON_PROF_ERROR;
-#ifdef _KERNEL
+#if defined(_KERNEL) && !defined(_KERNEL_VIRTUAL)
        MCOUNT_EXIT(s);
 #endif
        return;
index 8ac1446..eb78ae8 100644 (file)
@@ -1,6 +1,5 @@
-# $DragonFly: src/sys/platform/vkernel/conf/Makefile,v 1.7 2007/07/01 02:51:41 dillon Exp $
-#
 # Which version of config(8) is required.
+#
 %VERSREQ=      400026
 
 .if !defined(S)
@@ -15,7 +14,7 @@ S=    ../..
 
 # Override the normal kernel link and link as a normal user program
 #
-SYSTEM_LD= @${CC} -g -export-dynamic -o ${.TARGET} ${SYSTEM_OBJS} vers.o -pthread
+SYSTEM_LD= @${CC} ${DEBUG} ${PROF} -export-dynamic -o ${.TARGET} ${SYSTEM_OBJS} vers.o -pthread
 
 %BEFORE_DEPEND
 
index 8ac1446..eb78ae8 100644 (file)
@@ -1,6 +1,5 @@
-# $DragonFly: src/sys/platform/vkernel/conf/Makefile,v 1.7 2007/07/01 02:51:41 dillon Exp $
-#
 # Which version of config(8) is required.
+#
 %VERSREQ=      400026
 
 .if !defined(S)
@@ -15,7 +14,7 @@ S=    ../..
 
 # Override the normal kernel link and link as a normal user program
 #
-SYSTEM_LD= @${CC} -g -export-dynamic -o ${.TARGET} ${SYSTEM_OBJS} vers.o -pthread
+SYSTEM_LD= @${CC} ${DEBUG} ${PROF} -export-dynamic -o ${.TARGET} ${SYSTEM_OBJS} vers.o -pthread
 
 %BEFORE_DEPEND
 
index f8b978c..6e0854f 100644 (file)
@@ -163,8 +163,11 @@ makefile(void)
        fprintf(ofp, ".makeenv MACHINE\n");
        fprintf(ofp, ".makeenv MACHINE_ARCH\n");
        fprintf(ofp, "IDENT=");
-       if (profiling)
-               fprintf(ofp, " -DGPROF");
+       if (profiling) {
+               /* Don't compile kernel profiling code for vkernel */
+               if (strncmp(platformname, "vkernel", 6) != 0)
+                       fprintf(ofp, " -DGPROF");
+       }
 
        if (cputype == 0) {
                printf("cpu type must be specified\n");