From 44e6264d2bb2c4d8243065758829a960e8eab0ea Mon Sep 17 00:00:00 2001 From: imtsuki Date: Fri, 28 Feb 2020 21:33:09 +0800 Subject: [PATCH 1/3] Fixes #121: ignore EFI_DEVICE_ERROR in output_string Signed-off-by: imtsuki --- src/proto/console/text/output.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/proto/console/text/output.rs b/src/proto/console/text/output.rs index c99646748..1cc2a910f 100644 --- a/src/proto/console/text/output.rs +++ b/src/proto/console/text/output.rs @@ -161,9 +161,11 @@ impl<'boot> fmt::Write for Output<'boot> { let text = CStr16::from_u16_with_nul(codes).map_err(|_| fmt::Error)?; - self.output_string(text) - .warning_as_error() - .map_err(|_| fmt::Error) + match self.output_string(text).warning_as_error() { + Ok(_) => Ok(()), + Err(e) if e.status() == Status::DEVICE_ERROR => Ok(()), + Err(_) => Err(fmt::Error), + } }; // This closure converts a character to UCS-2 and adds it to the buffer, From 12460841ff2caa2422c1a220c2afda20ea70fe4a Mon Sep 17 00:00:00 2001 From: imtsuki Date: Sat, 29 Feb 2020 12:17:43 +0800 Subject: [PATCH 2/3] ignore Result in logger rather than Output protocol Signed-off-by: imtsuki --- src/logger.rs | 2 +- src/proto/console/text/output.rs | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/logger.rs b/src/logger.rs index 193247157..2d478da5d 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -56,7 +56,7 @@ impl<'boot> log::Log for Logger { fn log(&self, record: &log::Record) { if let Some(mut ptr) = self.writer { let writer = unsafe { ptr.as_mut() }; - DecoratedLog::write(writer, record.level(), record.args()).unwrap(); + DecoratedLog::write(writer, record.level(), record.args()).unwrap_or_default(); } } diff --git a/src/proto/console/text/output.rs b/src/proto/console/text/output.rs index 1cc2a910f..c99646748 100644 --- a/src/proto/console/text/output.rs +++ b/src/proto/console/text/output.rs @@ -161,11 +161,9 @@ impl<'boot> fmt::Write for Output<'boot> { let text = CStr16::from_u16_with_nul(codes).map_err(|_| fmt::Error)?; - match self.output_string(text).warning_as_error() { - Ok(_) => Ok(()), - Err(e) if e.status() == Status::DEVICE_ERROR => Ok(()), - Err(_) => Err(fmt::Error), - } + self.output_string(text) + .warning_as_error() + .map_err(|_| fmt::Error) }; // This closure converts a character to UCS-2 and adds it to the buffer, From b0039ae6ddd7c726c9526914da83c91dfb75bd90 Mon Sep 17 00:00:00 2001 From: imtsuki Date: Sat, 29 Feb 2020 19:26:52 +0800 Subject: [PATCH 3/3] Add a FIXME comment that we are ignoring logger's `Result` Signed-off-by: imtsuki --- src/logger.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/logger.rs b/src/logger.rs index 2d478da5d..fb81bd44f 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -56,6 +56,12 @@ impl<'boot> log::Log for Logger { fn log(&self, record: &log::Record) { if let Some(mut ptr) = self.writer { let writer = unsafe { ptr.as_mut() }; + // FIXME: Some UEFI firmware implementations e.g. VrtualBox's implementation + // occasionally report a EFI_DEVICE_ERROR with some text dropped out within + // SimpleTextOutput protocol, which is a firmware bug. In that case, we will + // get a `fmt::Error` here. Since the `log` crate gives no other option to + // deal with output errors, we ignore the `Result` here to prevent potential + // panics from happening. DecoratedLog::write(writer, record.level(), record.args()).unwrap_or_default(); } }