@@ -5,8 +5,11 @@ use free_list::{AllocError, FreeList, PageLayout, PageRange};
55use hermit_sync:: InterruptTicketMutex ;
66use memory_addresses:: { PhysAddr , VirtAddr } ;
77
8- use crate :: arch:: mm:: paging:: { self , BasePageSize , PageSize } ;
8+ #[ cfg( target_arch = "x86_64" ) ]
9+ use crate :: arch:: mm:: paging:: PageTableEntryFlagsExt ;
10+ use crate :: arch:: mm:: paging:: { self , BasePageSize , HugePageSize , PageSize , PageTableEntryFlags } ;
911use crate :: env;
12+ use crate :: mm:: device_alloc:: DeviceAlloc ;
1013
1114pub static PHYSICAL_FREE_LIST : InterruptTicketMutex < FreeList < 16 > > =
1215 InterruptTicketMutex :: new ( FreeList :: new ( ) ) ;
@@ -43,6 +46,21 @@ pub unsafe fn init_frame_range(frame_range: PageRange) {
4346 . map ( |addr| PhysAddr :: new ( addr. try_into ( ) . unwrap ( ) ) )
4447 . for_each ( paging:: identity_map :: < IdentityPageSize > ) ;
4548
49+ if DeviceAlloc . phys_offset ( ) != VirtAddr :: zero ( ) {
50+ let flags = {
51+ let mut flags = PageTableEntryFlags :: empty ( ) ;
52+ flags. normal ( ) . writable ( ) . execute_disable ( ) ;
53+ flags
54+ } ;
55+ ( start..end)
56+ . step_by ( IdentityPageSize :: SIZE . try_into ( ) . unwrap ( ) )
57+ . for_each ( |addr| {
58+ let phys_addr = PhysAddr :: new ( addr. try_into ( ) . unwrap ( ) ) ;
59+ let virt_addr = VirtAddr :: from_ptr ( DeviceAlloc . ptr :: < ( ) > ( phys_addr) ) ;
60+ paging:: map :: < IdentityPageSize > ( virt_addr, phys_addr, 1 , flags) ;
61+ } ) ;
62+ }
63+
4664 TOTAL_MEMORY . fetch_add ( frame_range. len ( ) . get ( ) , Ordering :: Relaxed ) ;
4765}
4866
@@ -118,6 +136,13 @@ fn detect_from_limits() -> Result<(), ()> {
118136}
119137
120138pub fn init ( ) {
139+ if env:: is_uefi ( ) && DeviceAlloc . phys_offset ( ) != VirtAddr :: zero ( ) {
140+ let start = DeviceAlloc . phys_offset ( ) ;
141+ let count = DeviceAlloc . phys_offset ( ) . as_u64 ( ) / HugePageSize :: SIZE ;
142+ let count = usize:: try_from ( count) . unwrap ( ) ;
143+ paging:: unmap :: < HugePageSize > ( start, count) ;
144+ }
145+
121146 if let Err ( _err) = detect_from_fdt ( ) {
122147 cfg_if:: cfg_if! {
123148 if #[ cfg( any( target_arch = "aarch64" , target_arch = "riscv64" ) ) ] {
0 commit comments