204 lines
7.9 KiB
Diff
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)
|