2021-02-21 10:17:59 +00:00
|
|
|
const std = @import("../std.zig");
|
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// A protocol is an interface identified by a GUID.
|
2019-07-28 21:51:51 +00:00
|
|
|
pub const protocols = @import("uefi/protocols.zig");
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// Status codes returned by EFI interfaces
|
2020-03-09 23:56:47 +00:00
|
|
|
pub const Status = @import("uefi/status.zig").Status;
|
2019-07-28 21:51:51 +00:00
|
|
|
pub const tables = @import("uefi/tables.zig");
|
2019-05-29 07:43:39 +00:00
|
|
|
|
2022-01-11 08:59:48 +00:00
|
|
|
/// The memory type to allocate when using the pool
|
2022-01-11 18:00:19 +00:00
|
|
|
/// Defaults to .LoaderData, the default data allocation type
|
2022-01-11 08:59:48 +00:00
|
|
|
/// used by UEFI applications to allocate pool memory.
|
|
|
|
pub var efi_pool_memory_type: tables.MemoryType = .LoaderData;
|
|
|
|
pub const pool_allocator = @import("uefi/pool_allocator.zig").pool_allocator;
|
|
|
|
pub const raw_pool_allocator = @import("uefi/pool_allocator.zig").raw_pool_allocator;
|
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// The EFI image's handle that is passed to its entry point.
|
2019-08-09 21:12:59 +00:00
|
|
|
pub var handle: Handle = undefined;
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// A pointer to the EFI System Table that is passed to the EFI image's entry point.
|
2019-07-28 21:51:51 +00:00
|
|
|
pub var system_table: *tables.SystemTable = undefined;
|
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// A handle to an event structure.
|
2020-09-25 20:29:03 +00:00
|
|
|
pub const Event = *opaque {};
|
2019-10-16 17:42:44 +00:00
|
|
|
|
2022-01-14 12:02:34 +00:00
|
|
|
pub const MacAddress = extern struct {
|
|
|
|
address: [32]u8,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Ipv4Address = extern struct {
|
|
|
|
address: [4]u8,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub const Ipv6Address = extern struct {
|
|
|
|
address: [16]u8,
|
|
|
|
};
|
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// GUIDs must be align(8)
|
2019-07-28 21:51:51 +00:00
|
|
|
pub const Guid = extern struct {
|
|
|
|
time_low: u32,
|
|
|
|
time_mid: u16,
|
|
|
|
time_high_and_version: u16,
|
|
|
|
clock_seq_high_and_reserved: u8,
|
|
|
|
clock_seq_low: u8,
|
|
|
|
node: [6]u8,
|
2019-10-07 12:53:14 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// Format GUID into hexadecimal lowercase xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format
|
2019-10-07 12:53:14 +00:00
|
|
|
pub fn format(
|
|
|
|
self: @This(),
|
|
|
|
comptime f: []const u8,
|
2020-03-06 22:59:21 +00:00
|
|
|
options: std.fmt.FormatOptions,
|
2021-02-21 10:17:59 +00:00
|
|
|
writer: anytype,
|
|
|
|
) !void {
|
2021-06-20 01:10:22 +00:00
|
|
|
_ = options;
|
2019-10-07 12:53:14 +00:00
|
|
|
if (f.len == 0) {
|
2022-04-17 10:15:15 +00:00
|
|
|
const fmt = std.fmt.fmtSliceHexLower;
|
|
|
|
|
|
|
|
const time_low = @byteSwap(u32, self.time_low);
|
|
|
|
const time_mid = @byteSwap(u16, self.time_mid);
|
|
|
|
const time_high_and_version = @byteSwap(u16, self.time_high_and_version);
|
|
|
|
|
|
|
|
return std.fmt.format(writer, "{:0>8}-{:0>4}-{:0>4}-{:0>2}{:0>2}-{:0>12}", .{
|
|
|
|
fmt(std.mem.asBytes(&time_low)),
|
|
|
|
fmt(std.mem.asBytes(&time_mid)),
|
|
|
|
fmt(std.mem.asBytes(&time_high_and_version)),
|
|
|
|
fmt(std.mem.asBytes(&self.clock_seq_high_and_reserved)),
|
|
|
|
fmt(std.mem.asBytes(&self.clock_seq_low)),
|
|
|
|
fmt(std.mem.asBytes(&self.node)),
|
2020-01-09 09:56:38 +00:00
|
|
|
});
|
2019-10-07 12:53:14 +00:00
|
|
|
} else {
|
|
|
|
@compileError("Unknown format character: '" ++ f ++ "'");
|
|
|
|
}
|
|
|
|
}
|
2021-02-21 10:17:59 +00:00
|
|
|
|
|
|
|
pub fn eql(a: std.os.uefi.Guid, b: std.os.uefi.Guid) bool {
|
|
|
|
return a.time_low == b.time_low and
|
|
|
|
a.time_mid == b.time_mid and
|
|
|
|
a.time_high_and_version == b.time_high_and_version and
|
|
|
|
a.clock_seq_high_and_reserved == b.clock_seq_high_and_reserved and
|
|
|
|
a.clock_seq_low == b.clock_seq_low and
|
|
|
|
std.mem.eql(u8, &a.node, &b.node);
|
|
|
|
}
|
2019-07-28 21:51:51 +00:00
|
|
|
};
|
2019-10-16 17:42:44 +00:00
|
|
|
|
|
|
|
/// An EFI Handle represents a collection of related interfaces.
|
2020-09-25 20:29:03 +00:00
|
|
|
pub const Handle = *opaque {};
|
2019-10-16 17:42:44 +00:00
|
|
|
|
|
|
|
/// This structure represents time information.
|
2019-07-28 21:51:51 +00:00
|
|
|
pub const Time = extern struct {
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 1900 - 9999
|
2019-07-28 21:51:51 +00:00
|
|
|
year: u16,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 1 - 12
|
2019-07-28 21:51:51 +00:00
|
|
|
month: u8,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 1 - 31
|
2019-07-28 21:51:51 +00:00
|
|
|
day: u8,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 0 - 23
|
2019-07-28 21:51:51 +00:00
|
|
|
hour: u8,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 0 - 59
|
2019-07-28 21:51:51 +00:00
|
|
|
minute: u8,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 0 - 59
|
2019-07-28 21:51:51 +00:00
|
|
|
second: u8,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// 0 - 999999999
|
2019-07-28 21:51:51 +00:00
|
|
|
nanosecond: u32,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// The time's offset in minutes from UTC.
|
|
|
|
/// Allowed values are -1440 to 1440 or unspecified_timezone
|
2019-07-28 21:51:51 +00:00
|
|
|
timezone: i16,
|
2019-08-05 16:26:13 +00:00
|
|
|
daylight: packed struct {
|
|
|
|
_pad1: u6,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// If true, the time has been adjusted for daylight savings time.
|
2019-08-05 16:26:13 +00:00
|
|
|
in_daylight: bool,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// If true, the time is affected by daylight savings time.
|
2019-08-05 16:26:13 +00:00
|
|
|
adjust_daylight: bool,
|
|
|
|
},
|
2019-07-28 21:51:51 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// Time is to be interpreted as local time
|
2019-07-28 21:51:51 +00:00
|
|
|
pub const unspecified_timezone: i16 = 0x7ff;
|
|
|
|
};
|
2019-10-16 17:42:44 +00:00
|
|
|
|
|
|
|
/// Capabilities of the clock device
|
2019-07-28 21:51:51 +00:00
|
|
|
pub const TimeCapabilities = extern struct {
|
2019-10-16 17:42:44 +00:00
|
|
|
/// Resolution in Hz
|
2019-07-28 21:51:51 +00:00
|
|
|
resolution: u32,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// Accuracy in an error rate of 1e-6 parts per million.
|
2019-07-28 21:51:51 +00:00
|
|
|
accuracy: u32,
|
2019-10-24 05:06:03 +00:00
|
|
|
|
2019-10-16 17:42:44 +00:00
|
|
|
/// If true, a time set operation clears the device's time below the resolution level.
|
2019-07-28 21:51:51 +00:00
|
|
|
sets_to_zero: bool,
|
|
|
|
};
|
2020-03-09 19:27:53 +00:00
|
|
|
|
|
|
|
/// File Handle as specified in the EFI Shell Spec
|
2020-09-25 20:29:03 +00:00
|
|
|
pub const FileHandle = *opaque {};
|
2022-04-17 10:15:15 +00:00
|
|
|
|
|
|
|
test "GUID formatting" {
|
|
|
|
var bytes = [_]u8{ 137, 60, 203, 50, 128, 128, 124, 66, 186, 19, 80, 73, 135, 59, 194, 135 };
|
|
|
|
|
|
|
|
var guid = @bitCast(Guid, bytes);
|
|
|
|
|
|
|
|
var str = try std.fmt.allocPrint(std.testing.allocator, "{}", .{guid});
|
|
|
|
defer std.testing.allocator.free(str);
|
|
|
|
|
|
|
|
try std.testing.expect(std.mem.eql(u8, str, "32cb3c89-8080-427c-ba13-5049873bc287"));
|
|
|
|
}
|