Soft PMC support for ARM.

Callgraph is not captured, only current location.

Sample system wide profiling: "pmcstat -Sclock.hard -T"
This commit is contained in:
Fabien Thomas 2012-05-23 13:23:40 +00:00
parent b6062382be
commit 4cc50ab413
3 changed files with 26 additions and 11 deletions

View File

@ -674,9 +674,9 @@ fake_preload_metadata(void)
static uint32_t fake_preload[35];
fake_preload[i++] = MODINFO_NAME;
fake_preload[i++] = strlen("elf kernel") + 1;
strcpy((char*)&fake_preload[i++], "elf kernel");
i += 2;
fake_preload[i++] = strlen("kernel") + 1;
strcpy((char*)&fake_preload[i++], "kernel");
i += 1;
fake_preload[i++] = MODINFO_TYPE;
fake_preload[i++] = strlen("elf kernel") + 1;
strcpy((char*)&fake_preload[i++], "elf kernel");

View File

@ -54,6 +54,12 @@ union pmc_md_pmc {
#define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_usr_lr)
#define PMC_TRAPFRAME_TO_SP(TF) ((TF)->tf_usr_sp)
/* Build a fake kernel trapframe from current instruction pointer. */
#define PMC_FAKE_TRAPFRAME(TF) \
do { \
__asm __volatile("mov %0, pc" : "=r" ((TF)->tf_pc)); \
} while (0)
/*
* Prototypes
*/

View File

@ -38,38 +38,47 @@ __FBSDID("$FreeBSD$");
struct pmc_mdep *
pmc_md_initialize()
{
#ifdef CPU_XSCALE_IXP425
if (cpu_class == CPU_CLASS_XSCALE)
return pmc_xscale_initialize();
else
#endif
return NULL;
}
void
pmc_md_finalize(struct pmc_mdep *md)
{
#ifdef CPU_XSCALE_IXP425
if (cpu_class == CPU_CLASS_XSCALE)
pmc_xscale_finalize(md);
else
KASSERT(0, ("[arm,%d] Unknown CPU Class 0x%x", __LINE__,
cpu_class));
#endif
}
static int
pmc_save_callchain(uintptr_t *cc, int maxsamples,
struct trapframe *tf)
{
*cc = PMC_TRAPFRAME_TO_PC(tf);
return (1);
}
int
pmc_save_kernel_callchain(uintptr_t *cc, int maxsamples,
struct trapframe *tf)
{
(void) cc;
(void) maxsamples;
(void) tf;
return (0);
return pmc_save_callchain(cc, maxsamples, tf);
}
int
pmc_save_user_callchain(uintptr_t *cc, int maxsamples,
struct trapframe *tf)
{
(void) cc;
(void) maxsamples;
(void) tf;
return (0);
return pmc_save_callchain(cc, maxsamples, tf);
}