@@ -218,70 +218,91 @@ fn add_pci_ranges_config(vm_cfg: &mut AxVMConfig, node_name: &str, range: &PciRa
218218} 
219219
220220pub  fn  parse_passthrough_devices_address ( vm_cfg :  & mut  AxVMConfig ,  dtb :  & [ u8 ] )  { 
221-     let  fdt = Fdt :: from_bytes ( dtb) 
222-         . expect ( "Failed to parse DTB image, perhaps the DTB is invalid or corrupted" ) ; 
221+     let  devices = vm_cfg. pass_through_devices ( ) . to_vec ( ) ; 
222+     if  !devices. is_empty ( )  && devices[ 0 ] . length  != 0   { 
223+         for  ( index,  device)  in  devices. iter ( ) . enumerate ( )  { 
224+             add_device_address_config ( 
225+                 vm_cfg, 
226+                 & device. name , 
227+                 device. base_gpa , 
228+                 device. length , 
229+                 index, 
230+                 None , 
231+             ) ; 
232+         } 
233+     }  else  { 
234+         let  fdt = Fdt :: from_bytes ( dtb) 
235+             . expect ( "Failed to parse DTB image, perhaps the DTB is invalid or corrupted" ) ; 
223236
224-     // Clear existing passthrough device configurations 
225-     vm_cfg. clear_pass_through_devices ( ) ; 
237+          // Clear existing passthrough device configurations 
238+          vm_cfg. clear_pass_through_devices ( ) ; 
226239
227-     // Traverse all device tree nodes 
228-     for  node in  fdt. all_nodes ( )  { 
229-         // Skip root node 
230-         if  node. name ( )  == "/"  || node. name ( ) . starts_with ( "memory" )  { 
231-             continue ; 
232-         } 
240+          // Traverse all device tree nodes 
241+          for  node in  fdt. all_nodes ( )  { 
242+              // Skip root node 
243+              if  node. name ( )  == "/"  || node. name ( ) . starts_with ( "memory" )  { 
244+                  continue ; 
245+              } 
233246
234-         let  node_name = node. name ( ) . to_string ( ) ; 
247+              let  node_name = node. name ( ) . to_string ( ) ; 
235248
236-         // Check if it's a PCIe device node 
237-         if  node_name. starts_with ( "pcie@" )  || node_name. contains ( "pci" )  { 
238-             // Process PCIe device's ranges property 
239-             if  let  Some ( pci)  = node. clone ( ) . into_pci ( ) 
240-                 && let  Ok ( ranges)  = pci. ranges ( ) 
241-             { 
242-                 for  ( index,  range)  in  ranges. enumerate ( )  { 
243-                     add_pci_ranges_config ( vm_cfg,  & node_name,  & range,  index) ; 
249+             // Check if it's a PCIe device node 
250+             if  node_name. starts_with ( "pcie@" )  || node_name. contains ( "pci" )  { 
251+                 // Process PCIe device's ranges property 
252+                 if  let  Some ( pci)  = node. clone ( ) . into_pci ( ) 
253+                     && let  Ok ( ranges)  = pci. ranges ( ) 
254+                 { 
255+                     for  ( index,  range)  in  ranges. enumerate ( )  { 
256+                         add_pci_ranges_config ( vm_cfg,  & node_name,  & range,  index) ; 
257+                     } 
244258                } 
245-             } 
246259
247-             // Process PCIe device's reg property (ECAM space) 
248-             if  let  Some ( reg_iter)  = node. reg ( )  { 
249-                 for  ( index,  reg)  in  reg_iter. enumerate ( )  { 
250-                     let  base_address = reg. address  as  usize ; 
251-                     let  size = reg. size . unwrap_or ( 0 ) ; 
252- 
253-                     add_device_address_config ( 
254-                         vm_cfg, 
255-                         & node_name, 
256-                         base_address, 
257-                         size, 
258-                         index, 
259-                         Some ( "ecam" ) , 
260-                     ) ; 
260+                 // Process PCIe device's reg property (ECAM space) 
261+                 if  let  Some ( reg_iter)  = node. reg ( )  { 
262+                     for  ( index,  reg)  in  reg_iter. enumerate ( )  { 
263+                         let  base_address = reg. address  as  usize ; 
264+                         let  size = reg. size . unwrap_or ( 0 ) ; 
265+ 
266+                         add_device_address_config ( 
267+                             vm_cfg, 
268+                             & node_name, 
269+                             base_address, 
270+                             size, 
271+                             index, 
272+                             Some ( "ecam" ) , 
273+                         ) ; 
274+                     } 
261275                } 
262-             } 
263-         }  else  { 
264-             // Get device's reg property (process regular devices) 
265-             if  let  Some ( reg_iter)  = node. reg ( )  { 
266-                 // Process all address segments of the device 
267-                 for  ( index,  reg)  in  reg_iter. enumerate ( )  { 
268-                     // Get device's address and size information 
269-                     let  base_address = reg. address  as  usize ; 
270-                     let  size = reg. size . unwrap_or ( 0 ) ; 
271- 
272-                     add_device_address_config ( vm_cfg,  & node_name,  base_address,  size,  index,  None ) ; 
276+             }  else  { 
277+                 // Get device's reg property (process regular devices) 
278+                 if  let  Some ( reg_iter)  = node. reg ( )  { 
279+                     // Process all address segments of the device 
280+                     for  ( index,  reg)  in  reg_iter. enumerate ( )  { 
281+                         // Get device's address and size information 
282+                         let  base_address = reg. address  as  usize ; 
283+                         let  size = reg. size . unwrap_or ( 0 ) ; 
284+ 
285+                         add_device_address_config ( 
286+                             vm_cfg, 
287+                             & node_name, 
288+                             base_address, 
289+                             size, 
290+                             index, 
291+                             None , 
292+                         ) ; 
293+                     } 
273294                } 
274295            } 
275296        } 
297+         trace ! ( 
298+             "All passthrough devices: {:#x?}" , 
299+             vm_cfg. pass_through_devices( ) 
300+         ) ; 
301+         debug ! ( 
302+             "Finished parsing passthrough devices, total: {}" , 
303+             vm_cfg. pass_through_devices( ) . len( ) 
304+         ) ; 
276305    } 
277-     trace ! ( 
278-         "All passthrough devices: {:#x?}" , 
279-         vm_cfg. pass_through_devices( ) 
280-     ) ; 
281-     debug ! ( 
282-         "Finished parsing passthrough devices, total: {}" , 
283-         vm_cfg. pass_through_devices( ) . len( ) 
284-     ) ; 
285306} 
286307
287308pub  fn  parse_vm_interrupt ( vm_cfg :  & mut  AxVMConfig ,  dtb :  & [ u8 ] )  { 
0 commit comments