sad: death of panicless *+ smth
Give in in favor of str and utf8 with perfect valid state and panic bailout everywhere in std. Define some more Boot Info Format tags.
This commit is contained in:
@@ -10,4 +10,5 @@ test = false
|
||||
bench = false
|
||||
|
||||
[dependencies]
|
||||
ascii = { version = "1.1.0", default-features = false }
|
||||
bios = { workspace = true }
|
||||
|
||||
@@ -16,11 +16,16 @@
|
||||
/// Triggers a linker failure if this reaches that phase
|
||||
#[panic_handler]
|
||||
fn panic(_info: &PanicInfo) -> ! {
|
||||
unsafe extern "C" {
|
||||
static __PANIC_HANDLER_WAS_LINKED__DO_NOT_DEFINE: extern "C" fn() -> !;
|
||||
}
|
||||
// 2026-02-21: Officially the end of panicless OxideOS, did you know `Debug for str` has panic
|
||||
// code paths :pensive:. At least compile ones, maybe runtime impossible but still not compiled
|
||||
// away.
|
||||
unsafe { asm!("ud2", "hlt", options(noreturn)) };
|
||||
|
||||
unsafe { __PANIC_HANDLER_WAS_LINKED__DO_NOT_DEFINE() };
|
||||
// unsafe extern "C" {
|
||||
// static __PANIC_HANDLER_WAS_LINKED__DO_NOT_DEFINE: extern "C" fn() -> !;
|
||||
// }
|
||||
|
||||
// unsafe { __PANIC_HANDLER_WAS_LINKED__DO_NOT_DEFINE() };
|
||||
}
|
||||
|
||||
use core::{arch::asm, fmt::Write as _, hint::black_box, panic::PanicInfo};
|
||||
@@ -49,15 +54,13 @@ extern "C" fn start(boot_info: &bif::FixedPart) -> ! {
|
||||
vt.set_color(VgaColor::new(ColorNibble::BLUE, ColorNibble::GREEN));
|
||||
vt.put_at(10, 5);
|
||||
vt.slide();
|
||||
vt.print_n(boot_info as *const _ as usize as u32);
|
||||
vt.write(b"testinggg\ntags:\n");
|
||||
|
||||
let tags = bif::TagsIter::new(boot_info);
|
||||
for tag in tags {
|
||||
sleep_short();
|
||||
|
||||
vt.print_n(tag.typ());
|
||||
vt.write(b": ");
|
||||
let _ = write!(&mut vt, "{}: ", tag.typ());
|
||||
let Some(tag) = tag.tag() else {
|
||||
vt.write(b"unknown tag\n");
|
||||
continue;
|
||||
|
||||
@@ -54,6 +54,8 @@ pub mod bif {
|
||||
}
|
||||
|
||||
pub mod types {
|
||||
use ascii::AsciiStr;
|
||||
|
||||
macro tagset($taggedvis:vis $taggedname:ident { $( $typname:ident ($typn:expr) { $($typprop:ident : $typpropty:ty),* $(,)? } ),* $(,)? }) {
|
||||
$(
|
||||
#[repr(C)]
|
||||
@@ -71,14 +73,14 @@ pub mod bif {
|
||||
}
|
||||
}
|
||||
|
||||
// All these AsciiStr are actually CStr's
|
||||
tagset! { pub TagTagged {
|
||||
|
||||
Terminate(0) {},
|
||||
BootCommandLine(1) {
|
||||
string: [u8],
|
||||
string: AsciiStr,
|
||||
},
|
||||
BootLoaderName(2) {
|
||||
string: [u8],
|
||||
string: AsciiStr,
|
||||
},
|
||||
BasicMemoryInformation(4) {
|
||||
mem_lower: u32,
|
||||
@@ -89,6 +91,42 @@ pub mod bif {
|
||||
partition: u32,
|
||||
sub_partition: u32,
|
||||
},
|
||||
MemoryMap(6) {
|
||||
entry_size: u32,
|
||||
entry_version: u32,
|
||||
entries: [u8], // "varies"?
|
||||
},
|
||||
FramebufferInfo(8) {
|
||||
addr: u64,
|
||||
pitch: u32,
|
||||
width: u32,
|
||||
height: u32,
|
||||
bpp: u8,
|
||||
typ: u8,
|
||||
_reserved: u8,
|
||||
color_info: [u8],
|
||||
},
|
||||
ELFSymbols(9) {
|
||||
num: u16,
|
||||
entsize: u16,
|
||||
shndx: u16,
|
||||
_reserved: u16,
|
||||
section_headers: [u8], // "varies"?
|
||||
},
|
||||
APMTable(10) {
|
||||
version: u16,
|
||||
cseg: u16,
|
||||
offset: u32,
|
||||
cseg_16: u16,
|
||||
dseg: u16,
|
||||
flags: u16,
|
||||
cseg_len: u16,
|
||||
cseg_16_len: u16,
|
||||
dseg_len: u16,
|
||||
},
|
||||
ACPIoldRSDP(14) {
|
||||
rsdpv1_old: [u8],
|
||||
},
|
||||
ImageLoadBasePhyAddr(21) {
|
||||
load_base_addr: u32,
|
||||
},
|
||||
@@ -155,13 +193,18 @@ pub mod bif {
|
||||
}
|
||||
|
||||
typ_match!(match typ {
|
||||
Terminate
|
||||
BasicMemoryInformation
|
||||
BIOSBootDevice
|
||||
Terminate
|
||||
APMTable
|
||||
ImageLoadBasePhyAddr
|
||||
} fat {
|
||||
BootCommandLine
|
||||
BootLoaderName
|
||||
MemoryMap
|
||||
FramebufferInfo
|
||||
ELFSymbols
|
||||
ACPIoldRSDP
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,18 +54,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
pub fn print_n(&mut self, n: u32) {
|
||||
const BASE: u32 = 10;
|
||||
|
||||
if n == 0 {
|
||||
// TODO: print a 0 if no recursion in the future
|
||||
} else {
|
||||
let digit = (n % BASE) as u8;
|
||||
self.print_n(n / 10);
|
||||
self.write(&[b'0' + digit]);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write(&mut self, data: &[u8]) {
|
||||
const BAD_CHAR_COL: VgaColor = VgaColor::new(ColorNibble::WHITE, ColorNibble::RED);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user