Improve huge_page closure

This commit is contained in:
Philipp Oppermann
2015-12-06 14:58:43 +01:00
parent 4aeda180a1
commit f912dfa506

View File

@@ -15,25 +15,31 @@ fn translate_page(page: Page) -> Option<Frame> {
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())