40 static u64 GetHostTickFrequency() noexcept;
42 static u64 GetHostTickCount() noexcept;
67 static u64 GetGuestTickFrequency();
142enum class Domain : u8 {
148template <Domain Domain>
149struct NtSystemClock {
153 using time_point = std::chrono::time_point<NtSystemClock<Domain>>;
160 static constexpr std::chrono::seconds GetUnixEpochDelta() {
161 using std::chrono::steady_clock;
162 auto filetime_epoch = std::chrono::year{1601} / std::chrono::month{1} / std::chrono::day{1};
163 auto system_clock_epoch = std::chrono::year{1970} / std::chrono::month{1} / std::chrono::day{1};
165 static_cast<std::chrono::sys_seconds
>(
static_cast<std::chrono::sys_days
>(filetime_epoch));
166 auto sp =
static_cast<std::chrono::sys_seconds
>(
167 static_cast<std::chrono::sys_days
>(system_clock_epoch));
168 return fp.time_since_epoch() - sp.time_since_epoch();
171 static constexpr u64 ToFileTime(time_point
const& tp)
noexcept {
172 return static_cast<u64
>(tp.time_since_epoch().count());
175 static constexpr time_point FromFileTime(u64
const& tp)
noexcept {
176 return time_point{duration{tp}};
183 static constexpr std::chrono::sys_time<duration> to_sys(
const time_point& tp)
184 requires(Domain == Domain::kHost)
186 return std::chrono::sys_time<duration>{tp.time_since_epoch() + GetUnixEpochDelta()};
194 template <
typename SysDuration>
195 static constexpr time_point from_sys(
const std::chrono::sys_time<SysDuration>& tp)
196 requires(Domain == Domain::kHost)
198 auto ctp = std::chrono::time_point_cast<duration>(tp);
199 return time_point{ctp.time_since_epoch() - GetUnixEpochDelta()};
202 [[nodiscard]]
static time_point now()
noexcept {
203 if constexpr (Domain == Domain::kHost) {
205 }
else if constexpr (Domain == Domain::kGuest) {
228 using namespace std::chrono;
229 const year_month first = year{1980 +
static_cast<i32
>((date >> 9) & 0x7F)} / January;
230 const year_month month = first + months{
static_cast<i32
>((date >> 5) & 0x0F) - 1};
231 const sys_days day = sys_days{month / 1} + days{
static_cast<i32
>(date & 0x1F) - 1};
232 const sys_seconds stamp = day + hours{
static_cast<i32
>((time >> 11) & 0x1F)} +
233 minutes{
static_cast<i32
>((time >> 5) & 0x3F)} +
234 seconds{
static_cast<i32
>((time & 0x1F) * 2)};
235 const i64 file_time_seconds =
236 stamp.time_since_epoch().count() -
237 detail::NtSystemClock<detail::Domain::kHost>::GetUnixEpochDelta().count();
238 return static_cast<u64
>(file_time_seconds * HundredNano::den);
244namespace std::chrono {
246#ifdef _LIBCPP_VERSION
250template <
class,
class>
251struct clock_time_conversion {};
254template <
class DestClock,
class SourceClock,
class Duration>
255auto clock_cast(
const std::chrono::time_point<SourceClock, Duration>& t) {
256 return clock_time_conversion<DestClock, SourceClock>{}(t);
272 template <
typename Duration>
273 WClock::time_point
operator()(
const std::chrono::time_point<XClock, Duration>& t)
const {
274 std::atomic_thread_fence(std::memory_order_acq_rel);
275 auto w_now = WClock::now();
276 auto x_now = XClock::now();
277 std::atomic_thread_fence(std::memory_order_acq_rel);
279 auto delta = (t - x_now);
283 return w_now + delta;
299 template <
typename Duration>
300 XClock::time_point
operator()(
const std::chrono::time_point<WClock, Duration>& t)
const {
301 std::atomic_thread_fence(std::memory_order_acq_rel);
302 auto w_now = WClock::now();
303 auto x_now = XClock::now();
304 std::atomic_thread_fence(std::memory_order_acq_rel);
310 return x_now + delta;
317namespace std::chrono {
331 template <
typename Duration>
333 const std::chrono::time_point<SteadyClock, Duration>& t)
const {
334 std::atomic_thread_fence(std::memory_order_acq_rel);
335 auto steady_now = SteadyClock::now();
336 auto nt_now = WinSystemClock::now();
337 std::atomic_thread_fence(std::memory_order_acq_rel);
339 auto delta = std::chrono::floor<WinSystemClock::duration>(t - steady_now);
340 return nt_now + delta;
353 template <
typename Duration>
355 const std::chrono::time_point<WinSystemClock, Duration>& t)
const {
356 std::atomic_thread_fence(std::memory_order_acq_rel);
357 auto steady_now = SteadyClock::now();
358 auto nt_now = WinSystemClock::now();
359 std::atomic_thread_fence(std::memory_order_acq_rel);
361 auto delta = t - nt_now;
362 return steady_now + delta;
static u32 ScaleGuestDurationMillis(u32 guest_ms)
static void SetGuestTimeScalar(f64 scalar)
static u64 QueryGuestTickCount()
static u64 GetGuestSystemTimeBase()
static bool IsNoScaling()
static void ScaleGuestDurationTimeval(i32 *tv_sec, i32 *tv_usec)
static std::pair< u64, u64 > GetGuestTickRatio()
static i64 ScaleGuestDurationFileTime(i64 guest_file_time)
static f64 GetGuestTimeScalar()
static u64 QueryHostUptimeMillis()
static u32 GetGuestUptimeMillis()
static u64 QueryGuestSystemTime()
static void SetGuestSystemTime(u64 system_time)
static u64 QueryHostSystemTime() noexcept
static void SetGuestSystemTimeBase(u64 time_base)
static void SetGuestTickFrequency(u64 frequency)
u64 DecodeFATTimestamp(u32 date, u32 time)
Definition chrono.h:227
std::ratio< 1, 10000000 > HundredNano
Definition chrono.h:135
detail::NtSystemClock< detail::Domain::kGuest > XSystemClock
Definition chrono.h:217
detail::NtSystemClock< detail::Domain::kHost > WinSystemClock
Definition chrono.h:214
std::chrono::duration< i64, HundredNano > HundredNanoseconds
Definition chrono.h:138
SteadyClock::time_point operator()(const std::chrono::time_point< WinSystemClock, Duration > &t) const
Definition chrono.h:354
::rex::WinSystemClock WinSystemClock
Definition chrono.h:348
std::chrono::steady_clock SteadyClock
Definition chrono.h:350
::rex::XSystemClock XClock
Definition chrono.h:269
WClock::time_point operator()(const std::chrono::time_point< XClock, Duration > &t) const
Definition chrono.h:273
::rex::WinSystemClock WClock
Definition chrono.h:267
WinSystemClock::time_point operator()(const std::chrono::time_point< SteadyClock, Duration > &t) const
Definition chrono.h:332
std::chrono::steady_clock SteadyClock
Definition chrono.h:328
::rex::WinSystemClock WinSystemClock
Definition chrono.h:326
::rex::WinSystemClock WClock
Definition chrono.h:294
::rex::XSystemClock XClock
Definition chrono.h:296
XClock::time_point operator()(const std::chrono::time_point< WClock, Duration > &t) const
Definition chrono.h:300
Integer types, byte order wrappers and size literals.