@@ -75,6 +75,8 @@ fn add_e820_entry(
7575pub fn build_bootparams (
7676 guest_memory : & GuestMemoryMmap ,
7777 himem_start : GuestAddress ,
78+ reserved_memory_start : GuestAddress ,
79+ reserved_memory_end : GuestAddress ,
7880) -> std:: result:: Result < boot_params , Error > {
7981 let mut params = boot_params:: default ( ) ;
8082
@@ -88,14 +90,35 @@ pub fn build_bootparams(
8890
8991 // Add entries for the usable RAM regions.
9092 let last_addr = guest_memory. last_addr ( ) ;
91- add_e820_entry (
92- & mut params,
93- himem_start. raw_value ( ) as u64 ,
94- last_addr
95- . checked_offset_from ( himem_start)
96- . ok_or ( Error :: HimemStartPastMemEnd ) ?,
97- E820_RAM ,
98- ) ?;
93+
94+ if reserved_memory_start > last_addr {
95+ add_e820_entry (
96+ & mut params,
97+ himem_start. raw_value ( ) as u64 ,
98+ last_addr
99+ . checked_offset_from ( himem_start)
100+ . ok_or ( Error :: HimemStartPastMemEnd ) ?,
101+ E820_RAM ,
102+ ) ?;
103+ } else {
104+ add_e820_entry (
105+ & mut params,
106+ himem_start. raw_value ( ) as u64 ,
107+ reserved_memory_start
108+ . checked_offset_from ( himem_start)
109+ . ok_or ( Error :: HimemStartPastMemEnd ) ?,
110+ E820_RAM ,
111+ ) ?;
112+
113+ add_e820_entry (
114+ & mut params,
115+ reserved_memory_end. raw_value ( ) as u64 ,
116+ last_addr
117+ . checked_offset_from ( reserved_memory_end)
118+ . ok_or ( Error :: HimemStartPastMemEnd ) ?,
119+ E820_RAM ,
120+ ) ?;
121+ }
99122
100123 Ok ( params)
101124}
@@ -109,6 +132,8 @@ pub fn build_bootparams(
109132pub fn kernel_setup (
110133 guest_memory : & GuestMemoryMmap ,
111134 kernel_path : PathBuf ,
135+ reserved_memory_start : GuestAddress ,
136+ reserved_memory_end : GuestAddress ,
112137) -> Result < KernelLoaderResult > {
113138 let mut kernel_image = File :: open ( kernel_path) . map_err ( Error :: IO ) ?;
114139 let zero_page_addr = GuestAddress ( ZEROPG_START ) ;
@@ -123,7 +148,12 @@ pub fn kernel_setup(
123148 . map_err ( Error :: KernelLoad ) ?;
124149
125150 // Generate boot parameters.
126- let mut bootparams = build_bootparams ( guest_memory, GuestAddress ( HIMEM_START ) ) ?;
151+ let mut bootparams = build_bootparams (
152+ guest_memory,
153+ GuestAddress ( HIMEM_START ) ,
154+ reserved_memory_start,
155+ reserved_memory_end,
156+ ) ?;
127157
128158 // Add the kernel command line to the boot parameters.
129159 bootparams. hdr . cmd_line_ptr = CMDLINE_START as u32 ;
0 commit comments