diff --git a/lib/std/time.zig b/lib/std/time.zig index c078e97793..56927eae4c 100644 --- a/lib/std/time.zig +++ b/lib/std/time.zig @@ -114,6 +114,13 @@ pub fn nanoTimestamp() i128 { return ns; } + if (builtin.os.tag == .uefi) { + var value: std.os.uefi.Time = undefined; + const status = std.os.uefi.system_table.runtime_services.getTime(&value, null); + assert(status == .Success); + return @as(i128, @intCast(value.toEpoch())) * ms_per_s; + } + var ts: os.timespec = undefined; os.clock_gettime(os.CLOCK.REALTIME, &ts) catch |err| switch (err) { error.UnsupportedClock, error.Unexpected => return 0, // "Precision of timing depends on hardware and OS". @@ -176,7 +183,7 @@ pub const Instant = struct { // true if we should use clock_gettime() const is_posix = switch (builtin.os.tag) { .wasi => builtin.link_libc, - .windows => false, + .windows, .uefi => false, else => true, }; @@ -197,6 +204,13 @@ pub const Instant = struct { return Instant{ .timestamp = ns }; } + if (builtin.os.tag == .uefi) { + var value: std.os.uefi.Time = undefined; + const status = std.os.uefi.system_table.runtime_services.getTime(&value, null); + if (status != .Success) return error.Unsupported; + return Instant{ .timestamp = value.toEpoch() }; + } + // On darwin, use UPTIME_RAW instead of MONOTONIC as it ticks while suspended. // On linux, use BOOTTIME instead of MONOTONIC as it ticks while suspended. // On freebsd derivatives, use MONOTONIC_FAST as currently there's no precision tradeoff.