Skip to content

Commit 49802d1

Browse files
committed
Mapper::unmap now also returns the flags of the page
1 parent ca63fa9 commit 49802d1

File tree

4 files changed

+21
-16
lines changed

4 files changed

+21
-16
lines changed

src/structures/paging/mapper/mapped_page_table.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ impl<'a, P: PageTableFrameMapping> Mapper<Size1GiB> for MappedPageTable<'a, P> {
169169
fn unmap(
170170
&mut self,
171171
page: Page<Size1GiB>,
172-
) -> Result<(PhysFrame<Size1GiB>, MapperFlush<Size1GiB>), UnmapError> {
172+
) -> Result<(PhysFrame<Size1GiB>, PageTableFlags, MapperFlush<Size1GiB>), UnmapError> {
173173
let p4 = &mut self.level_4_table;
174174
let p3 = self
175175
.page_table_walker
@@ -189,7 +189,7 @@ impl<'a, P: PageTableFrameMapping> Mapper<Size1GiB> for MappedPageTable<'a, P> {
189189
.map_err(|AddressNotAligned| UnmapError::InvalidFrameAddress(p3_entry.addr()))?;
190190

191191
p3_entry.set_unused();
192-
Ok((frame, MapperFlush::new(page)))
192+
Ok((frame, flags, MapperFlush::new(page)))
193193
}
194194

195195
fn clear(&mut self, page: Page<Size1GiB>) -> Result<UnmappedFrame<Size1GiB>, UnmapError> {
@@ -309,7 +309,7 @@ impl<'a, P: PageTableFrameMapping> Mapper<Size2MiB> for MappedPageTable<'a, P> {
309309
fn unmap(
310310
&mut self,
311311
page: Page<Size2MiB>,
312-
) -> Result<(PhysFrame<Size2MiB>, MapperFlush<Size2MiB>), UnmapError> {
312+
) -> Result<(PhysFrame<Size2MiB>, PageTableFlags, MapperFlush<Size2MiB>), UnmapError> {
313313
let p4 = &mut self.level_4_table;
314314
let p3 = self
315315
.page_table_walker
@@ -332,7 +332,7 @@ impl<'a, P: PageTableFrameMapping> Mapper<Size2MiB> for MappedPageTable<'a, P> {
332332
.map_err(|AddressNotAligned| UnmapError::InvalidFrameAddress(p2_entry.addr()))?;
333333

334334
p2_entry.set_unused();
335-
Ok((frame, MapperFlush::new(page)))
335+
Ok((frame, flags, MapperFlush::new(page)))
336336
}
337337

338338
fn clear(&mut self, page: Page<Size2MiB>) -> Result<UnmappedFrame<Size2MiB>, UnmapError> {
@@ -470,7 +470,7 @@ impl<'a, P: PageTableFrameMapping> Mapper<Size4KiB> for MappedPageTable<'a, P> {
470470
fn unmap(
471471
&mut self,
472472
page: Page<Size4KiB>,
473-
) -> Result<(PhysFrame<Size4KiB>, MapperFlush<Size4KiB>), UnmapError> {
473+
) -> Result<(PhysFrame<Size4KiB>, PageTableFlags, MapperFlush<Size4KiB>), UnmapError> {
474474
let p4 = &mut self.level_4_table;
475475
let p3 = self
476476
.page_table_walker
@@ -488,9 +488,10 @@ impl<'a, P: PageTableFrameMapping> Mapper<Size4KiB> for MappedPageTable<'a, P> {
488488
FrameError::FrameNotPresent => UnmapError::PageNotMapped,
489489
FrameError::HugeFrame => UnmapError::ParentEntryHugePage,
490490
})?;
491+
let flags = p1_entry.flags();
491492

492493
p1_entry.set_unused();
493-
Ok((frame, MapperFlush::new(page)))
494+
Ok((frame, flags, MapperFlush::new(page)))
494495
}
495496

496497
fn clear(&mut self, page: Page<Size4KiB>) -> Result<UnmappedFrame<Size4KiB>, UnmapError> {

src/structures/paging/mapper/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,10 @@ pub trait Mapper<S: PageSize> {
282282
/// Removes a mapping from the page table and returns the frame that used to be mapped.
283283
///
284284
/// Note that no page tables or pages are deallocated.
285-
fn unmap(&mut self, page: Page<S>) -> Result<(PhysFrame<S>, MapperFlush<S>), UnmapError>;
285+
fn unmap(
286+
&mut self,
287+
page: Page<S>,
288+
) -> Result<(PhysFrame<S>, PageTableFlags, MapperFlush<S>), UnmapError>;
286289

287290
/// Clears a mapping from the page table and returns the frame that used to be mapped.
288291
///

src/structures/paging/mapper/offset_page_table.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl<'a> Mapper<Size1GiB> for OffsetPageTable<'a> {
8888
fn unmap(
8989
&mut self,
9090
page: Page<Size1GiB>,
91-
) -> Result<(PhysFrame<Size1GiB>, MapperFlush<Size1GiB>), UnmapError> {
91+
) -> Result<(PhysFrame<Size1GiB>, PageTableFlags, MapperFlush<Size1GiB>), UnmapError> {
9292
self.inner.unmap(page)
9393
}
9494

@@ -162,7 +162,7 @@ impl<'a> Mapper<Size2MiB> for OffsetPageTable<'a> {
162162
fn unmap(
163163
&mut self,
164164
page: Page<Size2MiB>,
165-
) -> Result<(PhysFrame<Size2MiB>, MapperFlush<Size2MiB>), UnmapError> {
165+
) -> Result<(PhysFrame<Size2MiB>, PageTableFlags, MapperFlush<Size2MiB>), UnmapError> {
166166
self.inner.unmap(page)
167167
}
168168

@@ -236,7 +236,7 @@ impl<'a> Mapper<Size4KiB> for OffsetPageTable<'a> {
236236
fn unmap(
237237
&mut self,
238238
page: Page<Size4KiB>,
239-
) -> Result<(PhysFrame<Size4KiB>, MapperFlush<Size4KiB>), UnmapError> {
239+
) -> Result<(PhysFrame<Size4KiB>, PageTableFlags, MapperFlush<Size4KiB>), UnmapError> {
240240
self.inner.unmap(page)
241241
}
242242

src/structures/paging/mapper/recursive_page_table.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ impl<'a> Mapper<Size1GiB> for RecursivePageTable<'a> {
318318
fn unmap(
319319
&mut self,
320320
page: Page<Size1GiB>,
321-
) -> Result<(PhysFrame<Size1GiB>, MapperFlush<Size1GiB>), UnmapError> {
321+
) -> Result<(PhysFrame<Size1GiB>, PageTableFlags, MapperFlush<Size1GiB>), UnmapError> {
322322
let p4 = &mut self.p4;
323323
let p4_entry = &p4[page.p4_index()];
324324

@@ -342,7 +342,7 @@ impl<'a> Mapper<Size1GiB> for RecursivePageTable<'a> {
342342
.map_err(|AddressNotAligned| UnmapError::InvalidFrameAddress(p3_entry.addr()))?;
343343

344344
p3_entry.set_unused();
345-
Ok((frame, MapperFlush::new(page)))
345+
Ok((frame, flags, MapperFlush::new(page)))
346346
}
347347

348348
fn clear(&mut self, page: Page<Size1GiB>) -> Result<UnmappedFrame<Size1GiB>, UnmapError> {
@@ -473,7 +473,7 @@ impl<'a> Mapper<Size2MiB> for RecursivePageTable<'a> {
473473
fn unmap(
474474
&mut self,
475475
page: Page<Size2MiB>,
476-
) -> Result<(PhysFrame<Size2MiB>, MapperFlush<Size2MiB>), UnmapError> {
476+
) -> Result<(PhysFrame<Size2MiB>, PageTableFlags, MapperFlush<Size2MiB>), UnmapError> {
477477
let p4 = &mut self.p4;
478478
let p4_entry = &p4[page.p4_index()];
479479
p4_entry.frame().map_err(|err| match err {
@@ -503,7 +503,7 @@ impl<'a> Mapper<Size2MiB> for RecursivePageTable<'a> {
503503
.map_err(|AddressNotAligned| UnmapError::InvalidFrameAddress(p2_entry.addr()))?;
504504

505505
p2_entry.set_unused();
506-
Ok((frame, MapperFlush::new(page)))
506+
Ok((frame, flags, MapperFlush::new(page)))
507507
}
508508

509509
fn clear(&mut self, page: Page<Size2MiB>) -> Result<UnmappedFrame<Size2MiB>, UnmapError> {
@@ -669,7 +669,7 @@ impl<'a> Mapper<Size4KiB> for RecursivePageTable<'a> {
669669
fn unmap(
670670
&mut self,
671671
page: Page<Size4KiB>,
672-
) -> Result<(PhysFrame<Size4KiB>, MapperFlush<Size4KiB>), UnmapError> {
672+
) -> Result<(PhysFrame<Size4KiB>, PageTableFlags, MapperFlush<Size4KiB>), UnmapError> {
673673
let p4 = &mut self.p4;
674674
let p4_entry = &p4[page.p4_index()];
675675
p4_entry.frame().map_err(|err| match err {
@@ -698,9 +698,10 @@ impl<'a> Mapper<Size4KiB> for RecursivePageTable<'a> {
698698
FrameError::FrameNotPresent => UnmapError::PageNotMapped,
699699
FrameError::HugeFrame => UnmapError::ParentEntryHugePage,
700700
})?;
701+
let flags = p1_entry.flags();
701702

702703
p1_entry.set_unused();
703-
Ok((frame, MapperFlush::new(page)))
704+
Ok((frame, flags, MapperFlush::new(page)))
704705
}
705706

706707
fn clear(&mut self, page: Page<Size4KiB>) -> Result<UnmappedFrame<Size4KiB>, UnmapError> {

0 commit comments

Comments
 (0)