#ifndef _DEV_HWPMC_IBS_H_
#define _DEV_HWPMC_IBS_H_ 1
#define IBS_NPMCS 2
#define IBS_PMC_FETCH 0
#define IBS_PMC_OP 1
#define CPUID_IBSID 0x8000001B
#define CPUID_IBSID_IBSFFV 0x00000001
#define CPUID_IBSID_FETCHSAM 0x00000002
#define CPUID_IBSID_OPSAM 0x00000004
#define CPUID_IBSID_RDWROPCNT 0x00000008
#define CPUID_IBSID_OPCNT 0x00000010
#define CPUID_IBSID_BRNTRGT 0x00000020
#define CPUID_IBSID_OPCNTEXT 0x00000040
#define CPUID_IBSID_RIPINVALIDCHK 0x00000080
#define CPUID_IBSID_OPFUSE 0x00000010
#define CPUID_IBSID_IBSFETCHCTLEXTD 0x00000020
#define CPUID_IBSID_IBSOPDATA4 0x00000040
#define CPUID_IBSID_ZEN4IBSEXTENSIONS 0x00000080
#define CPUID_IBSID_IBSLOADLATENCYFILT 0x00000100
#define CPUID_IBSID_IBSUPDTDDTLBSTATS 0x00080000
#define IBS_CTL 0xC001103A
#define IBS_CTL_LVTOFFSETVALID (1ULL << 8)
#define IBS_CTL_LVTOFFSETMASK 0x0000000F
#define IBS_FETCH_MIN_RATE 65536
#define IBS_FETCH_MAX_RATE 1048560
#define IBS_OP_MIN_RATE 65536
#define IBS_OP_MAX_RATE 134217712
#define IBS_FETCH_CTL 0xC0011030
#define IBS_FETCH_CTL_L3MISS (1ULL << 61)
#define IBS_FETCH_CTL_OPCACHEMISS (1ULL << 60)
#define IBS_FETCH_CTL_L3MISSONLY (1ULL << 59)
#define IBS_FETCH_CTL_RANDOMIZE (1ULL << 57)
#define IBS_FETCH_CTL_L1TLBMISS (1ULL << 55)
#define IBS_FETCH_CTL_PHYSADDRVALID (1ULL << 52)
#define IBS_FETCH_CTL_ICMISS (1ULL << 51)
#define IBS_FETCH_CTL_COMPLETE (1ULL << 50)
#define IBS_FETCH_CTL_VALID (1ULL << 49)
#define IBS_FETCH_CTL_ENABLE (1ULL << 48)
#define IBS_FETCH_CTL_MAXCNTMASK 0x0000FFFFULL
#define IBS_FETCH_INTERVAL_TO_CTL(_c) (((_c) >> 4) & 0x0000FFFF)
#define IBS_FETCH_CTL_TO_LAT(_c) (((_c) >> 32) & 0x0000FFFF)
#define IBS_FETCH_LINADDR 0xC0011031
#define IBS_FETCH_PHYSADDR 0xC0011032
#define IBS_FETCH_EXTCTL 0xC001103C
#define PMC_MPIDX_FETCH_CTL 0
#define PMC_MPIDX_FETCH_EXTCTL 1
#define PMC_MPIDX_FETCH_LINADDR 2
#define PMC_MPIDX_FETCH_PHYSADDR 3
#define IBS_OP_CTL 0xC0011033
#define IBS_OP_CTL_LATFLTEN (1ULL << 63)
#define IBS_OP_CTL_COUNTERCONTROL (1ULL << 19)
#define IBS_OP_CTL_VALID (1ULL << 18)
#define IBS_OP_CTL_ENABLE (1ULL << 17)
#define IBS_OP_CTL_L3MISSONLY (1ULL << 16)
#define IBS_OP_CTL_MAXCNTMASK 0x07F0FFFFULL
#define IBS_OP_CTL_LDLAT_TO_CTL(_c) ((((ldlat) >> 7) - 1) << 59)
#define IBS_OP_INTERVAL_TO_CTL(_c) ((((_c) >> 4) & 0x0000FFFFULL) | ((_c) & 0x07F00000))
#define IBS_OP_RIP 0xC0011034
#define IBS_OP_DATA 0xC0011035
#define IBS_OP_DATA_RIPINVALID (1ULL << 38)
#define IBS_OP_DATA_BRANCHRETIRED (1ULL << 37)
#define IBS_OP_DATA_BRANCHMISPREDICTED (1ULL << 36)
#define IBS_OP_DATA_BRANCHTAKEN (1ULL << 35)
#define IBS_OP_DATA_RETURN (1ULL << 34)
#define IBS_OP_DATA2 0xC0011036
#define IBS_OP_DATA3 0xC0011037
#define IBS_OP_DATA3_DCPHYADDRVALID (1ULL << 18)
#define IBS_OP_DATA3_DCLINADDRVALID (1ULL << 17)
#define IBS_OP_DATA3_LOCKEDOP (1ULL << 15)
#define IBS_OP_DATA3_UCMEMACCESS (1ULL << 14)
#define IBS_OP_DATA3_WCMEMACCESS (1ULL << 13)
#define IBS_OP_DATA3_DCMISALIGN (1ULL << 8)
#define IBS_OP_DATA3_DCMISS (1ULL << 7)
#define IBS_OP_DATA3_DCL1TLBHIT1G (1ULL << 5)
#define IBS_OP_DATA3_DCL1TLBHIT2M (1ULL << 4)
#define IBS_OP_DATA3_DCL1TLBMISS (1ULL << 2)
#define IBS_OP_DATA3_STORE (1ULL << 1)
#define IBS_OP_DATA3_LOAD (1ULL << 0)
#define IBS_OP_DATA3_TO_DCLAT(_c) ((_c >> 32) & 0x0000FFFF)
#define IBS_OP_DC_LINADDR 0xC0011038
#define IBS_OP_DC_PHYSADDR 0xC0011039
#define IBS_TGT_RIP 0xC001103B
#define IBS_OP_DATA4 0xC001103D
#define IBS_OP_DATA4_LDRESYNC (1ULL << 0)
#define PMC_MPIDX_OP_CTL 0
#define PMC_MPIDX_OP_RIP 1
#define PMC_MPIDX_OP_DATA 2
#define PMC_MPIDX_OP_DATA2 3
#define PMC_MPIDX_OP_DATA3 4
#define PMC_MPIDX_OP_DC_LINADDR 5
#define PMC_MPIDX_OP_DC_PHYSADDR 6
#define PMC_MPIDX_OP_TGT_RIP 7
#define PMC_MPIDX_OP_DATA4 8
struct pmc_md_ibs_op_pmcallocate {
uint32_t ibs_flag;
uint32_t ibs_type;
uint64_t ibs_ctl;
uint64_t ibs_ctl2;
};
#ifdef _KERNEL
struct pmc_md_ibs_pmc {
uint32_t ibs_flag;
uint32_t ibs_type;
uint64_t ibs_ctl;
uint64_t ibs_ctl2;
};
#define IBS_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_SYSTEM | \
PMC_CAP_EDGE | PMC_CAP_QUALIFIER | PMC_CAP_PRECISE)
int pmc_ibs_initialize(struct pmc_mdep *md, int ncpu);
void pmc_ibs_finalize(struct pmc_mdep *md);
int pmc_ibs_intr(struct trapframe *tf);
#endif
#endif