Signed-off-by: Robert Richter <[EMAIL PROTECTED]>
---
examples/x86/smpl_amd64_ibs.c | 341 +++++++++++++++++++++++++++--------------
1 files changed, 224 insertions(+), 117 deletions(-)
diff --git a/examples/x86/smpl_amd64_ibs.c b/examples/x86/smpl_amd64_ibs.c
index ceb2fb8..73afc5e 100644
--- a/examples/x86/smpl_amd64_ibs.c
+++ b/examples/x86/smpl_amd64_ibs.c
@@ -4,6 +4,9 @@
* Copyright (c) 2007 Hewlett-Packard Development Company, L.P.
* Contributed by Stephane Eranian <[EMAIL PROTECTED]>
*
+ * Copyright (c) 2008 Advanced Mirco Devices Inc.
+ * Contributed by Robert Richter <[EMAIL PROTECTED]>
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
deal
* in the Software without restriction, including without limitation the rights
@@ -21,23 +24,17 @@
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#include <sys/types.h>
-#include <stdio.h>
+
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdint.h>
#include <getopt.h>
-#include <time.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/time.h>
-#include <sys/resource.h>
#include <perfmon/pfmlib.h>
#include <perfmon/pfmlib_amd64.h>
@@ -48,8 +45,15 @@
typedef struct {
int opt_no_show;
int opt_block;
+ int opt_setup;
} options_t;
+enum {
+ OPT_IBSOP, /* 0: default */
+ OPT_IBSFETCH,
+ OPT_IBSOP_NATIVE,
+};
+
typedef pfm_dfl_smpl_arg_t smpl_fmt_arg_t;
typedef pfm_dfl_smpl_hdr_t smpl_hdr_t;
typedef pfm_dfl_smpl_entry_t smpl_entry_t;
@@ -59,6 +63,9 @@ typedef pfm_dfl_smpl_arg_t smpl_arg_t;
#define NUM_PMCS PFMLIB_MAX_PMCS
#define NUM_PMDS PFMLIB_MAX_PMDS
+#define PMD_IBSOP_NUM 7
+#define PMD_IBSFETCH_NUM 3
+
static uint64_t collected_samples, collected_partial;
static options_t options;
@@ -66,58 +73,12 @@ static struct option the_options[]={
{ "help", 0, 0, 1},
{ "ovfl-block", 0, &options.opt_block, 1},
{ "no-show", 0, &options.opt_no_show, 1},
+ { "ibsop", 0, &options.opt_setup, OPT_IBSOP},
+ { "ibsfetch", 0, &options.opt_setup, OPT_IBSFETCH},
+ { "ibsop-native", 0, &options.opt_setup, OPT_IBSOP_NATIVE},
{ 0, 0, 0, 0}
};
-/*
- * This kind of register layout will eventually be available
- * from libpfm.
- */
-typedef struct {
- unsigned long ibscomptoretctr:16;
- unsigned long ibstagtoretctr:16;
- unsigned long ibsopbrnresync:1;
- unsigned long ibsopmispreturn:1;
- unsigned long ibsopreturn:1;
- unsigned long ibsopbrntaken:1;
- unsigned long ibsopbrnmisp:1;
- unsigned long ibsopbrnret:1;
- unsigned long res:26;
-} ibsopdata_t; /* MSR 0xc0011035 */
-
-typedef struct {
- unsigned long long nbibsreqsrc:3;
- unsigned long long res1:1;
- unsigned long long nbibsreqdstproc:1;
- unsigned long long nbibsreqcachehitst:1;
- unsigned long long res2:58;
-} ibsopdata2_t; /* MSR 0xc0011036 */
-
-typedef struct {
- unsigned long ibsldop:1;
- unsigned long ibsstop:1;
- unsigned long ibsdcl1tlbmiss:1;
- unsigned long ibsdcl2tlbmiss:1;
- unsigned long ibsdcl1tlbhit2m:1;
- unsigned long ibsdcl1tlbhit1g:1;
- unsigned long ibsdcl2tlbhit2m:1;
- unsigned long ibsdcmiss:1;
- unsigned long ibsdcmissacc:1;
- unsigned long ibsdcldbnkcon:1;
- unsigned long ibsdcstbnkcon:1;
- unsigned long ibsdcsttoldfwd:1;
- unsigned long ibsdcsttoldcan:1;
- unsigned long ibsdcucmemacc:1;
- unsigned long ibsdcwcmemacc:1;
- unsigned long ibsdclockedop:1;
- unsigned long ibsdcmabhit:1;
- unsigned long ibsdclinaddrvalid:1;
- unsigned long ibsdcphyaddrvalid:1;
- unsigned long res:13;
- unsigned long ibsdcmisslat:16;
- unsigned long res2:16;
-} ibsopdata3_t; /* MSR 0xc0011037 */
-
static void fatal_error(char *fmt,...) __attribute__((noreturn));
#define BPL (sizeof(uint64_t)<<3)
@@ -241,49 +202,49 @@ process_smpl_buf(smpl_hdr_t *hdr, uint64_t *smpl_pmds,
unsigned int num_smpl_pmd
printf("PMD%-3d:0x%016"PRIx64"
: comptoret=%u tagtoretctr=%u opbrnresync=%u opmispret=%u opret=%u brntk=%u
brnmips=%u bnrret=%u\n",
j,
*reg,
- opdata->ibscomptoretctr,
- opdata->ibstagtoretctr,
- opdata->ibsopbrnresync,
- opdata->ibsopmispreturn,
- opdata->ibsopreturn,
- opdata->ibsopbrntaken,
- opdata->ibsopbrnmisp,
- opdata->ibsopbrnret);
+
opdata->reg.ibscomptoretctr,
+
opdata->reg.ibstagtoretctr,
+
opdata->reg.ibsopbrnresync,
+
opdata->reg.ibsopmispreturn,
+ opdata->reg.ibsopreturn,
+
opdata->reg.ibsopbrntaken,
+
opdata->reg.ibsopbrnmisp,
+
opdata->reg.ibsopbrnret);
break;
case 10:
opdata2 = (ibsopdata2_t *)reg;
printf("PMD%-3d:0x%016"PRIx64"
: reqsrc=%u reqdstproc=%s reqcachehitst=%u\n",
j,
*reg,
- opdata2->nbibsreqsrc,
-
opdata2->nbibsreqdstproc ? "local" : "remote",
-
opdata2->nbibsreqcachehitst);
+
opdata2->reg.nbibsreqsrc,
+
opdata2->reg.nbibsreqdstproc ? "local" : "remote",
+
opdata2->reg.nbibsreqcachehitst);
break;
case 11:
opdata3 = (ibsopdata3_t *)reg;
printf("PMD%-3d:0x%016"PRIx64"
: ld=%u st=%u L1TLBmiss=%u L2TLBmiss=%u L1TLBhit2M=%u L1TLBhit1G=%u
L2TLBhit2M=%u miss=%u misalign=%u ld_bankconf=%u st_bankconf=%u
st_to_ld_conf=%u st_to_ld_canc=%u UCaccess=%u WCaccess=%u lock=%u MAB=%u
linevalid=%u physvalid=%u miss_lat=%u\n",
j,
*reg,
- opdata3->ibsldop,
- opdata3->ibsstop,
- opdata3->ibsdcl1tlbmiss,
- opdata3->ibsdcl2tlbmiss,
-
opdata3->ibsdcl1tlbhit2m,
-
opdata3->ibsdcl1tlbhit1g,
-
opdata3->ibsdcl2tlbhit2m,
- opdata3->ibsdcmiss,
- opdata3->ibsdcmissacc,
- opdata3->ibsdcldbnkcon,
- opdata3->ibsdcstbnkcon,
- opdata3->ibsdcsttoldfwd,
- opdata3->ibsdcsttoldcan,
- opdata3->ibsdcucmemacc,
- opdata3->ibsdcwcmemacc,
- opdata3->ibsdclockedop,
- opdata3->ibsdcmabhit,
-
opdata3->ibsdclinaddrvalid,
-
opdata3->ibsdcphyaddrvalid,
- opdata3->ibsdcmisslat);
+ opdata3->reg.ibsldop,
+ opdata3->reg.ibsstop,
+
opdata3->reg.ibsdcl1tlbmiss,
+
opdata3->reg.ibsdcl2tlbmiss,
+
opdata3->reg.ibsdcl1tlbhit2m,
+
opdata3->reg.ibsdcl1tlbhit1g,
+
opdata3->reg.ibsdcl2tlbhit2m,
+ opdata3->reg.ibsdcmiss,
+
opdata3->reg.ibsdcmissacc,
+
opdata3->reg.ibsdcldbnkcon,
+
opdata3->reg.ibsdcstbnkcon,
+
opdata3->reg.ibsdcsttoldfwd,
+
opdata3->reg.ibsdcsttoldcan,
+
opdata3->reg.ibsdcucmemacc,
+
opdata3->reg.ibsdcwcmemacc,
+
opdata3->reg.ibsdclockedop,
+
opdata3->reg.ibsdcmabhit,
+
opdata3->reg.ibsdclinaddrvalid,
+
opdata3->reg.ibsdcphyaddrvalid,
+
opdata3->reg.ibsdcmisslat);
break;
default:
@@ -305,34 +266,10 @@ skip:
last_count = hdr->hdr_count;
}
-
-int
-mainloop(char **arg)
+static int
+setup_pmu_ibsop_native(pfarg_pmc_t *pc, pfarg_pmd_t *pd)
{
- smpl_hdr_t *hdr;
- pfarg_ctx_t ctx;
- smpl_arg_t buf_arg;
- pfarg_pmd_t pd[NUM_PMDS];
- pfarg_pmc_t pc[NUM_PMCS];
- pfarg_load_t load_args;
- struct timeval start_time, end_time;
- pfarg_msg_t msg;
- uint64_t ovfl_count = 0, ibs_ops_smpl;
- size_t entry_size;
- void *buf_addr;
- pid_t pid;
- int status, ret, fd;
- int pmc_count, pmd_count;
- unsigned int num_smpl_pmds = 0;
-
- /*
- * intialize all locals
- */
- memset(&ctx, 0, sizeof(ctx));
- memset(&buf_arg, 0, sizeof(buf_arg));
- memset(pd, 0, sizeof(pd));
- memset(pc, 0, sizeof(pc));
- memset(&load_args, 0, sizeof(load_args));
+ uint64_t ibs_ops_smpl;
/*
* OBSCTL sampling period (20 bits)
@@ -378,9 +315,178 @@ mainloop(char **arg)
pfm_bv_set(pd[0].reg_smpl_pmds, 11);
pfm_bv_set(pd[0].reg_smpl_pmds, 12);
pfm_bv_set(pd[0].reg_smpl_pmds, 13);
+
+ return PFMLIB_SUCCESS;
+}
+
+static int
+setup_pmu_ibsop(pfarg_pmc_t *pc, pfarg_pmd_t *pd)
+{
+ pfmlib_amd64_input_param_t inp_mod;
+ pfmlib_output_param_t outp;
+ pfmlib_amd64_output_param_t outp_mod;
+ int ret;
+
+ memset(&inp_mod,0, sizeof(inp_mod));
+ memset(&outp,0, sizeof(outp));
+ memset(&outp_mod,0, sizeof(outp_mod));
+
+ /* setup ibsopctl register */
+ inp_mod.ibsopctl.reg.ibsopmaxcnt = 0xFFFF; /* 0xffff0 */
+ inp_mod.ibsopctl.reg.ibsopen = 1;
+ inp_mod.flags |= PFMLIB_AMD64_USE_IBSOP;
+
+ /* setup Perfmon2 registers */
+ ret = pfm_dispatch_events(NULL, &inp_mod, &outp, &outp_mod);
+ if (ret != PFMLIB_SUCCESS) {
+ fprintf(stderr, "cannot dispatch events: %s\n",
pfm_strerror(ret));
+ return ret;
+ }
+ if (outp.pfp_pmc_count != 1) {
+ fprintf(stderr, "Unexpected PMC register count: %d\n",
+ outp.pfp_pmc_count);
+ return PFMLIB_ERR_INVAL;
+ }
+ if (outp.pfp_pmd_count != 1) {
+ fprintf(stderr, "Unexpected PMD register count: %d\n",
+ outp.pfp_pmd_count);
+ return PFMLIB_ERR_INVAL;
+ }
+ if (outp_mod.ibsop_base != 0) {
+ fprintf(stderr, "Unexpected IBSOP base register: %d\n",
+ outp_mod.ibsop_base);
+ return PFMLIB_ERR_INVAL;
+ }
+
+ /* PMC_IBSOPCTL */
+ pc[0].reg_num = outp.pfp_pmcs[0].reg_num;
+ pc[0].reg_value = outp.pfp_pmcs[0].reg_value;
+ /* PMD_IBSOPCTL */
+ pd[0].reg_num = outp.pfp_pmds[0].reg_num;
+ pd[0].reg_value = 0;
+
+ /* setup all IBSOP registers for sampling */
+ pd[0].reg_flags = PFM_REGFL_OVFL_NOTIFY;
+ if (pd[0].reg_num > 64 - PMD_IBSOP_NUM) {
+ fprintf(stderr, "Unexpected IBSOP base: %d\n",
+ (int)pd[0].reg_num);
+ return PFMLIB_ERR_INVAL;
+ }
+ pd[0].reg_smpl_pmds[0] =
+ ((1UL << PMD_IBSOP_NUM) - 1) << outp.pfp_pmds[0].reg_num;
+
+ return PFMLIB_SUCCESS;
+}
+
+static int
+setup_pmu_ibsfetch(pfarg_pmc_t *pc, pfarg_pmd_t *pd)
+{
+ pfmlib_amd64_input_param_t inp_mod;
+ pfmlib_output_param_t outp;
+ pfmlib_amd64_output_param_t outp_mod;
+ int ret;
+
+ memset(&inp_mod,0, sizeof(inp_mod));
+ memset(&outp,0, sizeof(outp));
+ memset(&outp_mod,0, sizeof(outp_mod));
+
+ /* setup ibsfetchctl register */
+ inp_mod.ibsfetchctl.reg.ibsfetchmaxcnt = 0xFFFF; /* 0xffff0 */
+ inp_mod.ibsfetchctl.reg.ibsfetchen = 1;
+ inp_mod.flags |= PFMLIB_AMD64_USE_IBSFETCH;
+
+ /* setup Perfmon2 registers */
+ ret = pfm_dispatch_events(NULL, &inp_mod, &outp, &outp_mod);
+ if (ret != PFMLIB_SUCCESS) {
+ fprintf(stderr, "cannot dispatch events: %s\n",
pfm_strerror(ret));
+ return ret;
+ }
+ if (outp.pfp_pmc_count != 1) {
+ fprintf(stderr, "Unexpected PMC register count: %d\n",
+ outp.pfp_pmc_count);
+ return PFMLIB_ERR_INVAL;
+ }
+ if (outp.pfp_pmd_count != 1) {
+ fprintf(stderr, "Unexpected PMD register count: %d\n",
+ outp.pfp_pmd_count);
+ return PFMLIB_ERR_INVAL;
+ }
+ if (outp_mod.ibsfetch_base != 0) {
+ fprintf(stderr, "Unexpected IBSFETCH base register: %d\n",
+ outp_mod.ibsfetch_base);
+ return PFMLIB_ERR_INVAL;
+ }
+
+ /* PMC_IBSFETCHCTL */
+ pc[0].reg_num = outp.pfp_pmcs[0].reg_num;
+ pc[0].reg_value = outp.pfp_pmcs[0].reg_value;
+ /* PMD_IBSFETCHCTL */
+ pd[0].reg_num = outp.pfp_pmds[0].reg_num;
+ pd[0].reg_value = 0;
+
+ /* setup all IBSFETCH registers for sampling */
+ pd[0].reg_flags = PFM_REGFL_OVFL_NOTIFY;
+ if (pd[0].reg_num > 64 - PMD_IBSFETCH_NUM) {
+ fprintf(stderr, "Unexpected IBSFETCH base: %d\n",
+ (int)pd[0].reg_num);
+ return PFMLIB_ERR_INVAL;
+ }
+ pd[0].reg_smpl_pmds[0] =
+ ((1UL << PMD_IBSFETCH_NUM) - 1) << outp.pfp_pmds[0].reg_num;
+
+ return PFMLIB_SUCCESS;
+}
+
+int
+mainloop(char **arg)
+{
+ pfarg_pmc_t pc[1];
+ pfarg_pmd_t pd[1];
+
+ smpl_hdr_t *hdr;
+ pfarg_ctx_t ctx;
+ smpl_arg_t buf_arg;
+ pfarg_load_t load_arg;
+ struct timeval start_time, end_time;
+ pfarg_msg_t msg;
+ uint64_t ovfl_count = 0;
+ size_t entry_size;
+ void *buf_addr;
+ pid_t pid;
+ int status, ret, fd;
+ int pmc_count, pmd_count;
+ unsigned int num_smpl_pmds = 0;
+
+ memset(&ctx,0, sizeof(ctx));
+ memset(pd, 0, sizeof(pd));
+ memset(pc, 0, sizeof(pc));
+ memset(&load_arg, 0, sizeof(load_arg));
+
+ /* defaults */
num_smpl_pmds = 7;
pmc_count = pmd_count = 1;
+ switch (options.opt_setup) {
+ case OPT_IBSOP:
+ ret = setup_pmu_ibsop(pc, pd);
+ break;
+ case OPT_IBSOP_NATIVE:
+ ret = setup_pmu_ibsop_native(pc, pd);
+ break;
+ case OPT_IBSFETCH:
+ num_smpl_pmds = 3;
+ ret = setup_pmu_ibsfetch(pc, pd);
+ break;
+ default:
+ ret = PFMLIB_ERR_NOTSUPP;
+ break;
+ }
+
+ if (ret != PFMLIB_SUCCESS) {
+ fatal_error("Can't setup #%d\n", options.opt_setup);
+ exit(1);
+ }
+
/*
* in this example program, we use fixed-size entries, therefore we
* can compute the entry size in advance. Perfmon-2 supports variable
@@ -486,8 +592,8 @@ mainloop(char **arg)
/*
* attach context to stopped task
*/
- load_args.load_pid = pid;
- if (pfm_load_context (fd, &load_args))
+ load_arg.load_pid = pid;
+ if (pfm_load_context (fd, &load_arg))
fatal_error("pfm_load_context error errno %d\n",errno);
/*
@@ -577,7 +683,8 @@ terminate_session:
static void
usage(void)
{
- printf("usage: task_smpl [-h] [--help] [--no-show] [--ovfl-block]
cmd\n");
+ printf("usage: task_smpl [-h] [--help] [--no-show] [--ovfl-block] "
+ "[--ibsop] [--ibsfetch] [--ibsop-native] cmd\n");
}
int
--
1.5.3.7
--
Advanced Micro Devices, Inc.
Operating System Research Center
email: [EMAIL PROTECTED]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
perfmon2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel