Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F173464715
D59771.id186988.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D59771.id186988.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D59771: hwpmc: record page size in PMC logs & fix analysis of binaries linked with large page sizes
Attached
Detach File
Event Timeline
Log In to Comment