@@ -113,22 +113,27 @@ impl MsiCapability {
113
113
MultipleMessageSupport :: try_from ( reg. get_bits ( 4 ..7 ) as u8 ) . unwrap_or ( MultipleMessageSupport :: Int1 )
114
114
}
115
115
116
- /// Set where the interrupts will be sent to
116
+ /// Set the memory address that will be written to when the interrupt fires.
117
117
///
118
118
/// # Arguments
119
- /// * `address` - Target Local APIC address (if not changed, can be calculated with `0xFEE00000 | (processor << 12)`)
119
+ /// * `address` - Target Local APIC address (if not changed, can be calculated with `0xfee00000 | (processor << 12)`)
120
120
/// * `vector` - Which interrupt vector should be triggered on LAPIC
121
121
/// * `trigger_mode` - When interrupt should be triggered
122
122
/// * `access` - PCI Configuration Space accessor
123
123
pub fn set_message_info (
124
124
& self ,
125
- address : u32 ,
125
+ address : u64 ,
126
126
vector : u8 ,
127
127
trigger_mode : TriggerMode ,
128
128
access : impl ConfigRegionAccess ,
129
129
) {
130
- unsafe { access. write ( self . address . address , self . address . offset + 0x4 , address) }
131
- let data_offset = if self . is_64bit { 0xC } else { 0x8 } ;
130
+ unsafe {
131
+ access. write ( self . address . address , self . address . offset + 0x04 , address. get_bits ( 0 ..32 ) as u32 ) ;
132
+ if self . is_64bit {
133
+ access. write ( self . address . address , self . address . offset + 0x08 , address. get_bits ( 32 ..64 ) as u32 ) ;
134
+ }
135
+ }
136
+ let data_offset = if self . is_64bit { 0x0c } else { 0x08 } ;
132
137
let mut data = unsafe { access. read ( self . address . address , self . address . offset + data_offset) } ;
133
138
data. set_bits ( 0 ..8 , vector as u32 ) ;
134
139
data. set_bits ( 14 ..16 , trigger_mode as u32 ) ;
0 commit comments