11#![ cfg( target_pointer_width = "64" ) ]
22
3- use crate :: structures:: paging:: { mapper:: * , page_table :: PageTable } ;
3+ use crate :: structures:: paging:: { mapper:: * , PageTable } ;
44
55/// A Mapper implementation that requires that the complete physical memory is mapped at some
66/// offset in the virtual address space.
7- #[ derive( Debug ) ]
8- pub struct OffsetPageTable < ' a > {
9- inner : MappedPageTable < ' a , PhysOffset > ,
10- }
7+ pub type OffsetPageTable < ' a > = MappedPageTable < ' a , PhysOffset > ;
118
129impl < ' a > OffsetPageTable < ' a > {
1310 /// Creates a new `OffsetPageTable` that uses the given offset for converting virtual
@@ -26,26 +23,17 @@ impl<'a> OffsetPageTable<'a> {
2623 /// of a valid page table hierarchy. Otherwise this function might break memory safety, e.g.
2724 /// by writing to an illegal memory location.
2825 #[ inline]
29- pub unsafe fn new ( level_4_table : & ' a mut PageTable , phys_offset : VirtAddr ) -> Self {
26+ pub unsafe fn from_phys_offset (
27+ level_4_table : & ' a mut PageTable ,
28+ phys_offset : VirtAddr ,
29+ ) -> Self {
3030 let phys_offset = unsafe { PhysOffset :: new ( phys_offset) } ;
31- Self {
32- inner : unsafe { MappedPageTable :: new ( level_4_table, phys_offset) } ,
33- }
34- }
35-
36- /// Returns an immutable reference to the wrapped level 4 `PageTable` instance.
37- pub fn level_4_table ( & self ) -> & PageTable {
38- self . inner . level_4_table ( )
39- }
40-
41- /// Returns a mutable reference to the wrapped level 4 `PageTable` instance.
42- pub fn level_4_table_mut ( & mut self ) -> & mut PageTable {
43- self . inner . level_4_table_mut ( )
31+ unsafe { MappedPageTable :: new ( level_4_table, phys_offset) }
4432 }
4533
4634 /// Returns the offset used for converting virtual to physical addresses.
4735 pub fn phys_offset ( & self ) -> VirtAddr {
48- self . inner . page_table_frame_mapping ( ) . phys_offset ( )
36+ self . page_table_frame_mapping ( ) . phys_offset ( )
4937 }
5038}
5139
@@ -88,255 +76,3 @@ unsafe impl PageTableFrameMapping for PhysOffset {
8876 virt. as_mut_ptr ( )
8977 }
9078}
91-
92- // delegate all trait implementations to inner
93-
94- impl Mapper < Size1GiB > for OffsetPageTable < ' _ > {
95- #[ inline]
96- unsafe fn map_to_with_table_flags < A > (
97- & mut self ,
98- page : Page < Size1GiB > ,
99- frame : PhysFrame < Size1GiB > ,
100- flags : PageTableFlags ,
101- parent_table_flags : PageTableFlags ,
102- allocator : & mut A ,
103- ) -> Result < MapperFlush < Size1GiB > , MapToError < Size1GiB > >
104- where
105- A : FrameAllocator < Size4KiB > + ?Sized ,
106- {
107- unsafe {
108- self . inner
109- . map_to_with_table_flags ( page, frame, flags, parent_table_flags, allocator)
110- }
111- }
112-
113- #[ inline]
114- fn unmap (
115- & mut self ,
116- page : Page < Size1GiB > ,
117- ) -> Result < ( PhysFrame < Size1GiB > , PageTableFlags , MapperFlush < Size1GiB > ) , UnmapError > {
118- self . inner . unmap ( page)
119- }
120-
121- #[ inline]
122- fn clear ( & mut self , page : Page < Size1GiB > ) -> Result < UnmappedFrame < Size1GiB > , UnmapError > {
123- self . inner . clear ( page)
124- }
125-
126- #[ inline]
127- unsafe fn update_flags (
128- & mut self ,
129- page : Page < Size1GiB > ,
130- flags : PageTableFlags ,
131- ) -> Result < MapperFlush < Size1GiB > , FlagUpdateError > {
132- unsafe { self . inner . update_flags ( page, flags) }
133- }
134-
135- #[ inline]
136- unsafe fn set_flags_p4_entry (
137- & mut self ,
138- page : Page < Size1GiB > ,
139- flags : PageTableFlags ,
140- ) -> Result < MapperFlushAll , FlagUpdateError > {
141- unsafe { self . inner . set_flags_p4_entry ( page, flags) }
142- }
143-
144- #[ inline]
145- unsafe fn set_flags_p3_entry (
146- & mut self ,
147- page : Page < Size1GiB > ,
148- flags : PageTableFlags ,
149- ) -> Result < MapperFlushAll , FlagUpdateError > {
150- unsafe { self . inner . set_flags_p3_entry ( page, flags) }
151- }
152-
153- #[ inline]
154- unsafe fn set_flags_p2_entry (
155- & mut self ,
156- page : Page < Size1GiB > ,
157- flags : PageTableFlags ,
158- ) -> Result < MapperFlushAll , FlagUpdateError > {
159- unsafe { self . inner . set_flags_p2_entry ( page, flags) }
160- }
161-
162- #[ inline]
163- fn translate_page ( & self , page : Page < Size1GiB > ) -> Result < PhysFrame < Size1GiB > , TranslateError > {
164- self . inner . translate_page ( page)
165- }
166- }
167-
168- impl Mapper < Size2MiB > for OffsetPageTable < ' _ > {
169- #[ inline]
170- unsafe fn map_to_with_table_flags < A > (
171- & mut self ,
172- page : Page < Size2MiB > ,
173- frame : PhysFrame < Size2MiB > ,
174- flags : PageTableFlags ,
175- parent_table_flags : PageTableFlags ,
176- allocator : & mut A ,
177- ) -> Result < MapperFlush < Size2MiB > , MapToError < Size2MiB > >
178- where
179- A : FrameAllocator < Size4KiB > + ?Sized ,
180- {
181- unsafe {
182- self . inner
183- . map_to_with_table_flags ( page, frame, flags, parent_table_flags, allocator)
184- }
185- }
186-
187- #[ inline]
188- fn unmap (
189- & mut self ,
190- page : Page < Size2MiB > ,
191- ) -> Result < ( PhysFrame < Size2MiB > , PageTableFlags , MapperFlush < Size2MiB > ) , UnmapError > {
192- self . inner . unmap ( page)
193- }
194-
195- #[ inline]
196- fn clear ( & mut self , page : Page < Size2MiB > ) -> Result < UnmappedFrame < Size2MiB > , UnmapError > {
197- self . inner . clear ( page)
198- }
199-
200- #[ inline]
201- unsafe fn update_flags (
202- & mut self ,
203- page : Page < Size2MiB > ,
204- flags : PageTableFlags ,
205- ) -> Result < MapperFlush < Size2MiB > , FlagUpdateError > {
206- unsafe { self . inner . update_flags ( page, flags) }
207- }
208-
209- #[ inline]
210- unsafe fn set_flags_p4_entry (
211- & mut self ,
212- page : Page < Size2MiB > ,
213- flags : PageTableFlags ,
214- ) -> Result < MapperFlushAll , FlagUpdateError > {
215- unsafe { self . inner . set_flags_p4_entry ( page, flags) }
216- }
217-
218- #[ inline]
219- unsafe fn set_flags_p3_entry (
220- & mut self ,
221- page : Page < Size2MiB > ,
222- flags : PageTableFlags ,
223- ) -> Result < MapperFlushAll , FlagUpdateError > {
224- unsafe { self . inner . set_flags_p3_entry ( page, flags) }
225- }
226-
227- #[ inline]
228- unsafe fn set_flags_p2_entry (
229- & mut self ,
230- page : Page < Size2MiB > ,
231- flags : PageTableFlags ,
232- ) -> Result < MapperFlushAll , FlagUpdateError > {
233- unsafe { self . inner . set_flags_p2_entry ( page, flags) }
234- }
235-
236- #[ inline]
237- fn translate_page ( & self , page : Page < Size2MiB > ) -> Result < PhysFrame < Size2MiB > , TranslateError > {
238- self . inner . translate_page ( page)
239- }
240- }
241-
242- impl Mapper < Size4KiB > for OffsetPageTable < ' _ > {
243- #[ inline]
244- unsafe fn map_to_with_table_flags < A > (
245- & mut self ,
246- page : Page < Size4KiB > ,
247- frame : PhysFrame < Size4KiB > ,
248- flags : PageTableFlags ,
249- parent_table_flags : PageTableFlags ,
250- allocator : & mut A ,
251- ) -> Result < MapperFlush < Size4KiB > , MapToError < Size4KiB > >
252- where
253- A : FrameAllocator < Size4KiB > + ?Sized ,
254- {
255- unsafe {
256- self . inner
257- . map_to_with_table_flags ( page, frame, flags, parent_table_flags, allocator)
258- }
259- }
260-
261- #[ inline]
262- fn unmap (
263- & mut self ,
264- page : Page < Size4KiB > ,
265- ) -> Result < ( PhysFrame < Size4KiB > , PageTableFlags , MapperFlush < Size4KiB > ) , UnmapError > {
266- self . inner . unmap ( page)
267- }
268-
269- #[ inline]
270- fn clear ( & mut self , page : Page < Size4KiB > ) -> Result < UnmappedFrame < Size4KiB > , UnmapError > {
271- self . inner . clear ( page)
272- }
273-
274- #[ inline]
275- unsafe fn update_flags (
276- & mut self ,
277- page : Page < Size4KiB > ,
278- flags : PageTableFlags ,
279- ) -> Result < MapperFlush < Size4KiB > , FlagUpdateError > {
280- unsafe { self . inner . update_flags ( page, flags) }
281- }
282-
283- #[ inline]
284- unsafe fn set_flags_p4_entry (
285- & mut self ,
286- page : Page < Size4KiB > ,
287- flags : PageTableFlags ,
288- ) -> Result < MapperFlushAll , FlagUpdateError > {
289- unsafe { self . inner . set_flags_p4_entry ( page, flags) }
290- }
291-
292- #[ inline]
293- unsafe fn set_flags_p3_entry (
294- & mut self ,
295- page : Page < Size4KiB > ,
296- flags : PageTableFlags ,
297- ) -> Result < MapperFlushAll , FlagUpdateError > {
298- unsafe { self . inner . set_flags_p3_entry ( page, flags) }
299- }
300-
301- #[ inline]
302- unsafe fn set_flags_p2_entry (
303- & mut self ,
304- page : Page < Size4KiB > ,
305- flags : PageTableFlags ,
306- ) -> Result < MapperFlushAll , FlagUpdateError > {
307- unsafe { self . inner . set_flags_p2_entry ( page, flags) }
308- }
309-
310- #[ inline]
311- fn translate_page ( & self , page : Page < Size4KiB > ) -> Result < PhysFrame < Size4KiB > , TranslateError > {
312- self . inner . translate_page ( page)
313- }
314- }
315-
316- impl Translate for OffsetPageTable < ' _ > {
317- #[ inline]
318- fn translate ( & self , addr : VirtAddr ) -> TranslateResult {
319- self . inner . translate ( addr)
320- }
321- }
322-
323- impl CleanUp for OffsetPageTable < ' _ > {
324- #[ inline]
325- unsafe fn clean_up < D > ( & mut self , frame_deallocator : & mut D )
326- where
327- D : FrameDeallocator < Size4KiB > ,
328- {
329- unsafe { self . inner . clean_up ( frame_deallocator) }
330- }
331-
332- #[ inline]
333- unsafe fn clean_up_addr_range < D > (
334- & mut self ,
335- range : PageRangeInclusive ,
336- frame_deallocator : & mut D ,
337- ) where
338- D : FrameDeallocator < Size4KiB > ,
339- {
340- unsafe { self . inner . clean_up_addr_range ( range, frame_deallocator) }
341- }
342- }
0 commit comments