diff options
author | Joseph Koshy <jkoshy@FreeBSD.org> | 2005-06-30 19:01:26 +0000 |
---|---|---|
committer | Joseph Koshy <jkoshy@FreeBSD.org> | 2005-06-30 19:01:26 +0000 |
commit | 151392465ff4392040311cf7120651bbeab8bd0c (patch) | |
tree | 65d154e0d10e4dfd78924cb57c52e53ed80a41dd /lib/libpmc | |
parent | 27a2197ea59368d39aa855d47798133e48e01125 (diff) | |
download | src-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.c | 9 | ||||
-rw-r--r-- | lib/libpmc/pmclog.h | 3 |
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]; }; |