feature. See also
. The project being documented here (as the example) is the Zig library itself.
File
Code
const std = @import("std");
const uefi = std.os.uefi;
const Status = uefi.Status;
const cc = uefi.cc;
pub const BlockIo = extern struct {
const Self = @This();
revision: u64,
media: *BlockMedia,
_reset: *const fn (*BlockIo, extended_verification: bool) callconv(cc) Status,
_read_blocks: *const fn (*BlockIo, media_id: u32, lba: u64, buffer_size: usize, buf: [*]u8) callconv(cc) Status,
_write_blocks: *const fn (*BlockIo, media_id: u32, lba: u64, buffer_size: usize, buf: [*]const u8) callconv(cc) Status,
_flush_blocks: *const fn (*BlockIo) callconv(cc) Status,
pub const ResetError = uefi.UnexpectedError || error{DeviceError};
pub const ReadBlocksError = uefi.UnexpectedError || error{
DeviceError,
NoMedia,
BadBufferSize,
InvalidParameter,
};
pub const WriteBlocksError = uefi.UnexpectedError || error{
WriteProtected,
NoMedia,
MediaChanged,
DeviceError,
BadBufferSize,
InvalidParameter,
};
pub const FlushBlocksError = uefi.UnexpectedError || error{
DeviceError,
NoMedia,
};
pub fn reset(self: *Self, extended_verification: bool) ResetError!void {
switch (self._reset(self, extended_verification)) {
.success => {},
.device_error => return error.DeviceError,
else => |status| return uefi.unexpectedStatus(status),
}
}
pub fn readBlocks(self: *Self, media_id: u32, lba: u64, buf: []u8) ReadBlocksError!void {
switch (self._read_blocks(self, media_id, lba, buf.len, buf.ptr)) {
.success => {},
.device_error => return error.DeviceError,
.no_media => return error.NoMedia,
.bad_buffer_size => return error.BadBufferSize,
.invalid_parameter => return error.InvalidParameter,
else => |status| return uefi.unexpectedStatus(status),
}
}
pub fn writeBlocks(self: *Self, media_id: u32, lba: u64, buf: []const u8) WriteBlocksError!void {
switch (self._write_blocks(self, media_id, lba, buf.len, buf.ptr)) {
.success => {},
.write_protected => return error.WriteProtected,
.no_media => return error.NoMedia,
.media_changed => return error.MediaChanged,
.device_error => return error.DeviceError,
.bad_buffer_size => return error.BadBufferSize,
.invalid_parameter => return error.InvalidParameter,
else => |status| return uefi.unexpectedStatus(status),
}
}
pub fn flushBlocks(self: *Self) FlushBlocksError!void {
switch (self._flush_blocks(self)) {
.success => {},
.device_error => return error.DeviceError,
.no_media => return error.NoMedia,
else => |status| return uefi.unexpectedStatus(status),
}
}
pub const guid align(8) = uefi.Guid{
.time_low = 0x964e5b21,
.time_mid = 0x6459,
.time_high_and_version = 0x11d2,
.clock_seq_high_and_reserved = 0x8e,
.clock_seq_low = 0x39,
.node = [_]u8{ 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b },
};
pub const BlockMedia = extern struct {
media_id: u32,
removable_media: bool,
media_present: bool,
logical_partition: bool,
read_only: bool,
write_caching: bool,
block_size: u32,
io_align: u32,
last_block: u64,
lowest_aligned_lba: u64,
logical_blocks_per_physical_block: u32,
optimal_transfer_length_granularity: u32,
};
};