From f912dfa506c8a576b5b6b6b3c20eb8aa06c9067d Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 6 Dec 2015 14:58:43 +0100 Subject: [PATCH] Improve huge_page closure --- src/memory/paging/translate.rs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/memory/paging/translate.rs b/src/memory/paging/translate.rs index 97d8b58d..05a3fcb4 100644 --- a/src/memory/paging/translate.rs +++ b/src/memory/paging/translate.rs @@ -15,25 +15,31 @@ fn translate_page(page: Page) -> Option { let huge_page = || { p4.next_table(page.p4_index()) .and_then(|p3| { + let p3_entry = &p3[page.p3_index()]; // 1GiB page? - if p3[page.p3_index()].flags().contains(HUGE_PAGE | PRESENT) { - let start_frame_number = p3[page.p3_index()].pointed_frame().unwrap().number; - // address must be 1GiB aligned - assert!(start_frame_number % (ENTRY_COUNT * ENTRY_COUNT) == 0); - return Some(start_frame_number + page.p2_index() * ENTRY_COUNT + page.p1_index()); + if let Some(start_frame) = p3_entry.pointed_frame() { + if p3_entry.flags().contains(HUGE_PAGE) { + // address must be 1GiB aligned + assert!(start_frame.number % (ENTRY_COUNT * ENTRY_COUNT) == 0); + return Some(Frame { + number: start_frame.number + page.p2_index() * ENTRY_COUNT + + page.p1_index(), + }); + } } if let Some(p2) = p3.next_table(page.p3_index()) { + let p2_entry = &p2[page.p2_index()]; // 2MiB page? - if p2[page.p2_index()].flags().contains(HUGE_PAGE | PRESENT) { - let start_frame_number = p2[page.p2_index()].pointed_frame().unwrap().number; - // address must be 2MiB aligned - assert!(start_frame_number % ENTRY_COUNT == 0); - return Some(start_frame_number + page.p1_index()); + if let Some(start_frame) = p2_entry.pointed_frame() { + if p2_entry.flags().contains(HUGE_PAGE) { + // address must be 2MiB aligned + assert!(start_frame.number % ENTRY_COUNT == 0); + return Some(Frame { number: start_frame.number + page.p1_index() }); + } } } None }) - .map(|start_frame_number| Frame { number: start_frame_number }) }; p4.next_table(page.p4_index())