First cut at hwpmc support on MIPS
Joseph Koshy
jkoshy at FreeBSD.org
Fri Feb 19 03:01:38 UTC 2010
> Please review and let me know if you have comments. I'd like to commit this
> in a week or so.
> http://people.freebsd.org/~gnn/mipshwpmc_1.diff
Nice work!
Review comments, adding to those already commented on:
1) There appears to be unnecessary gunk (UTF8?) in the manual page.
+.%B "MIPS32 24K Processor Core Family Software User<E2><80><99>s Manual"
...
+to a D-cache miss. The LSU can signal a <E2><80><9C>long stall<E2><80><9D> on a D-cache
etc.
You could use .Bq, .Sq. Plain ASCII quote marks would also work here.
2) The manual page is missing a short description of the capabilities
of these PMCs.
3) The code doesn't appear to support sampling; the manual page should
mention this.
4) The debug printf() in mips_intr should be removed:
+static int
+mips_intr(int cpu, struct trapframe *tf)
+{
+ printf("intr\n");
+ return 0;
+}
5) It would be help to split "hwpmc_mips.c" into two files:
- One for code specific to this PMC family. Say "hwpmc_mips24k.c".
- One for "generic" MIPS related code, e.g.,
code to walk stacks.
You should expect that every manufacturer will have their own kind
of PMCs, with differing capabilities and programming models.
Catering for the variability upfront would be prudent. As
commented on by earlier reviewers, you may want to consider
changing symbol naming to suit.
56 These definitions will cause trouble on 64 bit MIPS systems:
+#define PMCLOG_READADDR PMCLOG_READ32
+#define PMCLOG_EMITADDR PMCLOG_EMIT32
7) From the definitions in the header file, these PMCs appear to
support the concept of sampling based on processor mode:
+#define MIPS_PMC_USER_ENABLE 0x08 /* Count in USER mode */
+#define MIPS_PMC_SUPER_ENABLE 0x04 /* Count in SUPERVISOR mode */
+#define MIPS_PMC_KERNEL_ENABLE 0x02 /* Count in KERNEL mode */
If that is the case, then you should support those modifiers in
libpmc's event parsing. The libpmc code in the patch appears to be
a stub:
+static int
+mips_allocate_pmc(enum pmc_event pe, char *ctrspec __unused,
+ struct pmc_op_pmcallocate *pmc_config __unused)
+{
+ switch (pe) {
+ default:
+ break;
+ }
+
+ return (0);
+}
8) You can reduce the size of the following table in "hwpmc_mips.c",
by treating the pe_counter field as a set of flags.
+struct mips_event_code_map {
+ enum pmc_event pe_ev; /* enum value */
+ uint8_t pe_counter; /* Which counter this can be counted in. */
+ uint8_t pe_code; /* numeric code */
+};
+const struct mips_event_code_map mips_event_codes[] = {
+ { PMC_EV_MIPS_CYCLE, 0, 0},
+ { PMC_EV_MIPS_CYCLE, 1, 0}, <<<--- repeated information
9) You'd want to support flags that control counting based on
processor modes. For this, you would want to pass down flags
from userland and change the `pm_mips_evsel' field to suit:
+static int
+mips_allocate_pmc(int cpu, int ri, struct pmc *pm,
+ const struct pmc_op_pmcallocate *a)
+{
...
+ pm->pm_md.pm_mips.pm_mips_evsel = config;
10) If the number and width of these PMCs are fixed, you should
document that in the manual page:
pmc_md_initialize()
{
+ mips_npmcs = 2;
...
+ pcd->pcd_width = 32; /* XXX: Fix for 64 bit MIPS */
Regards,
Koshy
More information about the freebsd-embedded
mailing list