mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 22:04:21 +00:00
60 lines
2 KiB
Zig
60 lines
2 KiB
Zig
const std = @import("std");
|
|
const uefi = std.os.uefi;
|
|
const Guid = uefi.Guid;
|
|
const Handle = uefi.Handle;
|
|
const Status = uefi.Status;
|
|
const Error = Status.Error;
|
|
const cc = uefi.cc;
|
|
|
|
pub fn ServiceBinding(service_guid: Guid) type {
|
|
return struct {
|
|
const Self = @This();
|
|
|
|
_create_child: *const fn (*Self, *?Handle) callconv(cc) Status,
|
|
_destroy_child: *const fn (*Self, Handle) callconv(cc) Status,
|
|
|
|
pub const CreateChildError = uefi.UnexpectedError || error{
|
|
InvalidParameter,
|
|
OutOfResources,
|
|
} || Error;
|
|
pub const DestroyChildError = uefi.UnexpectedError || error{
|
|
Unsupported,
|
|
InvalidParameter,
|
|
AccessDenied,
|
|
} || Error;
|
|
|
|
/// To add this protocol to an existing handle, use `addToHandle` instead.
|
|
pub fn createChild(self: *Self) CreateChildError!Handle {
|
|
var handle: ?Handle = null;
|
|
switch (self._create_child(self, &handle)) {
|
|
.success => return handle orelse error.Unexpected,
|
|
else => |status| {
|
|
try status.err();
|
|
return uefi.unexpectedStatus(status);
|
|
},
|
|
}
|
|
}
|
|
|
|
pub fn addToHandle(self: *Self, handle: Handle) CreateChildError!void {
|
|
switch (self._create_child(self, @ptrCast(@constCast(&handle)))) {
|
|
.success => {},
|
|
else => |status| {
|
|
try status.err();
|
|
return uefi.unexpectedStatus(status);
|
|
},
|
|
}
|
|
}
|
|
|
|
pub fn destroyChild(self: *Self, handle: Handle) DestroyChildError!void {
|
|
switch (self._destroy_child(self, handle)) {
|
|
.success => {},
|
|
else => |status| {
|
|
try status.err();
|
|
return uefi.unexpectedStatus(status);
|
|
},
|
|
}
|
|
}
|
|
|
|
pub const guid align(8) = service_guid;
|
|
};
|
|
}
|