MCPcopy Create free account
hub / github.com/bendudson/EuraliOS / copy_pages_rec

Function copy_pages_rec

kernel/src/memory.rs:136–164  ·  view source on GitHub ↗
(physical_memory_offset: VirtAddr,
                      from_table: &PageTable, to_table: &mut PageTable,
                      level: u16)

Source from the content-addressed store, hash-verified

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);

Callers 1

copy_pagetablesFunction · 0.85

Calls 4

create_empty_pagetableFunction · 0.85
iterMethod · 0.80
as_ptrMethod · 0.80
as_u64Method · 0.45

Tested by

no test coverage detected