From 586cc683d875b37dce82c825feb9ccc7d884b35e Mon Sep 17 00:00:00 2001 From: bde Date: Fri, 29 Dec 1995 15:30:05 +0000 Subject: Implemented non-statistical kernel profiling. This is based on looking at a high resolution clock for each of the following events: function call, function return, interrupt entry, interrupt exit, and interesting branches. The differences between the times of these events are added at appropriate places in a ordinary histogram (as if very fast statistical profiling sampled the pc at those places) so that ordinary gprof can be used to analyze the times. gmon.h: Histogram counters need to be 4 bytes for microsecond resolutions. They will need to be larger for the 586 clock. The comments were vax-centric and wrong even on vaxes. Does anyone disagree? gprof4.c: The standard gprof should support counters of all integral sizes and the size of the counter should be in the gmon header. This hack will do until then. (Use gprof4 -u to examine the results of non-statistical profiling.) config/*: Non-statistical profiling is configured with `config -pp'. `config -p' still gives ordinary profiling. kgmon/*: Non-statistical profiling is enabled with `kgmon -B'. `kgmon -b' still enables ordinary profiling (and distables non-statistical profiling) if non-statistical profiling is configured. --- usr.sbin/config/config.8 | 5 +++++ usr.sbin/config/mkmakefile.c | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'usr.sbin/config') diff --git a/usr.sbin/config/config.8 b/usr.sbin/config/config.8 index 5f93a86..32cb360 100644 --- a/usr.sbin/config/config.8 +++ b/usr.sbin/config/config.8 @@ -88,6 +88,11 @@ will configure a system for profiling; for example, .Xr kgmon 8 and .Xr gprof 1 . +If two or more +.Fl p +options are supplied, +.Nm config +will configure a system for high resolution profiling. .It Fl n If the .Fl n diff --git a/usr.sbin/config/mkmakefile.c b/usr.sbin/config/mkmakefile.c index 8f6ca3a..f8e01d0 100644 --- a/usr.sbin/config/mkmakefile.c +++ b/usr.sbin/config/mkmakefile.c @@ -157,8 +157,10 @@ makefile() } fprintf(ofp, "KERN_IDENT=%s\n", raise(ident)); fprintf(ofp, "IDENT="); - if (profiling) + if (profiling >= 1) fprintf(ofp, " -DGPROF"); + if (profiling >= 2) + fprintf(ofp, " -DGPROF4 -DGUPROF"); if (cputype == 0) { printf("cpu type must be specified\n"); @@ -202,8 +204,10 @@ makefile() fprintf(ofp, "%s=%s\n", op->op_name, op->op_value); if (debugging) fprintf(ofp, "DEBUG=-g\n"); - if (profiling) + if (profiling >= 1) fprintf(ofp, "PROF=-pg\n"); + if (profiling >= 2) + fprintf(ofp, "PROF+=-mprofiler-epilogue\n"); while (fgets(line, BUFSIZ, ifp) != 0) { if (*line != '%') { fprintf(ofp, "%s", line); -- cgit v1.1