Page MenuHomeFreeBSD

D59771.id186988.diff
No OneTemporary

D59771.id186988.diff

diff --git a/FreeBSD/lib/libpmc/pmclog.h b/FreeBSD/lib/libpmc/pmclog.h
--- a/FreeBSD/lib/libpmc/pmclog.h
+++ b/FreeBSD/lib/libpmc/pmclog.h
@@ -65,6 +65,7 @@
uint64_t pl_tsc_freq;
struct timespec pl_ts;
char pl_cpuid[PATH_MAX];
+ uint8_t pl_pageshift;
};
struct pmclog_ev_map_in {
diff --git a/FreeBSD/lib/libpmc/pmclog.c b/FreeBSD/lib/libpmc/pmclog.c
--- a/FreeBSD/lib/libpmc/pmclog.c
+++ b/FreeBSD/lib/libpmc/pmclog.c
@@ -330,6 +330,10 @@
le += sizeof(struct timespec)/4;
PMCLOG_READSTRING(le, ev->pl_u.pl_i.pl_cpuid, PMC_CPUID_LEN);
memcpy(ev->pl_u.pl_i.pl_cpuid, le, PMC_CPUID_LEN);
+ if (ev->pl_u.pl_i.pl_version >= PMC_VERSION_PAGESHIFT)
+ ev->pl_u.pl_i.pl_pageshift = ph->pl_pageshift;
+ else
+ ev->pl_u.pl_i.pl_pageshift = 0;
ps->ps_cpuid = strdup(ev->pl_u.pl_i.pl_cpuid);
ps->ps_version = ev->pl_u.pl_i.pl_version;
ps->ps_arch = ev->pl_u.pl_i.pl_arch;
diff --git a/FreeBSD/lib/libpmcstat/libpmcstat.h b/FreeBSD/lib/libpmcstat/libpmcstat.h
--- a/FreeBSD/lib/libpmcstat/libpmcstat.h
+++ b/FreeBSD/lib/libpmcstat/libpmcstat.h
@@ -132,6 +132,7 @@
int pa_mergepmc; /* merge PMC with same name */
double pa_duration; /* time duration */
uint32_t pa_tid;
+ uint8_t pa_pageshift; /* page shift recorded in log */
int pa_argc;
char **pa_argv;
STAILQ_HEAD(, pmcstat_ev) pa_events;
diff --git a/FreeBSD/lib/libpmcstat/libpmcstat_image.c b/FreeBSD/lib/libpmcstat/libpmcstat_image.c
--- a/FreeBSD/lib/libpmcstat/libpmcstat_image.c
+++ b/FreeBSD/lib/libpmcstat/libpmcstat_image.c
@@ -312,7 +312,7 @@
const char *path, *elfbase;
char *p, *endp;
bool first_exec_segment;
- uintfptr_t minva, maxva;
+ uintfptr_t minva, maxva, pagesize;
Elf *e;
Elf_Scn *scn;
GElf_Ehdr eh;
@@ -330,6 +330,11 @@
image->pi_dynlinkerpath = NULL;
image->pi_vaddr = 0;
+ if (args->pa_pageshift != 0)
+ pagesize = 1ULL << args->pa_pageshift;
+ else
+ pagesize = getpagesize();
+
path = pmcstat_string_unintern(image->pi_execpath);
assert(path != NULL);
@@ -421,7 +426,17 @@
case PT_LOAD:
if ((ph.p_flags & PF_X) != 0 &&
first_exec_segment) {
- image->pi_vaddr = ph.p_vaddr & (-ph.p_align);
+ if (image->pi_iskernelmodule) {
+ image->pi_vaddr = ph.p_vaddr &
+ (-ph.p_align);
+ } else {
+ /*
+ * User MAP_IN records depend
+ * on page size.
+ */
+ image->pi_vaddr = rounddown2(
+ ph.p_vaddr, pagesize);
+ }
first_exec_segment = false;
}
break;
diff --git a/FreeBSD/lib/libpmcstat/libpmcstat_logging.c b/FreeBSD/lib/libpmcstat/libpmcstat_logging.c
--- a/FreeBSD/lib/libpmcstat/libpmcstat_logging.c
+++ b/FreeBSD/lib/libpmcstat/libpmcstat_logging.c
@@ -215,6 +215,7 @@
warnx(
"WARNING: Log version 0x%x does not match compiled version 0x%x.",
ev.pl_u.pl_i.pl_version, PMC_VERSION_MAJOR);
+ args->pa_pageshift = ev.pl_u.pl_i.pl_pageshift;
break;
case PMCLOG_TYPE_MAP_IN:
diff --git a/FreeBSD/sys/dev/hwpmc/hwpmc_logging.c b/FreeBSD/sys/dev/hwpmc/hwpmc_logging.c
--- a/FreeBSD/sys/dev/hwpmc/hwpmc_logging.c
+++ b/FreeBSD/sys/dev/hwpmc/hwpmc_logging.c
@@ -121,6 +121,8 @@
} \
ph = (struct pmclog_header *)_le; \
ph->pl_header =_PMCLOG_TO_HEADER(TYPE,_len); \
+ ph->pl_pageshift = PAGE_SHIFT; \
+ bzero(ph->pl_spare, sizeof(ph->pl_spare)); \
ph->pl_tsc = (TSC); \
_le += sizeof(*ph) / 4 /* skip over timestamp */
@@ -139,6 +141,8 @@
} \
ph = (struct pmclog_header *)_le; \
ph->pl_header =_PMCLOG_TO_HEADER(TYPE,_len); \
+ ph->pl_pageshift = PAGE_SHIFT; \
+ bzero(ph->pl_spare, sizeof(ph->pl_spare)); \
ph->pl_tsc = tsc; \
_le += sizeof(*ph) / 4 /* skip over timestamp */
diff --git a/FreeBSD/sys/sys/pmc.h b/FreeBSD/sys/sys/pmc.h
--- a/FreeBSD/sys/sys/pmc.h
+++ b/FreeBSD/sys/sys/pmc.h
@@ -61,11 +61,13 @@
*/
#define PMC_VERSION_MAJOR 0x0A
#define PMC_VERSION_MINOR 0x02
-#define PMC_VERSION_PATCH 0x0000
+#define PMC_VERSION_PATCH 0x0001
#define PMC_VERSION (PMC_VERSION_MAJOR << 24 | \
PMC_VERSION_MINOR << 16 | PMC_VERSION_PATCH)
+#define PMC_VERSION_PAGESHIFT 0x0A020001
+
#define PMC_CPUID_LEN 64
/* cpu model name for pmu lookup */
extern char pmc_cpuid[PMC_CPUID_LEN];
diff --git a/FreeBSD/sys/sys/pmclog.h b/FreeBSD/sys/sys/pmclog.h
--- a/FreeBSD/sys/sys/pmclog.h
+++ b/FreeBSD/sys/sys/pmclog.h
@@ -93,7 +93,8 @@
#define PMCLOG_ENTRY_HEADER \
uint32_t pl_header; \
- uint32_t pl_spare; \
+ uint8_t pl_pageshift; \
+ uint8_t pl_spare[3]; \
uint64_t pl_tsc; \
struct pmclog_header {
diff --git a/FreeBSD/usr.sbin/pmc/view.hh b/FreeBSD/usr.sbin/pmc/view.hh
--- a/FreeBSD/usr.sbin/pmc/view.hh
+++ b/FreeBSD/usr.sbin/pmc/view.hh
@@ -389,6 +389,7 @@
void printvm(pid_t pid);
// Fields available to views
uint64_t tscfreq;
+ uint8_t pageshift;
std::unordered_map<uint32_t, uint32_t> pmcid;
std::unordered_map<uint32_t, struct pmcinfo> pmcinfo;
std::unordered_map<pid_t, struct procinfo> procs;
@@ -404,7 +405,7 @@
std::vector<struct pmcinfox> extpmcinfo;
std::map<uint32_t, struct cpuidleaf> cpuid; // x86 Only
private:
- image loadimage(const std::string &path);
+ image loadimage(const std::string &path, bool iskernel = false);
void mapimage(pid_t pid, const image &im, uint64_t linkaddr);
void loadsymboltable(image *im, Elf *e, Elf_Scn *scn, GElf_Shdr *sh);
void loadsymbols(image *im);
diff --git a/FreeBSD/usr.sbin/pmc/view.cc b/FreeBSD/usr.sbin/pmc/view.cc
--- a/FreeBSD/usr.sbin/pmc/view.cc
+++ b/FreeBSD/usr.sbin/pmc/view.cc
@@ -89,8 +89,8 @@
return ss.str();
}
-pmcview::pmcview() : tscfreq(0), pmcid(), pmcinfo(), procs(), tidtopid(),
- images(), sysroot(""), filter()
+pmcview::pmcview() : tscfreq(0), pageshift(0), pmcid(), pmcinfo(), procs(),
+ tidtopid(), images(), sysroot(""), filter()
{
char *root;
@@ -331,6 +331,7 @@
pmcview::process(struct pmclog_ev_initialize &p)
{
tscfreq = p.pl_tsc_freq;
+ pageshift = p.pl_pageshift;
}
void
@@ -436,7 +437,7 @@
* if the dwarf symbols are available.
*/
image
-pmcview::loadimage(const std::string &path)
+pmcview::loadimage(const std::string &path, bool iskernel)
{
std::string fullpath;
image im;
@@ -519,7 +520,12 @@
if (ph.p_type == PT_LOAD) {
if ((ph.p_flags & PF_X) != 0 && !foundexec) {
- im.vaddr = ph.p_vaddr & ~(ph.p_align - 1);
+ uint64_t alignment;
+
+ alignment = iskernel ? ph.p_align :
+ (pageshift != 0 ? 1ULL << pageshift :
+ (uint64_t)getpagesize());
+ im.vaddr = rounddown2(ph.p_vaddr, alignment);
foundexec = true;
}
}
@@ -728,7 +734,7 @@
// Kernel map-in events should be mapped to pid 0
pid_t pid = (p.pl_pid == -1) ? 0 : p.pl_pid;
- image im = loadimage(p.pl_pathname);
+ image im = loadimage(p.pl_pathname, p.pl_pid == -1);
mapimage(pid, im, p.pl_start);
}

File Metadata

Mime Type
text/plain
Expires
Sun, Sep 27, 3:48 AM (13 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39713761
Default Alt Text
D59771.id186988.diff (6 KB)

Event Timeline