mirror of https://github.com/torvalds/linux.git
arm64 fixes for -rc1
- Preserve old 'tt_core' UAPI for Hisilicon L3C PMU driver. - Ensure linear alias of kprobes instruction page is not writable. - Fix kernel stack unwinding from BPF. - Fix build warnings from the Fujitsu uncore PMU documentation. - Fix hang with deferred 'struct page' initialisation and MTE. - Consolidate KPTI page-table re-writing code. -----BEGIN PGP SIGNATURE----- iQFEBAABCgAuFiEEPxTL6PPUbjXGY88ct6xw3ITBYzQFAmjj0Q0QHHdpbGxAa2Vy bmVsLm9yZwAKCRC3rHDchMFjNJRvCACkC6isoQt+EdcS658ulgQJux9dqqJZq5uk IdSFmorYd+MZfRcXe0HQ/rSJcAHzZH2gS1MvSeD1JfILPnY1ZkCFWHxsDdKK0Yc7 Sn+3xYw07qpBiq/hCvf9udTCl61vJveexUazV+FgOd9cT+cQOtkqW98uggjOx6Ry HeECTovZ6NR23pB9NSu5l6lMbAOKZvbDuBYDOujYn/X5jP4v6qlGJTdB2YOA/qPy C3aOcqCOWuET6uQ5iGeXWEB+RF6QCNuqjgQYo745Q+yKFdfZ60wokP8Fv2GERzlu LO8YkYCzZRJF+lBbL8KfTjRE/fC6f0rHx9Zensm7FH9WsaDO/mWw =xrAV -----END PGP SIGNATURE----- Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux Pull arm64 fixes from Will Deacon: - Preserve old 'tt_core' UAPI for Hisilicon L3C PMU driver - Ensure linear alias of kprobes instruction page is not writable - Fix kernel stack unwinding from BPF - Fix build warnings from the Fujitsu uncore PMU documentation - Fix hang with deferred 'struct page' initialisation and MTE - Consolidate KPTI page-table re-writing code * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64: mte: Do not flag the zero page as PG_mte_tagged docs: perf: Fujitsu: Fix htmldocs build warnings and errors arm64: mm: Move KPTI helpers to mmu.c tracing: Fix the bug where bpf_get_stackid returns -EFAULT on the ARM64 arm64: kprobes: call set_memory_rox() for kprobe page drivers/perf: hisi: Add tt_core_deprecated for compatibility
This commit is contained in:
commit
971199ad2a
|
|
@ -15,15 +15,19 @@ The driver provides a description of its available events and configuration
|
|||
options in sysfs, see /sys/bus/event_sources/devices/mac_iod<iod>_mac<mac>_ch<ch>/
|
||||
and /sys/bus/event_sources/devices/pci_iod<iod>_pci<pci>/.
|
||||
This driver exports:
|
||||
|
||||
- formats, used by perf user space and other tools to configure events
|
||||
- events, used by perf user space and other tools to create events
|
||||
symbolically, e.g.:
|
||||
symbolically, e.g.::
|
||||
|
||||
perf stat -a -e mac_iod0_mac0_ch0/event=0x21/ ls
|
||||
perf stat -a -e pci_iod0_pci0/event=0x24/ ls
|
||||
|
||||
- cpumask, used by perf user space and other tools to know on which CPUs
|
||||
to open the events
|
||||
|
||||
This driver supports the following events for MAC:
|
||||
|
||||
- cycles
|
||||
This event counts MAC cycles at MAC frequency.
|
||||
- read-count
|
||||
|
|
@ -77,6 +81,7 @@ Examples for use with perf::
|
|||
perf stat -e mac_iod0_mac0_ch0/ea-mac/ ls
|
||||
|
||||
And, this driver supports the following events for PCI:
|
||||
|
||||
- pci-port0-cycles
|
||||
This event counts PCI cycles at PCI frequency in port0.
|
||||
- pci-port0-read-count
|
||||
|
|
|
|||
|
|
@ -66,6 +66,10 @@ specified as a bitmap::
|
|||
|
||||
This will only count the operations from core/thread 0 and 1 in this cluster.
|
||||
|
||||
User should not use tt_core_deprecated to specify the core/thread filtering.
|
||||
This option is provided for backward compatiblility and only support 8bit
|
||||
which may not cover all the core/thread sharing L3C.
|
||||
|
||||
2. Tracetag allow the user to chose to count only read, write or atomic
|
||||
operations via the tt_req parameeter in perf. The default value counts all
|
||||
operations. tt_req is 3bits, 3'b100 represents read operations, 3'b101
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ ftrace_partial_regs(const struct ftrace_regs *fregs, struct pt_regs *regs)
|
|||
regs->pc = afregs->pc;
|
||||
regs->regs[29] = afregs->fp;
|
||||
regs->regs[30] = afregs->lr;
|
||||
regs->pstate = PSR_MODE_EL1h;
|
||||
return regs;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,6 @@ extern void create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys,
|
|||
extern void *fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot);
|
||||
extern void mark_linear_text_alias_ro(void);
|
||||
extern int split_kernel_leaf_mapping(unsigned long start, unsigned long end);
|
||||
extern void init_idmap_kpti_bbml2_flag(void);
|
||||
extern void linear_map_maybe_split_to_ptes(void);
|
||||
|
||||
/*
|
||||
|
|
@ -107,5 +106,11 @@ static inline bool kaslr_requires_kpti(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||
void kpti_install_ng_mappings(void);
|
||||
#else
|
||||
static inline void kpti_install_ng_mappings(void) {}
|
||||
#endif
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1941,104 +1941,6 @@ static bool has_pmuv3(const struct arm64_cpu_capabilities *entry, int scope)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||
#define KPTI_NG_TEMP_VA (-(1UL << PMD_SHIFT))
|
||||
|
||||
extern
|
||||
void create_kpti_ng_temp_pgd(pgd_t *pgdir, phys_addr_t phys, unsigned long virt,
|
||||
phys_addr_t size, pgprot_t prot,
|
||||
phys_addr_t (*pgtable_alloc)(enum pgtable_type), int flags);
|
||||
|
||||
static phys_addr_t __initdata kpti_ng_temp_alloc;
|
||||
|
||||
static phys_addr_t __init kpti_ng_pgd_alloc(enum pgtable_type type)
|
||||
{
|
||||
kpti_ng_temp_alloc -= PAGE_SIZE;
|
||||
return kpti_ng_temp_alloc;
|
||||
}
|
||||
|
||||
static int __init __kpti_install_ng_mappings(void *__unused)
|
||||
{
|
||||
typedef void (kpti_remap_fn)(int, int, phys_addr_t, unsigned long);
|
||||
extern kpti_remap_fn idmap_kpti_install_ng_mappings;
|
||||
kpti_remap_fn *remap_fn;
|
||||
|
||||
int cpu = smp_processor_id();
|
||||
int levels = CONFIG_PGTABLE_LEVELS;
|
||||
int order = order_base_2(levels);
|
||||
u64 kpti_ng_temp_pgd_pa = 0;
|
||||
pgd_t *kpti_ng_temp_pgd;
|
||||
u64 alloc = 0;
|
||||
|
||||
if (levels == 5 && !pgtable_l5_enabled())
|
||||
levels = 4;
|
||||
else if (levels == 4 && !pgtable_l4_enabled())
|
||||
levels = 3;
|
||||
|
||||
remap_fn = (void *)__pa_symbol(idmap_kpti_install_ng_mappings);
|
||||
|
||||
if (!cpu) {
|
||||
alloc = __get_free_pages(GFP_ATOMIC | __GFP_ZERO, order);
|
||||
kpti_ng_temp_pgd = (pgd_t *)(alloc + (levels - 1) * PAGE_SIZE);
|
||||
kpti_ng_temp_alloc = kpti_ng_temp_pgd_pa = __pa(kpti_ng_temp_pgd);
|
||||
|
||||
//
|
||||
// Create a minimal page table hierarchy that permits us to map
|
||||
// the swapper page tables temporarily as we traverse them.
|
||||
//
|
||||
// The physical pages are laid out as follows:
|
||||
//
|
||||
// +--------+-/-------+-/------ +-/------ +-\\\--------+
|
||||
// : PTE[] : | PMD[] : | PUD[] : | P4D[] : ||| PGD[] :
|
||||
// +--------+-\-------+-\------ +-\------ +-///--------+
|
||||
// ^
|
||||
// The first page is mapped into this hierarchy at a PMD_SHIFT
|
||||
// aligned virtual address, so that we can manipulate the PTE
|
||||
// level entries while the mapping is active. The first entry
|
||||
// covers the PTE[] page itself, the remaining entries are free
|
||||
// to be used as a ad-hoc fixmap.
|
||||
//
|
||||
create_kpti_ng_temp_pgd(kpti_ng_temp_pgd, __pa(alloc),
|
||||
KPTI_NG_TEMP_VA, PAGE_SIZE, PAGE_KERNEL,
|
||||
kpti_ng_pgd_alloc, 0);
|
||||
}
|
||||
|
||||
cpu_install_idmap();
|
||||
remap_fn(cpu, num_online_cpus(), kpti_ng_temp_pgd_pa, KPTI_NG_TEMP_VA);
|
||||
cpu_uninstall_idmap();
|
||||
|
||||
if (!cpu) {
|
||||
free_pages(alloc, order);
|
||||
arm64_use_ng_mappings = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init kpti_install_ng_mappings(void)
|
||||
{
|
||||
/* Check whether KPTI is going to be used */
|
||||
if (!arm64_kernel_unmapped_at_el0())
|
||||
return;
|
||||
|
||||
/*
|
||||
* We don't need to rewrite the page-tables if either we've done
|
||||
* it already or we have KASLR enabled and therefore have not
|
||||
* created any global mappings at all.
|
||||
*/
|
||||
if (arm64_use_ng_mappings)
|
||||
return;
|
||||
|
||||
init_idmap_kpti_bbml2_flag();
|
||||
stop_machine(__kpti_install_ng_mappings, NULL, cpu_online_mask);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void kpti_install_ng_mappings(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */
|
||||
|
||||
static void cpu_enable_kpti(struct arm64_cpu_capabilities const *cap)
|
||||
{
|
||||
if (__this_cpu_read(this_cpu_vector) == vectors) {
|
||||
|
|
@ -2419,17 +2321,21 @@ static void bti_enable(const struct arm64_cpu_capabilities *__unused)
|
|||
#ifdef CONFIG_ARM64_MTE
|
||||
static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap)
|
||||
{
|
||||
static bool cleared_zero_page = false;
|
||||
|
||||
sysreg_clear_set(sctlr_el1, 0, SCTLR_ELx_ATA | SCTLR_EL1_ATA0);
|
||||
|
||||
mte_cpu_setup();
|
||||
|
||||
/*
|
||||
* Clear the tags in the zero page. This needs to be done via the
|
||||
* linear map which has the Tagged attribute.
|
||||
* linear map which has the Tagged attribute. Since this page is
|
||||
* always mapped as pte_special(), set_pte_at() will not attempt to
|
||||
* clear the tags or set PG_mte_tagged.
|
||||
*/
|
||||
if (try_page_mte_tagging(ZERO_PAGE(0))) {
|
||||
if (!cleared_zero_page) {
|
||||
cleared_zero_page = true;
|
||||
mte_clear_page_tags(lm_alias(empty_zero_page));
|
||||
set_page_mte_tagged(ZERO_PAGE(0));
|
||||
}
|
||||
|
||||
kasan_init_hw_tags_cpu();
|
||||
|
|
|
|||
|
|
@ -478,7 +478,7 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
|
|||
if (folio_test_hugetlb(folio))
|
||||
WARN_ON_ONCE(!folio_test_hugetlb_mte_tagged(folio));
|
||||
else
|
||||
WARN_ON_ONCE(!page_mte_tagged(page));
|
||||
WARN_ON_ONCE(!page_mte_tagged(page) && !is_zero_page(page));
|
||||
|
||||
/* limit access to the end of the page */
|
||||
offset = offset_in_page(addr);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#define pr_fmt(fmt) "kprobes: " fmt
|
||||
|
||||
#include <linux/execmem.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/kasan.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
@ -41,6 +42,17 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
|||
static void __kprobes
|
||||
post_kprobe_handler(struct kprobe *, struct kprobe_ctlblk *, struct pt_regs *);
|
||||
|
||||
void *alloc_insn_page(void)
|
||||
{
|
||||
void *addr;
|
||||
|
||||
addr = execmem_alloc(EXECMEM_KPROBES, PAGE_SIZE);
|
||||
if (!addr)
|
||||
return NULL;
|
||||
set_memory_rox((unsigned long)addr, 1);
|
||||
return addr;
|
||||
}
|
||||
|
||||
static void __kprobes arch_prepare_ss_slot(struct kprobe *p)
|
||||
{
|
||||
kprobe_opcode_t *addr = p->ainsn.xol_insn;
|
||||
|
|
|
|||
|
|
@ -470,14 +470,6 @@ static void __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys,
|
|||
mutex_unlock(&fixmap_lock);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||
extern __alias(__create_pgd_mapping_locked)
|
||||
void create_kpti_ng_temp_pgd(pgd_t *pgdir, phys_addr_t phys, unsigned long virt,
|
||||
phys_addr_t size, pgprot_t prot,
|
||||
phys_addr_t (*pgtable_alloc)(enum pgtable_type),
|
||||
int flags);
|
||||
#endif
|
||||
|
||||
#define INVALID_PHYS_ADDR (-1ULL)
|
||||
|
||||
static phys_addr_t __pgd_pgtable_alloc(struct mm_struct *mm, gfp_t gfp,
|
||||
|
|
@ -823,7 +815,7 @@ static bool linear_map_requires_bbml2 __initdata;
|
|||
|
||||
u32 idmap_kpti_bbml2_flag;
|
||||
|
||||
void __init init_idmap_kpti_bbml2_flag(void)
|
||||
static void __init init_idmap_kpti_bbml2_flag(void)
|
||||
{
|
||||
WRITE_ONCE(idmap_kpti_bbml2_flag, 1);
|
||||
/* Must be visible to other CPUs before stop_machine() is called. */
|
||||
|
|
@ -1135,7 +1127,93 @@ static void __init declare_vma(struct vm_struct *vma,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||
static pgprot_t kernel_exec_prot(void)
|
||||
#define KPTI_NG_TEMP_VA (-(1UL << PMD_SHIFT))
|
||||
|
||||
static phys_addr_t kpti_ng_temp_alloc __initdata;
|
||||
|
||||
static phys_addr_t __init kpti_ng_pgd_alloc(enum pgtable_type type)
|
||||
{
|
||||
kpti_ng_temp_alloc -= PAGE_SIZE;
|
||||
return kpti_ng_temp_alloc;
|
||||
}
|
||||
|
||||
static int __init __kpti_install_ng_mappings(void *__unused)
|
||||
{
|
||||
typedef void (kpti_remap_fn)(int, int, phys_addr_t, unsigned long);
|
||||
extern kpti_remap_fn idmap_kpti_install_ng_mappings;
|
||||
kpti_remap_fn *remap_fn;
|
||||
|
||||
int cpu = smp_processor_id();
|
||||
int levels = CONFIG_PGTABLE_LEVELS;
|
||||
int order = order_base_2(levels);
|
||||
u64 kpti_ng_temp_pgd_pa = 0;
|
||||
pgd_t *kpti_ng_temp_pgd;
|
||||
u64 alloc = 0;
|
||||
|
||||
if (levels == 5 && !pgtable_l5_enabled())
|
||||
levels = 4;
|
||||
else if (levels == 4 && !pgtable_l4_enabled())
|
||||
levels = 3;
|
||||
|
||||
remap_fn = (void *)__pa_symbol(idmap_kpti_install_ng_mappings);
|
||||
|
||||
if (!cpu) {
|
||||
alloc = __get_free_pages(GFP_ATOMIC | __GFP_ZERO, order);
|
||||
kpti_ng_temp_pgd = (pgd_t *)(alloc + (levels - 1) * PAGE_SIZE);
|
||||
kpti_ng_temp_alloc = kpti_ng_temp_pgd_pa = __pa(kpti_ng_temp_pgd);
|
||||
|
||||
//
|
||||
// Create a minimal page table hierarchy that permits us to map
|
||||
// the swapper page tables temporarily as we traverse them.
|
||||
//
|
||||
// The physical pages are laid out as follows:
|
||||
//
|
||||
// +--------+-/-------+-/------ +-/------ +-\\\--------+
|
||||
// : PTE[] : | PMD[] : | PUD[] : | P4D[] : ||| PGD[] :
|
||||
// +--------+-\-------+-\------ +-\------ +-///--------+
|
||||
// ^
|
||||
// The first page is mapped into this hierarchy at a PMD_SHIFT
|
||||
// aligned virtual address, so that we can manipulate the PTE
|
||||
// level entries while the mapping is active. The first entry
|
||||
// covers the PTE[] page itself, the remaining entries are free
|
||||
// to be used as a ad-hoc fixmap.
|
||||
//
|
||||
__create_pgd_mapping_locked(kpti_ng_temp_pgd, __pa(alloc),
|
||||
KPTI_NG_TEMP_VA, PAGE_SIZE, PAGE_KERNEL,
|
||||
kpti_ng_pgd_alloc, 0);
|
||||
}
|
||||
|
||||
cpu_install_idmap();
|
||||
remap_fn(cpu, num_online_cpus(), kpti_ng_temp_pgd_pa, KPTI_NG_TEMP_VA);
|
||||
cpu_uninstall_idmap();
|
||||
|
||||
if (!cpu) {
|
||||
free_pages(alloc, order);
|
||||
arm64_use_ng_mappings = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init kpti_install_ng_mappings(void)
|
||||
{
|
||||
/* Check whether KPTI is going to be used */
|
||||
if (!arm64_kernel_unmapped_at_el0())
|
||||
return;
|
||||
|
||||
/*
|
||||
* We don't need to rewrite the page-tables if either we've done
|
||||
* it already or we have KASLR enabled and therefore have not
|
||||
* created any global mappings at all.
|
||||
*/
|
||||
if (arm64_use_ng_mappings)
|
||||
return;
|
||||
|
||||
init_idmap_kpti_bbml2_flag();
|
||||
stop_machine(__kpti_install_ng_mappings, NULL, cpu_online_mask);
|
||||
}
|
||||
|
||||
static pgprot_t __init kernel_exec_prot(void)
|
||||
{
|
||||
return rodata_enabled ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,6 +57,11 @@
|
|||
#define L3C_V2_NR_EVENTS 0xFF
|
||||
|
||||
HISI_PMU_EVENT_ATTR_EXTRACTOR(ext, config, 17, 16);
|
||||
/*
|
||||
* Remain the config1:0-7 for backward compatibility if some existing users
|
||||
* hardcode the config1:0-7 directly without parsing the sysfs attribute.
|
||||
*/
|
||||
HISI_PMU_EVENT_ATTR_EXTRACTOR(tt_core_deprecated, config1, 7, 0);
|
||||
HISI_PMU_EVENT_ATTR_EXTRACTOR(tt_req, config1, 10, 8);
|
||||
HISI_PMU_EVENT_ATTR_EXTRACTOR(datasrc_cfg, config1, 15, 11);
|
||||
HISI_PMU_EVENT_ATTR_EXTRACTOR(datasrc_skt, config1, 16, 16);
|
||||
|
|
@ -95,6 +100,21 @@ static bool support_ext(struct hisi_l3c_pmu *pmu)
|
|||
return l3c_pmu_ext->support_ext;
|
||||
}
|
||||
|
||||
/*
|
||||
* tt_core was extended to cover all the CPUs sharing the L3 and was moved from
|
||||
* config1:0-7 to config2:0-*. Try it first and fallback to tt_core_deprecated
|
||||
* if user's still using the deprecated one.
|
||||
*/
|
||||
static u32 hisi_l3c_pmu_get_tt_core(struct perf_event *event)
|
||||
{
|
||||
u32 core = hisi_get_tt_core(event);
|
||||
|
||||
if (core)
|
||||
return core;
|
||||
|
||||
return hisi_get_tt_core_deprecated(event);
|
||||
}
|
||||
|
||||
static int hisi_l3c_pmu_get_event_idx(struct perf_event *event)
|
||||
{
|
||||
struct hisi_pmu *l3c_pmu = to_hisi_pmu(event->pmu);
|
||||
|
|
@ -259,7 +279,7 @@ static void hisi_l3c_pmu_clear_ds(struct perf_event *event)
|
|||
static void hisi_l3c_pmu_config_core_tracetag(struct perf_event *event)
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
u32 core = hisi_get_tt_core(event);
|
||||
u32 core = hisi_l3c_pmu_get_tt_core(event);
|
||||
|
||||
if (core) {
|
||||
u32 val;
|
||||
|
|
@ -280,7 +300,7 @@ static void hisi_l3c_pmu_config_core_tracetag(struct perf_event *event)
|
|||
static void hisi_l3c_pmu_clear_core_tracetag(struct perf_event *event)
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
u32 core = hisi_get_tt_core(event);
|
||||
u32 core = hisi_l3c_pmu_get_tt_core(event);
|
||||
|
||||
if (core) {
|
||||
u32 val;
|
||||
|
|
@ -300,7 +320,7 @@ static void hisi_l3c_pmu_clear_core_tracetag(struct perf_event *event)
|
|||
|
||||
static bool hisi_l3c_pmu_have_filter(struct perf_event *event)
|
||||
{
|
||||
return hisi_get_tt_req(event) || hisi_get_tt_core(event) ||
|
||||
return hisi_get_tt_req(event) || hisi_l3c_pmu_get_tt_core(event) ||
|
||||
hisi_get_datasrc_cfg(event) || hisi_get_datasrc_skt(event);
|
||||
}
|
||||
|
||||
|
|
@ -331,6 +351,9 @@ static int hisi_l3c_pmu_check_filter(struct perf_event *event)
|
|||
if (ext < 0 || ext > hisi_l3c_pmu->ext_num)
|
||||
return -EINVAL;
|
||||
|
||||
if (hisi_get_tt_core(event) && hisi_get_tt_core_deprecated(event))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -602,10 +625,11 @@ static const struct attribute_group hisi_l3c_pmu_v1_format_group = {
|
|||
|
||||
static struct attribute *hisi_l3c_pmu_v2_format_attr[] = {
|
||||
HISI_PMU_FORMAT_ATTR(event, "config:0-7"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_core, "config2:0-15"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_core_deprecated, "config1:0-7"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_req, "config1:8-10"),
|
||||
HISI_PMU_FORMAT_ATTR(datasrc_cfg, "config1:11-15"),
|
||||
HISI_PMU_FORMAT_ATTR(datasrc_skt, "config1:16"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_core, "config2:0-15"),
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
@ -617,6 +641,7 @@ static const struct attribute_group hisi_l3c_pmu_v2_format_group = {
|
|||
static struct attribute *hisi_l3c_pmu_v3_format_attr[] = {
|
||||
HISI_PMU_FORMAT_ATTR(event, "config:0-7"),
|
||||
HISI_PMU_FORMAT_ATTR(ext, "config:16-17"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_core_deprecated, "config1:0-7"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_req, "config1:8-10"),
|
||||
HISI_PMU_FORMAT_ATTR(tt_core, "config2:0-15"),
|
||||
NULL
|
||||
|
|
|
|||
Loading…
Reference in New Issue