diff --git a/abi/src/lib.rs b/abi/src/lib.rs index c387b4a..86547b9 100644 --- a/abi/src/lib.rs +++ b/abi/src/lib.rs @@ -3,6 +3,16 @@ use abi_sys::{Syscall, call_abi}; use shared::keyboard::{KeyCode, KeyEvent, KeyState, Modifiers}; +pub fn print(msg: &str) { + let syscall = Syscall::Print { + msg: msg.as_ptr(), + len: msg.len(), + }; + unsafe { + call_abi(&syscall); + } +} + pub mod display { use crate::{Syscall, call_abi}; use embedded_graphics::{ diff --git a/abi_sys/src/lib.rs b/abi_sys/src/lib.rs index 2ed0f97..b0586ca 100644 --- a/abi_sys/src/lib.rs +++ b/abi_sys/src/lib.rs @@ -25,4 +25,8 @@ pub enum Syscall { pixels: *const Pixel, len: usize, }, + Print { + msg: *const u8, + len: usize, + }, } diff --git a/kernel/src/abi.rs b/kernel/src/abi.rs index 34c2fb5..8bf87f1 100644 --- a/kernel/src/abi.rs +++ b/kernel/src/abi.rs @@ -28,5 +28,15 @@ pub extern "C" fn call_abi(call: *const Syscall) { .draw_iter(slice.iter().copied()) .unwrap(); } + Syscall::Print { msg, len } => { + // SAFETY: we're trusting the user program here + let slice = unsafe { core::slice::from_raw_parts(*msg, *len) }; + + if let Ok(str) = str::from_utf8(slice) { + defmt::info!("{:?}", str); + } else { + defmt::error!("Failed to parse user print str") + } + } } } diff --git a/user-apps/calculator/src/main.rs b/user-apps/calculator/src/main.rs index aa5efc7..9f2674e 100644 --- a/user-apps/calculator/src/main.rs +++ b/user-apps/calculator/src/main.rs @@ -1,7 +1,7 @@ #![no_std] #![no_main] -use abi::display::Display; +use abi::{display::Display, print}; use core::panic::PanicInfo; use embedded_graphics::{ Drawable, @@ -19,6 +19,7 @@ fn panic(_info: &PanicInfo) -> ! { #[unsafe(no_mangle)] pub extern "C" fn _start() { + print("Starting Calculator app"); let mut display = Display; let character_style = MonoTextStyle::new(&FONT_6X10, Rgb565::RED);