forked from AbleOS/ableos
experimental avx stuff (enable it yourself, coward) update hblang & fiddle with stuff
79 lines
1.9 KiB
Rust
79 lines
1.9 KiB
Rust
use {
|
|
crate::holeybytes::{kernel_services::block_read, Vm},
|
|
alloc::vec::Vec,
|
|
};
|
|
pub enum DtError {
|
|
QueryFailure,
|
|
}
|
|
|
|
pub fn dt_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), DtError> {
|
|
let msg_vec = block_read(mem_addr, length);
|
|
let query_string = core::str::from_utf8(
|
|
msg_vec
|
|
.split_once(|&byte| byte == 0)
|
|
.unwrap_or((msg_vec, &[]))
|
|
.0,
|
|
)
|
|
.unwrap();
|
|
log::trace!("Query {}", query_string);
|
|
|
|
let ret = query_parse(query_string);
|
|
log::trace!("Query response {}", ret);
|
|
|
|
vm.registers[1] = hbvm::value::Value(ret);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn query_parse(query_string: &str) -> u64 {
|
|
let query = query_string.split('/').collect::<Vec<&str>>();
|
|
|
|
let first_fragment: &str = &query[0];
|
|
let ret = match first_fragment {
|
|
"framebuffer" => framebuffer_parse(query),
|
|
"cpu" => cpu_parse(query),
|
|
|
|
_ => 0,
|
|
};
|
|
|
|
return ret;
|
|
}
|
|
|
|
fn cpu_parse(qt_parse_step_two: Vec<&str>) -> u64 {
|
|
let second_fragment: &str = qt_parse_step_two[1];
|
|
match second_fragment {
|
|
// "architecture" => {
|
|
// return 0;
|
|
// }
|
|
_ => {
|
|
return 0;
|
|
}
|
|
};
|
|
}
|
|
|
|
fn framebuffer_parse(qt_parse_step_two: Vec<&str>) -> u64 {
|
|
use crate::kmain::FB_REQ;
|
|
let fbs = &mut FB_REQ.get_response().get().unwrap().framebuffers();
|
|
let second_fragment: &str = qt_parse_step_two[1];
|
|
match second_fragment {
|
|
"fb0" => {
|
|
let fb_front = &fbs[0];
|
|
let third_fragment: &str = qt_parse_step_two[2];
|
|
let ret = match third_fragment {
|
|
"ptr" => {
|
|
let ptr = fb_front.address.as_ptr().unwrap();
|
|
ptr as usize as u64
|
|
}
|
|
"width" => fb_front.width,
|
|
"height" => fb_front.height,
|
|
|
|
_ => 0,
|
|
};
|
|
return ret;
|
|
}
|
|
_ => {
|
|
return 0;
|
|
}
|
|
};
|
|
}
|