Files
RedBear-OS/local/patches/base/P33-vesad-graceful-boot.patch
T

204 lines
7.9 KiB
Diff

diff --git a/drivers/graphics/vesad/src/main.rs b/drivers/graphics/vesad/src/main.rs
index a4c07d1e..4db8c738 100644
--- a/drivers/graphics/vesad/src/main.rs
+++ b/drivers/graphics/vesad/src/main.rs
@@ -25,20 +25,60 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- let width = usize::from_str_radix(
- &env::var("FRAMEBUFFER_WIDTH").expect("FRAMEBUFFER_WIDTH not set"),
- 16,
- )
- .expect("failed to parse FRAMEBUFFER_WIDTH");
- let height = usize::from_str_radix(
- &env::var("FRAMEBUFFER_HEIGHT").expect("FRAMEBUFFER_HEIGHT not set"),
- 16,
- )
- .expect("failed to parse FRAMEBUFFER_HEIGHT");
- let phys = usize::from_str_radix(
- &env::var("FRAMEBUFFER_ADDR").expect("FRAMEBUFFER_ADDR not set"),
- 16,
- )
- .expect("failed to parse FRAMEBUFFER_ADDR");
- let stride = usize::from_str_radix(
- &env::var("FRAMEBUFFER_STRIDE").expect("FRAMEBUFFER_STRIDE not set"),
- 16,
- )
- .expect("failed to parse FRAMEBUFFER_STRIDE");
+ let width = match env::var("FRAMEBUFFER_WIDTH") {
+ Ok(v) => match usize::from_str_radix(&v, 16) {
+ Ok(n) => n,
+ Err(e) => {
+ eprintln!("vesad: failed to parse FRAMEBUFFER_WIDTH '{}': {} — exiting", v, e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ },
+ Err(e) => {
+ eprintln!("vesad: FRAMEBUFFER_WIDTH not readable: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
+ let height = match env::var("FRAMEBUFFER_HEIGHT") {
+ Ok(v) => match usize::from_str_radix(&v, 16) {
+ Ok(n) => n,
+ Err(e) => {
+ eprintln!("vesad: failed to parse FRAMEBUFFER_HEIGHT '{}': {} — exiting", v, e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ },
+ Err(e) => {
+ eprintln!("vesad: FRAMEBUFFER_HEIGHT not readable: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
+ let phys = match env::var("FRAMEBUFFER_ADDR") {
+ Ok(v) => match usize::from_str_radix(&v, 16) {
+ Ok(n) => n,
+ Err(e) => {
+ eprintln!("vesad: failed to parse FRAMEBUFFER_ADDR '{}': {} — exiting", v, e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ },
+ Err(e) => {
+ eprintln!("vesad: FRAMEBUFFER_ADDR not readable: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
+ let stride = match env::var("FRAMEBUFFER_STRIDE") {
+ Ok(v) => match usize::from_str_radix(&v, 16) {
+ Ok(n) => n,
+ Err(e) => {
+ eprintln!("vesad: failed to parse FRAMEBUFFER_STRIDE '{}': {} — exiting", v, e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ },
+ Err(e) => {
+ eprintln!("vesad: FRAMEBUFFER_STRIDE not readable: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
@@ -57 +97,8 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- let mut framebuffers = vec![unsafe { FrameBuffer::new(phys, width, height, stride) }];
+ let mut framebuffers = match unsafe { FrameBuffer::try_new(phys, width, height, stride) } {
+ Some(fb) => vec![fb],
+ None => {
+ eprintln!("vesad: failed to map primary framebuffer — exiting");
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
@@ -59,3 +106,2 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- //TODO: ideal maximum number of outputs?
- let bootloader_env = std::fs::read_to_string("/scheme/sys/env")
- .expect("failed to read env")
+ let bootloader_env = match std::fs::read_to_string("/scheme/sys/env") {
+ Ok(data) => data
@@ -63,3 +109,3 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- .map(|line| {
- let (env, value) = line.split_once('=').unwrap();
- (env.to_owned(), value.to_owned())
+ .filter_map(|line| {
+ line.split_once('=')
+ .map(|(env, value)| (env.to_owned(), value.to_owned()))
@@ -67 +113,6 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- .collect::<HashMap<String, String>>();
+ .collect::<HashMap<String, String>>(),
+ Err(e) => {
+ eprintln!("vesad: failed to read /scheme/sys/env: {} — continuing with primary framebuffer only", e);
+ HashMap::new()
+ }
+ };
@@ -96,4 +147,9 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- let event_queue: EventQueue<Source> =
- EventQueue::new().expect("vesad: failed to create event queue");
- event_queue
- .subscribe(
+ let event_queue: EventQueue<Source> = match EventQueue::new() {
+ Ok(q) => q,
+ Err(e) => {
+ eprintln!("vesad: failed to create event queue: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ };
+ if let Err(e) = event_queue.subscribe(
@@ -103,4 +159,6 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- )
- .unwrap();
- event_queue
- .subscribe(
+ ) {
+ eprintln!("vesad: failed to subscribe input events: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
+ if let Err(e) = event_queue.subscribe(
@@ -110,2 +168,5 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- )
- .unwrap();
+ ) {
+ eprintln!("vesad: failed to subscribe scheme events: {} — exiting", e);
+ daemon.ready();
+ std::process::exit(0);
+ }
@@ -113 +174,3 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- libredox::call::setrens(0, 0).expect("vesad: failed to enter null namespace");
+ if let Err(e) = libredox::call::setrens(0, 0) {
+ eprintln!("vesad: failed to enter null namespace: {} — continuing", e);
+ }
@@ -120 +183,7 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- .chain(event_queue.map(|e| e.expect("vesad: failed to get next event").user_data))
+ .chain(event_queue.map(|e| match e {
+ Ok(ev) => ev.user_data,
+ Err(err) => {
+ eprintln!("vesad: event error: {} — continuing", err);
+ Source::Scheme
+ }
+ }))
@@ -125,3 +194,3 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- scheme
- .tick()
- .expect("vesad: failed to handle scheme events");
+ if let Err(e) = scheme.tick() {
+ eprintln!("vesad: scheme tick error: {} — continuing", e);
+ }
@@ -132 +201,2 @@ fn daemon(daemon: daemon::Daemon) -> ! {
- panic!();
+ eprintln!("vesad: event loop ended unexpectedly — exiting");
+ std::process::exit(1);
diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs
index 5bf2be91..9ce6b89a 100644
--- a/drivers/graphics/vesad/src/scheme.rs
+++ b/drivers/graphics/vesad/src/scheme.rs
@@ -160 +160 @@ impl FrameBuffer {
- pub unsafe fn new(phys: usize, width: usize, height: usize, stride: usize) -> Self {
+ pub unsafe fn try_new(phys: usize, width: usize, height: usize, stride: usize) -> Option<Self> {
@@ -162 +162 @@ impl FrameBuffer {
- let virt = common::physmap(
+ let virt = match common::physmap(
@@ -170,2 +170,7 @@ impl FrameBuffer {
- )
- .expect("vesad: failed to map framebuffer") as *mut u32;
+ ) {
+ Ok(v) => v as *mut u32,
+ Err(e) => {
+ eprintln!("vesad: failed to map framebuffer at 0x{phys:X}: {e}");
+ return None;
+ }
+ };
@@ -175 +180 @@ impl FrameBuffer {
- Self {
+ Some(Self {
@@ -181 +186 @@ impl FrameBuffer {
- }
+ })
@@ -205 +210 @@ impl FrameBuffer {
- Some(Self::new(phys, width, height, stride))
+ Self::try_new(phys, width, height, stride)