pub const MMU_PAGE_8KB: u32 = 0x2000;
pub const MMU_PAGE_16KB: u32 = 0x4000;
pub const MMU_PAGE_32KB: u32 = 0x8000;
pub const MMU_PAGE_64KB: u32 = 0x10000;
fn mmu_hal_pages_to_bytes(mmu_id: u32, page_num: u32) -> Option<u32> {
let shift_code = match crate::mmu_ll::mmu_ll_get_page_size(mmu_id) {
MMU_PAGE_64KB => 16,
MMU_PAGE_32KB => 15,
MMU_PAGE_16KB => 14,
MMU_PAGE_8KB => 13,
_page_size => {
error!("Wrong MMU page size: 0x{:x}", _page_size);
return None;
}
};
Some(page_num << shift_code)
}
pub fn esp_get_current_running_partition(partitions: &[(u32, u32)]) -> Option<usize> {
let mmu_id = 0;
let vaddr = core::hint::black_box(esp_get_current_running_partition as *const ()) as u32;
let entry_id = crate::mmu_ll::mmu_ll_get_entry_id(mmu_id, vaddr);
if !crate::mmu_ll::mmu_ll_check_entry_valid(mmu_id, entry_id) {
error!("mmu_ll_check_entry_valid failed!");
return None;
}
let offset = vaddr % mmu_hal_pages_to_bytes(mmu_id, 1)?;
let paddr = crate::mmu_ll::mmu_ll_entry_id_to_paddr_base(mmu_id, entry_id) | offset;
partitions
.iter()
.position(|&(start, size)| paddr >= start && paddr - start < size)
}