@@ -101,6 +101,8 @@ where
101101 pub fn construct_memory_map (
102102 self ,
103103 regions : & mut [ MaybeUninit < MemoryRegion > ] ,
104+ kernel_slice_start : u64 ,
105+ kernel_slice_len : u64 ,
104106 ) -> & mut [ MemoryRegion ] {
105107 let mut next_index = 0 ;
106108
@@ -145,7 +147,52 @@ where
145147 end : end. as_u64 ( ) ,
146148 kind,
147149 } ;
148- Self :: add_region ( region, regions, & mut next_index) . unwrap ( ) ;
150+
151+ // check if region overlaps with kernel
152+ let kernel_slice_end = kernel_slice_start + kernel_slice_len;
153+ if region. kind == MemoryRegionKind :: Usable
154+ && kernel_slice_start < region. end
155+ && kernel_slice_end >= region. start
156+ {
157+ // region overlaps with kernel -> we might need to split it
158+
159+ // ensure that the kernel allocation does not span multiple regions
160+ assert ! (
161+ kernel_slice_start >= region. start,
162+ "region overlaps with kernel, but kernel begins before region \
163+ (kernel_slice_start: {kernel_slice_start:#x}, region_start: {:#x})",
164+ region. start
165+ ) ;
166+ assert ! (
167+ kernel_slice_end <= region. end,
168+ "region overlaps with kernel, but region ends before kernel \
169+ (kernel_slice_end: {kernel_slice_end:#x}, region_end: {:#x})",
170+ region. end,
171+ ) ;
172+
173+ // split the region into three parts
174+ let before_kernel = MemoryRegion {
175+ end : kernel_slice_start,
176+ ..region
177+ } ;
178+ let kernel = MemoryRegion {
179+ start : kernel_slice_start,
180+ end : kernel_slice_end,
181+ kind : MemoryRegionKind :: Bootloader ,
182+ } ;
183+ let after_kernel = MemoryRegion {
184+ start : kernel_slice_end,
185+ ..region
186+ } ;
187+
188+ // add the three regions (empty regions are ignored in `add_region`)
189+ Self :: add_region ( before_kernel, regions, & mut next_index) . unwrap ( ) ;
190+ Self :: add_region ( kernel, regions, & mut next_index) . unwrap ( ) ;
191+ Self :: add_region ( after_kernel, regions, & mut next_index) . unwrap ( ) ;
192+ } else {
193+ // add the region normally
194+ Self :: add_region ( region, regions, & mut next_index) . unwrap ( ) ;
195+ }
149196 }
150197
151198 let initialized = & mut regions[ ..next_index] ;
@@ -161,6 +208,10 @@ where
161208 regions : & mut [ MaybeUninit < MemoryRegion > ] ,
162209 next_index : & mut usize ,
163210 ) -> Result < ( ) , ( ) > {
211+ if region. start == region. end {
212+ // skip zero sized regions
213+ return Ok ( ( ) ) ;
214+ }
164215 unsafe {
165216 regions
166217 . get_mut ( * next_index)
0 commit comments