ZXFoundation™ 26h2
Loading...
Searching...
No Matches
core.cxxm
1/// SPDX-License-Identifier: Apache 2.0
2/// @file zxfoundation/sys/time.cxxm
3/// @brief High-performance industrial kernel time system for s390x.
4
5export module zxfoundation.sys.time.core;
6import zxfoundation.base.types;
7import lib.error;
8import std;
9
10export {
11
12namespace zxfoundation::sys::time {
13
14 /// @brief Represents a duration with nanosecond precision.
15 class duration {
16 u64 m_ns;
17
18 public:
19 constexpr duration() noexcept : m_ns(0) {}
20 constexpr explicit duration(u64 ns) noexcept : m_ns(ns) {}
21
22 [[nodiscard]] constexpr auto count_ns() const noexcept -> u64 { return m_ns; }
23 [[nodiscard]] constexpr auto count_us() const noexcept -> u64 { return m_ns / 1000U; }
24 [[nodiscard]] constexpr auto count_ms() const noexcept -> u64 { return m_ns / 1000000U; }
25 [[nodiscard]] constexpr auto count_s() const noexcept -> u64 { return m_ns / 1000000000U; }
26
27 constexpr auto operator+(duration o) const noexcept -> duration { return duration(m_ns + o.m_ns); }
28 constexpr auto operator-(duration o) const noexcept -> duration { return duration(m_ns - o.m_ns); }
29 constexpr auto operator<=>(const duration&) const noexcept = default;
30
31 /// @brief Convert s390x TOD clock units to a duration.
32 /// Calculation: NS = (TOD * 1000) / 4096 = (TOD * 125) / 512.
33 static constexpr auto from_tod(u64 tod_units) noexcept -> duration {
34 const u128 val = static_cast<u128>(tod_units) * 125U;
35 return duration(static_cast<u64>(val >> 9U));
36 }
37
38 static constexpr auto from_seconds(u64 s) noexcept -> duration { return duration(s * 1'000'000'000U); }
39 static constexpr auto from_milliseconds(u64 ms) noexcept -> duration { return duration(ms * 1'000'000U); }
40 static constexpr auto from_microseconds(u64 us) noexcept -> duration { return duration(us * 1'000U); }
41 };
42
43 /// @brief Represents an absolute point in time.
44 class instant {
45 u64 m_ns_since_epoch;
46
47 public:
48 constexpr instant() noexcept : m_ns_since_epoch(0) {}
49 constexpr explicit instant(u64 ns) noexcept : m_ns_since_epoch(ns) {}
50
51 [[nodiscard]] constexpr auto nanoseconds_since_epoch() const noexcept -> u64 { return m_ns_since_epoch; }
52
53 constexpr auto operator+(duration d) const noexcept -> instant { return instant(m_ns_since_epoch + d.count_ns()); }
54 constexpr auto operator-(duration d) const noexcept -> instant { return instant(m_ns_since_epoch - d.count_ns()); }
55 constexpr auto operator-(instant o) const noexcept -> duration { return duration(m_ns_since_epoch - o.m_ns_since_epoch); }
56 constexpr auto operator<=>(const instant&) const noexcept = default;
57 };
58
59 /// @brief Initialize the global time system.
60 /// @param[in] tod_boot TOD clock value captured at kernel entry by ZXFL.
61 auto initialize(u64 tod_boot) noexcept -> void;
62
63 /// @brief Retrieve the current monotonic time (time since boot).
64 [[nodiscard]] auto monotonic_now() noexcept -> instant;
65
66 /// @brief Retrieve the current realtime (wall-clock) time.
67 [[nodiscard]] auto realtime_now() noexcept -> instant;
68
69 /// @brief Adjust the realtime clock (e.g., NTP steering).
70 /// @param[in] now New absolute epoch-relative time.
71 [[nodiscard]] auto set_realtime(instant now) noexcept
72 -> std::expected<void, lib::kernel_error>;
73
74 /// @brief Advance the wall-clock offset by one tick's worth of time.
75 /// @param[in] tick_ns Duration of one tick in nanoseconds (10,000,000).
76 auto tick_advance_wall(u64 tick_ns) noexcept -> void;
77
78 /// @brief Return the current monotonic tick counter.
79 [[nodiscard]] auto tick_count() noexcept -> u64;
80
81} // namespace zxfoundation::sys::time
82
83} // end export