aboutsummaryrefslogtreecommitdiff
path: root/lib/libpmc
diff options
context:
space:
mode:
authorJoseph Koshy <jkoshy@FreeBSD.org>2005-06-30 19:01:26 +0000
committerJoseph Koshy <jkoshy@FreeBSD.org>2005-06-30 19:01:26 +0000
commit151392465ff4392040311cf7120651bbeab8bd0c (patch)
tree65d154e0d10e4dfd78924cb57c52e53ed80a41dd /lib/libpmc
parent27a2197ea59368d39aa855d47798133e48e01125 (diff)
downloadsrc-151392465ff4392040311cf7120651bbeab8bd0c.tar.gz
src-151392465ff4392040311cf7120651bbeab8bd0c.zip
MFP4:
- pmcstat(8) gprof output mode fixes: lib/libpmc/pmclog.{c,h}, sys/sys/pmclog.h: + Add a 'is_usermode' field to the PMCLOG_PCSAMPLE event + Add an 'entryaddr' field to the PMCLOG_PROCEXEC event, so that pmcstat(8) can determine where the runtime loader /libexec/ld-elf.so.1 is getting loaded. sys/kern/kern_exec.c: + Use a local struct to group the entry address of the image being exec()'ed and the process credential changed flag to the exec handling hook inside hwpmc(4). usr.sbin/pmcstat/*: + Support "-k kernelpath", "-D sampledir". + Implement the ELF bits of 'gmon.out' profile generation in a new file "pmcstat_log.c". Move all log related functions to this file. + Move local definitions and prototypes to "pmcstat.h" - Other bug fixes: + lib/libpmc/pmclog.c: correctly handle EOF in pmclog_read(). + sys/dev/hwpmc_mod.c: unconditionally log a PROCEXIT event to all attached PMCs when a process exits. + sys/sys/pmc.h: correct a function prototype. + Improve usage checks in pmcstat(8). Approved by: re (blanket hwpmc)
Notes
Notes: svn path=/head/; revision=147708
Diffstat (limited to 'lib/libpmc')
-rw-r--r--lib/libpmc/pmclog.c9
-rw-r--r--lib/libpmc/pmclog.h3
2 files changed, 10 insertions, 2 deletions
diff --git a/lib/libpmc/pmclog.c b/lib/libpmc/pmclog.c
index 8772c5899b25..a6b70b5f5bb5 100644
--- a/lib/libpmc/pmclog.c
+++ b/lib/libpmc/pmclog.c
@@ -334,6 +334,7 @@ pmclog_get_event(void *cookie, char **data, ssize_t *len,
PMCLOG_READ32(le,ev->pl_u.pl_s.pl_pid);
PMCLOG_READADDR(le,ev->pl_u.pl_s.pl_pc);
PMCLOG_READ32(le,ev->pl_u.pl_s.pl_pmcid);
+ PMCLOG_READ32(le,ev->pl_u.pl_s.pl_usermode);
break;
case PMCLOG_TYPE_PMCALLOCATE:
PMCLOG_READ32(le,ev->pl_u.pl_a.pl_pmcid);
@@ -361,6 +362,8 @@ pmclog_get_event(void *cookie, char **data, ssize_t *len,
case PMCLOG_TYPE_PROCEXEC:
PMCLOG_GET_PATHLEN(pathlen,evlen,pmclog_procexec);
PMCLOG_READ32(le,ev->pl_u.pl_x.pl_pid);
+ PMCLOG_READADDR(le,ev->pl_u.pl_x.pl_entryaddr);
+ PMCLOG_READ32(le,ev->pl_u.pl_x.pl_pmcid);
PMCLOG_READSTRING(le,ev->pl_u.pl_x.pl_pathname,pathlen);
break;
case PMCLOG_TYPE_PROCEXIT:
@@ -436,8 +439,10 @@ pmclog_read(void *cookie, struct pmclog_ev *ev)
PMCLOG_BUFFER_SIZE);
if (nread <= 0) {
- ev->pl_state = nread < 0 ? PMCLOG_ERROR :
- PMCLOG_EOF;
+ if (nread == 0)
+ ev->pl_state = PMCLOG_EOF;
+ else if (errno != EAGAIN) /* not restartable */
+ ev->pl_state = PMCLOG_ERROR;
return -1;
}
diff --git a/lib/libpmc/pmclog.h b/lib/libpmc/pmclog.h
index 3e3119e29c90..bc3c476fe72e 100644
--- a/lib/libpmc/pmclog.h
+++ b/lib/libpmc/pmclog.h
@@ -61,6 +61,7 @@ struct pmclog_ev_pcsample {
uintfptr_t pl_pc;
pid_t pl_pid;
pmc_id_t pl_pmcid;
+ uint32_t pl_usermode;
};
struct pmclog_ev_pmcallocate {
@@ -89,6 +90,8 @@ struct pmclog_ev_proccsw {
struct pmclog_ev_procexec {
pid_t pl_pid;
+ pmc_id_t pl_pmcid;
+ uintfptr_t pl_entryaddr;
char pl_pathname[PATH_MAX];
};