50 lines
1.3 KiB
Rust
50 lines
1.3 KiB
Rust
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)
|
|
}
|