Add a user panic print for better debugging, read UserFramebuffer self

before loading from ptr because compiler optimisations make it disappear
on aarch64
This commit is contained in:
csd4ni3l 2026-05-22 22:13:42 +02:00
commit 6025f75ab3
3 changed files with 39 additions and 6 deletions

View file

@ -2,7 +2,7 @@
channel = "nightly"
targets = [
"x86_64-unknown-none",
# "aarch64-unknown-none",
"aarch64-unknown-none",
# "riscv64gc-unknown-none-elf",
# "loongarch64-unknown-none",
]

View file

@ -17,6 +17,7 @@ impl UserFrameBuffer {
src_width: usize,
src_height: usize,
) {
let _buf = unsafe { core::ptr::read_volatile(&self.buf_virt) };
for dy in 0..self.height {
let sy = dy * src_height / self.height;

View file

@ -89,13 +89,13 @@ pub extern "C" fn abs(n: i32) -> i32 {
n.abs()
}
struct BufWriter {
struct FormatBufWriter {
buf: *mut u8,
max: usize,
pos: usize,
}
impl Write for BufWriter {
impl Write for FormatBufWriter {
fn write_str(&mut self, s: &str) -> Result {
for byte in s.bytes() {
if self.pos >= self.max {
@ -302,7 +302,7 @@ pub unsafe extern "C" fn vsnprintf(
}
let max = size - 1;
let mut writer = BufWriter { buf, max, pos: 0 };
let mut writer = FormatBufWriter { buf, max, pos: 0 };
unsafe { write_c_formatted(fmt, &mut args, &mut writer) };
@ -320,7 +320,7 @@ pub unsafe extern "C" fn snprintf(buf: *mut u8, size: usize, fmt: *const u8, mut
}
let max = size - 1;
let mut writer = BufWriter { buf, max, pos: 0 };
let mut writer = FormatBufWriter { buf, max, pos: 0 };
unsafe { write_c_formatted(fmt, &mut args, &mut writer) };
@ -670,8 +670,40 @@ pub unsafe extern "C" fn __errno_location() -> *mut core::ffi::c_int {
addr_of_mut!(ERRNO)
}
struct ErrorBufWriter<'a> {
buf: &'a mut [u8],
pos: usize,
}
impl<'a> ErrorBufWriter<'a> {
fn new(buf: &'a mut [u8]) -> Self {
Self { buf, pos: 0 }
}
}
impl core::fmt::Write for ErrorBufWriter<'_> {
fn write_str(&mut self, s: &str) -> core::fmt::Result {
let bytes = s.as_bytes();
let remaining = &mut self.buf[self.pos..];
let len = bytes.len().min(remaining.len());
remaining[..len].copy_from_slice(&bytes[..len]);
self.pos += len;
Ok(())
}
}
#[panic_handler]
#[allow(unused_variables)]
fn panic(error: &core::panic::PanicInfo) -> ! {
fn panic(_info: &core::panic::PanicInfo) -> ! {
print("\nUSER PANIC:\n");
let mut buf = [0u8; 512];
let msg = {
let mut w = ErrorBufWriter::new(&mut buf);
let _ = core::fmt::write(&mut w, core::format_args!("{}", _info));
let len = w.pos;
core::str::from_utf8(&buf[..len]).unwrap_or("(utf8 error)")
};
print(msg);
print("\n");
exit(-1)
}