From 5d74509b2d2fd6afbf3b2df31541b71ba55514c0 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Mon, 16 Aug 2021 11:23:57 +0200 Subject: [PATCH] base-hw: get rid of static perf counter object It is not necessary to have a class, an object, and a generic header for the perfomance counter. The kernel merely enables the counter using cpu registers ('msr' instructions, no MMIO) on arm_v6 and arm_v7 only. Therefore this commit makes the header arm-specific and replaces class and global static object with a function for enabling the counter. Fixes #4217 --- repos/base-hw/src/core/spec/arm/kernel/cpu.cc | 3 +-- .../core/{ => spec/arm}/kernel/perf_counter.h | 16 +--------------- .../base-hw/src/core/spec/arm_v6/perf_counter.cc | 9 +-------- .../base-hw/src/core/spec/arm_v7/perf_counter.cc | 9 +-------- 4 files changed, 4 insertions(+), 33 deletions(-) rename repos/base-hw/src/core/{ => spec/arm}/kernel/perf_counter.h (72%) diff --git a/repos/base-hw/src/core/spec/arm/kernel/cpu.cc b/repos/base-hw/src/core/spec/arm/kernel/cpu.cc index f4f8edd2b1..da9c280536 100644 --- a/repos/base-hw/src/core/spec/arm/kernel/cpu.cc +++ b/repos/base-hw/src/core/spec/arm/kernel/cpu.cc @@ -19,8 +19,7 @@ void Kernel::Cpu::_arch_init() { - /* enable performance counter */ - perf_counter()->enable(); + enable_performance_counter(); /* enable timer interrupt */ _pic.unmask(_timer.interrupt_id(), id()); diff --git a/repos/base-hw/src/core/kernel/perf_counter.h b/repos/base-hw/src/core/spec/arm/kernel/perf_counter.h similarity index 72% rename from repos/base-hw/src/core/kernel/perf_counter.h rename to repos/base-hw/src/core/spec/arm/kernel/perf_counter.h index fc0f5e1957..ca53093bfa 100644 --- a/repos/base-hw/src/core/kernel/perf_counter.h +++ b/repos/base-hw/src/core/spec/arm/kernel/perf_counter.h @@ -16,21 +16,7 @@ namespace Kernel { - /** - * Performance counter - */ - class Perf_counter - { - public: - - /** - * Enable counting - */ - void enable(); - }; - - - extern Perf_counter * perf_counter(); + void enable_performance_counter(); } #endif /* _CORE__KERNEL__PERF_COUNTER_H_ */ diff --git a/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc b/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc index 8f9515b288..cd9ac1c4a7 100644 --- a/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc +++ b/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc @@ -93,7 +93,7 @@ struct Accvalctlr : Register<32> }; -void Kernel::Perf_counter::enable() +void Kernel::enable_performance_counter() { /* enable counters and disable overflow interrupt. */ Pmcr::access_t v = Pmcr::enable_and_reset(); @@ -105,10 +105,3 @@ void Kernel::Perf_counter::enable() /* enable user-mode access */ Accvalctlr::write(Accvalctlr::enable_user_access()); } - - -Kernel::Perf_counter* Kernel::perf_counter() -{ - static Kernel::Perf_counter inst; - return &inst; -} diff --git a/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc b/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc index 85ed68bf62..0e4eb5a8b2 100644 --- a/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc +++ b/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc @@ -168,7 +168,7 @@ struct Pmuseren : Register<32> }; -void Kernel::Perf_counter::enable() +void Kernel::enable_performance_counter() { /* program PMU and enable all counters */ Pmcr::write(Pmcr::enable_and_reset()); @@ -179,10 +179,3 @@ void Kernel::Perf_counter::enable() Pmuseren::write(Pmuseren::enable()); Pmintenclr::write(Pmintenclr::disable_overflow_intr()); } - - -Kernel::Perf_counter* Kernel::perf_counter() -{ - static Kernel::Perf_counter inst; - return &inst; -}