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

Function copy_pagetables

kernel/src/memory.rs:131–170  ·  view source on GitHub ↗

Copy a set of pagetables

(level_4_table: &PageTable)

Source from the content-addressed store, hash-verified

129
130/// Copy a set of pagetables
131fn copy_pagetables(level_4_table: &PageTable) -> (*mut PageTable, u64) {
132 // Create a new level 4 pagetable
133 let (table_ptr, table_physaddr) = create_empty_pagetable();
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);
168
169 return (table_ptr, table_physaddr)
170}
171
172/// Creates a PageTable containing only kernel pages
173///

Callers 1

Calls 2

create_empty_pagetableFunction · 0.85
copy_pages_recFunction · 0.85

Tested by

no test coverage detected