Implement From<> properly for Status

This commit is contained in:
Mark 2020-09-17 13:03:05 +03:00
parent 3c3768f014
commit f590caff1c
8 changed files with 43 additions and 38 deletions

View File

@ -25,9 +25,9 @@ const EFI_INVALID_PARAMETER: u64 = EFI_ERR | 0x02;
const EFI_BUFFER_TOO_SMALL: u64 = EFI_ERR | 0x05;
const EFI_NOT_READY: u64 = EFI_ERR | 0x06;
impl Status {
pub fn to_num(self) -> u64 {
match self {
impl From<Status> for u64 {
fn from(s: Status) -> u64 {
match s {
Status::Success => EFI_SUCCESS,
Status::Err => EFI_ERR,
Status::InvalidParameter => EFI_INVALID_PARAMETER,
@ -35,8 +35,11 @@ impl Status {
Status::NotReady => EFI_NOT_READY,
}
}
pub fn from_num(v: u64) -> Status {
match v {
}
impl From<u64> for Status {
fn from(s: u64) -> Self {
match s {
0 => Status::Success,
EFI_ERR => Status::Err,
EFI_INVALID_PARAMETER => Status::InvalidParameter,
@ -45,11 +48,13 @@ impl Status {
_ => Status::Err
}
}
}
pub fn to_result(&self) -> Result<()> {
match self {
impl From<Status> for core::result::Result<(), Status> {
fn from(s: Status) -> Self {
match s {
Status::Success => Ok(()),
err => Err(*err)
err => Err(err)
}
}
}
@ -68,11 +73,11 @@ impl Termination for ! {
impl<T> Termination for Result<T> {
fn to_efi(&self) -> u64 {
match self {
match *self {
Ok(_) => EFI_SUCCESS,
Err(err) => {
assert!(*err != Status::Success);
err.to_num()
assert!(err != Status::Success);
err.into()
}
}
}

View File

@ -88,7 +88,7 @@ pub struct HandleBufferIterator {
impl BootServices {
pub fn get_memory_map(&self, out: &mut MemoryMap) -> Result<(), Status> {
out.size = out.storage_ref.len();
return Status::from_num(unsafe {
Status::from(unsafe {
let mut trash: u32 = 0;
(self.get_memory_map)(
(&mut out.size) as *mut usize,
@ -97,24 +97,24 @@ impl BootServices {
(&mut out.descriptor_size) as *mut usize,
(&mut trash) as *mut u32
)
}).to_result();
}).into()
}
// Unlike EFI's variant, just for one event
pub fn wait_for_event(&self, ev: Event) -> Result<(), Status> {
let mut index = 0usize;
return Status::from_num(unsafe {
Status::from(unsafe {
(self.wait_for_event)(
1,
&ev,
&mut index
)
}).to_result();
}).into()
}
pub fn exit(&self, status: Status) -> ! {
unsafe {
(self.exit)(Handle::from(super::image_handle()), status.to_num(), 0, core::ptr::null());
(self.exit)(Handle::from(super::image_handle()), status.into(), 0, core::ptr::null());
}
}
@ -123,16 +123,16 @@ impl BootServices {
}
pub fn exit_boot_services(&self, map_key: usize) -> Result<(), Status> {
return Status::from_num(unsafe {
Status::from(unsafe {
(self.exit_boot_services)(Handle::from(super::image_handle()), map_key)
}).to_result();
}).into()
}
pub fn locate_protocol<T: Protocol>(&self) -> Result<&'static mut T, Status> {
let guid = &<T as Protocol>::GUID;
let mut proto_ptr: *mut c_void = core::ptr::null_mut();
match Status::from_num(unsafe {
match Status::from(unsafe {
(self.locate_protocol)(
guid as *const Guid,
core::ptr::null_mut(),
@ -148,7 +148,7 @@ impl BootServices {
let guid = &<T as Protocol>::GUID;
let mut proto_ptr: *mut c_void = core::ptr::null_mut();
match Status::from_num(unsafe {
match Status::from(unsafe {
(self.handle_protocol)(
handle,
guid,
@ -168,7 +168,7 @@ impl BootServices {
let guid = &<T as Protocol>::GUID;
let mut proto_ptr: *mut c_void = core::ptr::null_mut();
match Status::from_num(unsafe {
match Status::from(unsafe {
(self.open_protocol)(
handle,
guid,
@ -193,7 +193,7 @@ impl BootServices {
count: 0
};
match Status::from_num(unsafe {
match Status::from(unsafe {
(self.locate_handle_buffer)(
search_type,
guid,

View File

@ -45,7 +45,7 @@ impl Drop for File {
impl File {
pub fn open(&self, name: &CStr16, mode: u64, attr: u64) -> Result<File, Status> {
let mut ptr: *mut FileProtocol = null_mut();
match Status::from_num(unsafe {
match Status::from(unsafe {
((*self.inner).open)(
self.inner,
&mut ptr,
@ -61,7 +61,7 @@ impl File {
pub fn read(&mut self, buf: &mut [u8]) -> Result<usize, Status> {
let mut len = buf.len();
match Status::from_num(unsafe {
match Status::from(unsafe {
((*self.inner).read)(
self.inner,
&mut len,
@ -74,11 +74,11 @@ impl File {
}
pub fn seek(&mut self, pos: u64) -> Result<(), Status> {
Status::from_num(unsafe {
Status::from(unsafe {
((*self.inner).set_position)(
self.inner,
pos
)
}).to_result()
}).into()
}
}

View File

@ -73,12 +73,12 @@ impl GraphicsOutputProtocol {
}
pub fn set_mode(&mut self, num: u32) -> Result<&'static Mode, Status> {
return match Status::from_num(unsafe {
match Status::from(unsafe {
(self.set_mode)(self as *mut GraphicsOutputProtocol, num)
}) {
Status::Success => Ok(self.mode),
err => Err(err)
};
}
}
// TODO: pixel format
@ -103,7 +103,7 @@ impl<'a> Iterator for ModeIterator<'a> {
let mut mode: *mut ModeInformation = core::ptr::null_mut();
let mut junk: usize = 0;
return match Status::from_num(unsafe {
match Status::from(unsafe {
(self.protocol.query_mode)(
self.protocol as *const GraphicsOutputProtocol,
self.number,
@ -116,7 +116,7 @@ impl<'a> Iterator for ModeIterator<'a> {
unsafe {mode.as_ref()}.map(|x| { (self.number - 1, x) })
},
_ => None
};
}
}
}

View File

@ -20,7 +20,7 @@ impl SimpleFileSystemProtocol {
pub fn open_volume(&mut self) -> Result<File, Status> {
let mut root: *mut FileProtocol = null_mut();
match Status::from_num(unsafe {
match Status::from(unsafe {
(self.open_volume)(
self,
&mut root

View File

@ -25,9 +25,9 @@ impl Protocol for SimpleTextInputProtocol {
impl SimpleTextInputProtocol {
pub fn reset(&mut self, extended_verification: bool) -> Result<(), Status> {
return Status::from_num(unsafe {
Status::from(unsafe {
(self.reset)(self as *mut SimpleTextInputProtocol, extended_verification)
}).to_result();
}).into()
}
pub fn read_key_blocking(&mut self) -> Result<InputKey, Status> {
@ -44,7 +44,7 @@ impl SimpleTextInputProtocol {
pub fn read_key_stroke(&mut self) -> Result<InputKey, Status> {
let mut stroke = InputKey { scan_code: 0, unicode_char: 0 };
return match Status::from_num(unsafe {
match Status::from(unsafe {
(self.read_key_stroke)(
self as *mut SimpleTextInputProtocol,
(&mut stroke) as *mut InputKey
@ -52,6 +52,6 @@ impl SimpleTextInputProtocol {
}) {
Status::Success => Ok(stroke),
err => Err(err)
};
}
}
}

View File

@ -21,7 +21,7 @@ impl Protocol for SimpleTextOutputProtocol {
impl SimpleTextOutputProtocol {
// Not the original name provided by EFI, but whatever
pub fn output_char16_string(&self, s: *const i16) -> Status {
unsafe { Status::from_num((self.fn_output_string)(self, s)) }
Status::from(unsafe { (self.fn_output_string)(self, s) })
}
pub fn output_string(&self, s: &str) {

View File

@ -10,11 +10,11 @@ pub struct RuntimeServices {
impl RuntimeServices {
pub fn get_time(&self) -> Result<u64, Status> {
let mut time = 0u64;
return match Status::from_num(unsafe {
match Status::from(unsafe {
(self.get_time)((&mut time) as *mut u64, core::ptr::null_mut())
}) {
Status::Success => Ok(time),
err => Err(err)
};
}
}
}