@@ -16,6 +16,7 @@ use std::sync::{Arc, Barrier, Mutex};
16
16
17
17
use anyhow:: anyhow;
18
18
use kvm_ioctls:: { IoEventAddress , NoDatamatch } ;
19
+ use log:: warn;
19
20
use pci:: {
20
21
BarReprogrammingParams , MsixCap , MsixConfig , MsixConfigState , PciBarConfiguration ,
21
22
PciBarRegionType , PciBdf , PciCapability , PciCapabilityId , PciClassCode , PciConfiguration ,
@@ -239,7 +240,6 @@ const VIRTIO_PCI_DEVICE_ID_BASE: u16 = 0x1040; // Add to device type to get devi
239
240
pub struct VirtioPciDeviceState {
240
241
pub pci_device_bdf : PciBdf ,
241
242
pub device_activated : bool ,
242
- pub interrupt_status : usize ,
243
243
pub cap_pci_cfg_offset : usize ,
244
244
pub cap_pci_cfg : Vec < u8 > ,
245
245
pub pci_configuration_state : PciConfigurationState ,
@@ -281,7 +281,6 @@ pub struct VirtioPciDevice {
281
281
device_activated : Arc < AtomicBool > ,
282
282
283
283
// PCI interrupts.
284
- interrupt_status : Arc < AtomicUsize > ,
285
284
virtio_interrupt : Option < Arc < dyn VirtioInterrupt > > ,
286
285
interrupt_source_group : Arc < MsiVectorGroup > ,
287
286
@@ -402,7 +401,6 @@ impl VirtioPciDevice {
402
401
msix_num : msi_vectors. num_vectors ( ) ,
403
402
device,
404
403
device_activated : Arc :: new ( AtomicBool :: new ( false ) ) ,
405
- interrupt_status : Arc :: new ( AtomicUsize :: new ( 0 ) ) ,
406
404
virtio_interrupt : Some ( interrupt) ,
407
405
memory,
408
406
interrupt_source_group : msi_vectors,
@@ -453,7 +451,6 @@ impl VirtioPciDevice {
453
451
msix_num : msi_vectors. num_vectors ( ) ,
454
452
device,
455
453
device_activated : Arc :: new ( AtomicBool :: new ( state. device_activated ) ) ,
456
- interrupt_status : Arc :: new ( AtomicUsize :: new ( state. interrupt_status ) ) ,
457
454
virtio_interrupt : Some ( interrupt) ,
458
455
memory : memory. clone ( ) ,
459
456
interrupt_source_group : msi_vectors,
@@ -640,7 +637,6 @@ impl VirtioPciDevice {
640
637
VirtioPciDeviceState {
641
638
pci_device_bdf : self . pci_device_bdf ,
642
639
device_activated : self . device_activated . load ( Ordering :: Acquire ) ,
643
- interrupt_status : self . interrupt_status . load ( Ordering :: Acquire ) ,
644
640
cap_pci_cfg_offset : self . cap_pci_cfg_info . offset ,
645
641
cap_pci_cfg : self . cap_pci_cfg_info . cap . bytes ( ) . to_vec ( ) ,
646
642
pci_configuration_state : self . configuration . state ( ) ,
@@ -864,14 +860,9 @@ impl PciDevice for VirtioPciDevice {
864
860
. read ( o - COMMON_CONFIG_BAR_OFFSET , data, self . device . clone ( ) )
865
861
}
866
862
o if ( ISR_CONFIG_BAR_OFFSET ..ISR_CONFIG_BAR_OFFSET + ISR_CONFIG_SIZE ) . contains ( & o) => {
867
- if let Some ( v) = data. get_mut ( 0 ) {
868
- // Reading this register resets it to 0.
869
- * v = self
870
- . interrupt_status
871
- . swap ( 0 , Ordering :: AcqRel )
872
- . try_into ( )
873
- . unwrap ( ) ;
874
- }
863
+ // We don't actually support legacy INT#x interrupts for VirtIO PCI devices
864
+ warn ! ( "pci: read access to unsupported ISR status field" ) ;
865
+ data. fill ( 0 ) ;
875
866
}
876
867
o if ( DEVICE_CONFIG_BAR_OFFSET ..DEVICE_CONFIG_BAR_OFFSET + DEVICE_CONFIG_SIZE )
877
868
. contains ( & o) =>
@@ -911,10 +902,8 @@ impl PciDevice for VirtioPciDevice {
911
902
. write ( o - COMMON_CONFIG_BAR_OFFSET , data, self . device . clone ( ) )
912
903
}
913
904
o if ( ISR_CONFIG_BAR_OFFSET ..ISR_CONFIG_BAR_OFFSET + ISR_CONFIG_SIZE ) . contains ( & o) => {
914
- if let Some ( v) = data. first ( ) {
915
- self . interrupt_status
916
- . fetch_and ( !( * v as usize ) , Ordering :: AcqRel ) ;
917
- }
905
+ // We don't actually support legacy INT#x interrupts for VirtIO PCI devices
906
+ warn ! ( "pci: access to unsupported ISR status field" ) ;
918
907
}
919
908
o if ( DEVICE_CONFIG_BAR_OFFSET ..DEVICE_CONFIG_BAR_OFFSET + DEVICE_CONFIG_SIZE )
920
909
. contains ( & o) =>
@@ -1460,4 +1449,27 @@ mod tests {
1460
1449
0x42
1461
1450
) ;
1462
1451
}
1452
+
1453
+ fn isr_status_read ( device : & mut VirtioPciDevice ) -> u32 {
1454
+ let mut data = 0u32 ;
1455
+ device. read_bar ( 0 , ISR_CONFIG_BAR_OFFSET , data. as_mut_slice ( ) ) ;
1456
+ data
1457
+ }
1458
+
1459
+ fn isr_status_write ( device : & mut VirtioPciDevice , data : u32 ) {
1460
+ device. write_bar ( 0 , ISR_CONFIG_BAR_OFFSET , data. as_slice ( ) ) ;
1461
+ }
1462
+
1463
+ #[ test]
1464
+ fn test_isr_capability ( ) {
1465
+ let mut vmm = create_vmm_with_virtio_pci_device ( ) ;
1466
+ let device = get_virtio_device ( & vmm) ;
1467
+ let mut locked_virtio_pci_device = device. lock ( ) . unwrap ( ) ;
1468
+
1469
+ // We don't support legacy interrupts so reads to ISR BAR should always return 0s and
1470
+ // writes to it should not have any effect
1471
+ assert_eq ! ( isr_status_read( & mut locked_virtio_pci_device) , 0 ) ;
1472
+ isr_status_write ( & mut locked_virtio_pci_device, 0x1312 ) ;
1473
+ assert_eq ! ( isr_status_read( & mut locked_virtio_pci_device) , 0 ) ;
1474
+ }
1463
1475
}
0 commit comments