@@ -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