use { crate::{alloc::string::ToString, device_tree::DeviceTree, kmain::DEVICE_TREE}, alloc::string::String, core::arch::asm, xml::XMLElement, }; pub fn collect_device_info() { log::trace!("Collecting devices on aarch64"); // Lock device tree unsafe { DEVICE_TREE.force_unlock(); } let device_tree = &mut DEVICE_TREE.lock(); collect_cpu_info(device_tree); // let dt = DEVICE_TREE.lock(); } fn collect_cpu_info(device_tree: &mut DeviceTree) { let mut cpu = XMLElement::new("cpu"); let cpu_id = cpu_id(); cpu.set_attribute("CPU Name", cpu_id.0); cpu.set_attribute("CPU Id", cpu_id.1); let cpus = device_tree.devices.get_mut("CPUs").unwrap(); cpus.push(cpu); } fn cpu_id() -> (String, u64) { let mut cpu_id: u64 = 0; unsafe { asm!("mrs {cpu_id}, MIDR_EL1", cpu_id = out(reg) cpu_id, ) } let cpu_name = match cpu_id { // the source of these two was a stackoverflow question // https://raspberrypi.stackexchange.com/questions/117175/how-do-i-read-the-cpuid-in-aarch64-asm 0x410FD034 => "Cortex-A53".to_string(), 0x410FD083 => "Cortex-A72".to_string(), _ => "Unknown".to_string(), }; log::trace!("CPU Name: {cpu_name} - CPU ID: 0x{:X}", cpu_id); (cpu_name, cpu_id) }