| ... | ... | @@ -114,6 +114,13 @@ pub fn nanoTimestamp() i128 { |
| 114 | 114 | return ns; |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | if (builtin.os.tag == .uefi) { |
| 118 | var value: std.os.uefi.Time = undefined; |
| 119 | const status = std.os.uefi.system_table.runtime_services.getTime(&value, null); |
| 120 | assert(status == .Success); |
| 121 | return @as(i128, @intCast(value.toEpoch())) * ms_per_s; |
| 122 | } |
| 123 | |
| 117 | 124 | var ts: os.timespec = undefined; |
| 118 | 125 | os.clock_gettime(os.CLOCK.REALTIME, &ts) catch |err| switch (err) { |
| 119 | 126 | error.UnsupportedClock, error.Unexpected => return 0, // "Precision of timing depends on hardware and OS". |
| ... | ... | @@ -176,7 +183,7 @@ pub const Instant = struct { |
| 176 | 183 | // true if we should use clock_gettime() |
| 177 | 184 | const is_posix = switch (builtin.os.tag) { |
| 178 | 185 | .wasi => builtin.link_libc, |
| 179 | | .windows => false, |
| 186 | .windows, .uefi => false, |
| 180 | 187 | else => true, |
| 181 | 188 | }; |
| 182 | 189 | |
| ... | ... | @@ -197,6 +204,13 @@ pub const Instant = struct { |
| 197 | 204 | return Instant{ .timestamp = ns }; |
| 198 | 205 | } |
| 199 | 206 | |
| 207 | if (builtin.os.tag == .uefi) { |
| 208 | var value: std.os.uefi.Time = undefined; |
| 209 | const status = std.os.uefi.system_table.runtime_services.getTime(&value, null); |
| 210 | if (status != .Success) return error.Unsupported; |
| 211 | return Instant{ .timestamp = value.toEpoch() }; |
| 212 | } |
| 213 | |
| 200 | 214 | // On darwin, use UPTIME_RAW instead of MONOTONIC as it ticks while suspended. |
| 201 | 215 | // On linux, use BOOTTIME instead of MONOTONIC as it ticks while suspended. |
| 202 | 216 | // On freebsd derivatives, use MONOTONIC_FAST as currently there's no precision tradeoff. |