Skip to content

Commit f1cb4a0

Browse files
authored
Merge pull request #456 from Freax13/enhancement/faster-from_page_table_indices
optimize from_page_table_indices
2 parents 3eb9c22 + d644235 commit f1cb4a0

File tree

1 file changed

+12
-18
lines changed

1 file changed

+12
-18
lines changed

src/structures/paging/page.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,10 @@ impl Page<Size1GiB> {
182182
p4_index: PageTableIndex,
183183
p3_index: PageTableIndex,
184184
) -> Self {
185-
use bit_field::BitField;
186-
187185
let mut addr = 0;
188-
addr.set_bits(39..48, u64::from(p4_index));
189-
addr.set_bits(30..39, u64::from(p3_index));
190-
Page::containing_address(VirtAddr::new(addr))
186+
addr |= u64::from(p4_index) << 39;
187+
addr |= u64::from(p3_index) << 30;
188+
Page::containing_address(VirtAddr::new_truncate(addr))
191189
}
192190
}
193191

@@ -199,13 +197,11 @@ impl Page<Size2MiB> {
199197
p3_index: PageTableIndex,
200198
p2_index: PageTableIndex,
201199
) -> Self {
202-
use bit_field::BitField;
203-
204200
let mut addr = 0;
205-
addr.set_bits(39..48, u64::from(p4_index));
206-
addr.set_bits(30..39, u64::from(p3_index));
207-
addr.set_bits(21..30, u64::from(p2_index));
208-
Page::containing_address(VirtAddr::new(addr))
201+
addr |= u64::from(p4_index) << 39;
202+
addr |= u64::from(p3_index) << 30;
203+
addr |= u64::from(p2_index) << 21;
204+
Page::containing_address(VirtAddr::new_truncate(addr))
209205
}
210206
}
211207

@@ -218,14 +214,12 @@ impl Page<Size4KiB> {
218214
p2_index: PageTableIndex,
219215
p1_index: PageTableIndex,
220216
) -> Self {
221-
use bit_field::BitField;
222-
223217
let mut addr = 0;
224-
addr.set_bits(39..48, u64::from(p4_index));
225-
addr.set_bits(30..39, u64::from(p3_index));
226-
addr.set_bits(21..30, u64::from(p2_index));
227-
addr.set_bits(12..21, u64::from(p1_index));
228-
Page::containing_address(VirtAddr::new(addr))
218+
addr |= u64::from(p4_index) << 39;
219+
addr |= u64::from(p3_index) << 30;
220+
addr |= u64::from(p2_index) << 21;
221+
addr |= u64::from(p1_index) << 12;
222+
Page::containing_address(VirtAddr::new_truncate(addr))
229223
}
230224

231225
/// Returns the level 1 page table index of this page.

0 commit comments

Comments
 (0)