(physical_memory_offset: VirtAddr,
from_table: &PageTable, to_table: &mut PageTable,
level: u16)
| 134 | let table = unsafe {&mut *table_ptr}; |
| 135 | |
| 136 | fn copy_pages_rec(physical_memory_offset: VirtAddr, |
| 137 | from_table: &PageTable, to_table: &mut PageTable, |
| 138 | level: u16) { |
| 139 | for (i, entry) in from_table.iter().enumerate() { |
| 140 | if !entry.is_unused() { |
| 141 | if (level == 1) || entry.flags().contains(PageTableFlags::HUGE_PAGE) { |
| 142 | // Maps a frame, not a page table |
| 143 | to_table[i].set_addr(entry.addr(), entry.flags()); |
| 144 | } else { |
| 145 | // Create a new table at level - 1 |
| 146 | let (new_table_ptr, new_table_physaddr) = create_empty_pagetable(); |
| 147 | let to_table_m1 = unsafe {&mut *new_table_ptr}; |
| 148 | |
| 149 | // Point the entry to the new table |
| 150 | to_table[i].set_addr(PhysAddr::new(new_table_physaddr), |
| 151 | entry.flags()); |
| 152 | |
| 153 | // Get reference to the input level-1 table |
| 154 | let from_table_m1 = { |
| 155 | let virt = physical_memory_offset + entry.addr().as_u64(); |
| 156 | unsafe {& *virt.as_ptr()} |
| 157 | }; |
| 158 | |
| 159 | // Copy level-1 entries |
| 160 | copy_pages_rec(physical_memory_offset, from_table_m1, to_table_m1, level - 1); |
| 161 | } |
| 162 | } |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | let memory_info = unsafe {MEMORY_INFO.as_mut().unwrap()}; |
| 167 | copy_pages_rec(memory_info.physical_memory_offset, level_4_table, table, 4); |
no test coverage detected