summaryrefslogtreecommitdiffhomepage
path: root/dev/misc/BenchKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-08-31 16:49:59 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-08-31 16:54:56 +0200
commit7afa74b53110c0258c7fa9ae5aa8e7dde7534b4d (patch)
tree157c8de0554bd681fdb30f7a814b21881d905fa4 /dev/misc/BenchKit
parent11034c004ee7b232e53d69e9f1ae9000f008285f (diff)
feat! BenchKit breaking changes.
why: - Made it expandable to other traits and platforms. - You can provide a `Traits` now to the `HWChrono`. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/misc/BenchKit')
-rw-r--r--dev/misc/BenchKit/Chronometer.h (renamed from dev/misc/BenchKit/Chrono.h)0
-rw-r--r--dev/misc/BenchKit/HWChronometer.h66
-rw-r--r--dev/misc/BenchKit/X64Chrono.h56
3 files changed, 66 insertions, 56 deletions
diff --git a/dev/misc/BenchKit/Chrono.h b/dev/misc/BenchKit/Chronometer.h
index 3a82a94e..3a82a94e 100644
--- a/dev/misc/BenchKit/Chrono.h
+++ b/dev/misc/BenchKit/Chronometer.h
diff --git a/dev/misc/BenchKit/HWChronometer.h b/dev/misc/BenchKit/HWChronometer.h
new file mode 100644
index 00000000..2b8637d8
--- /dev/null
+++ b/dev/misc/BenchKit/HWChronometer.h
@@ -0,0 +1,66 @@
+/* -------------------------------------------
+
+Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <misc/BenchKit/Chronometer.h>
+
+namespace Kernel {
+struct HWChronoTraits;
+
+template <typename ChronoTraits = HWChronoTraits>
+class HWChrono;
+
+/// @brief BenchKit chrono logic for x64.
+struct HWChronoTraits final {
+ private:
+ STATIC UInt64 TickImpl_(void) {
+#ifdef __NE_AMD64__
+ UInt64 a = 0, d = 0;
+
+ asm volatile("rdtsc" : "=a"(a), "=d"(d));
+
+ return (d << 32) | a;
+#elif defined(__NE_ARM64__)
+ UInt64 result;
+
+ asm volatile("mrs %0, cntvct_el1" : "=r"(result));
+
+ return result;
+#else
+#error !!! no backend defined !!!
+#endif
+ }
+
+ friend HWChrono<HWChronoTraits>;
+};
+
+/// @brief hardware chronometer implementation using a trait to extract the data.
+template <typename ChronoTraits>
+class HWChrono BENCHKIT_INTERFACE {
+ public:
+ HWChrono() = default;
+ ~HWChrono() override = default;
+
+ NE_COPY_DEFAULT(HWChrono)
+
+ public:
+ Void Start() override { fStart = ChronoTraits::TickImpl_(); }
+
+ Void Stop() override { fStop = ChronoTraits::TickImpl_(); }
+
+ Void Reset() override {
+ fStart = 0;
+ fStop = 0;
+ }
+
+ UInt64 GetElapsedTime() const override { return fStop - fStart; }
+
+ private:
+ UInt64 fStart{};
+ UInt64 fStop{};
+};
+} // namespace Kernel
diff --git a/dev/misc/BenchKit/X64Chrono.h b/dev/misc/BenchKit/X64Chrono.h
deleted file mode 100644
index 728e7d60..00000000
--- a/dev/misc/BenchKit/X64Chrono.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -------------------------------------------
-
-Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
-
-------------------------------------------- */
-
-#pragma once
-
-#include <misc/BenchKit/Chrono.h>
-
-#if defined(__NE_AMD64__)
-
-namespace Kernel {
-class X64Chrono;
-struct X64ChronoTraits;
-
-/// @brief BenchKit chrono logic for x64.
-struct X64ChronoTraits {
- private:
- STATIC UInt64 TickImpl_(void) {
- UInt64 a = 0, d = 0;
-
- asm volatile("rdtsc" : "=a"(a), "=d"(d));
- return (d << 32) | a;
- }
-
- friend X64Chrono;
-};
-
-/// @brief X86_64 hardware chrono implementation using the `rdtsc` instruction.
-class X64Chrono BENCHKIT_INTERFACE {
- public:
- X64Chrono() = default;
- ~X64Chrono() override = default;
-
- NE_COPY_DEFAULT(X64Chrono)
-
- public:
- Void Start() override { fStart = X64ChronoTraits::TickImpl_(); }
-
- Void Stop() override { fStop = X64ChronoTraits::TickImpl_(); }
-
- Void Reset() override {
- fStart = 0;
- fStop = 0;
- }
-
- UInt64 GetElapsedTime() const override { return fStop - fStart; }
-
- private:
- UInt64 fStart{};
- UInt64 fStop{};
-};
-} // namespace Kernel
-
-#endif // defined(__NE_AMD64__) \ No newline at end of file