MCPcopy Index your code
hub / github.com/cloud-hypervisor/cloud-hypervisor / set_msg_ctl

Method set_msg_ctl

pci/src/msix.rs:221–268  ·  view source on GitHub ↗
(&mut self, reg: u16)

Source from the content-addressed store, hash-verified

219 }
220
221 pub fn set_msg_ctl(&mut self, reg: u16) {
222 let old_masked = self.masked;
223 let old_enabled = self.enabled;
224
225 self.masked = ((reg >> FUNCTION_MASK_BIT) & 1u16) == 1u16;
226 self.enabled = ((reg >> MSIX_ENABLE_BIT) & 1u16) == 1u16;
227
228 // Update interrupt routing
229 if old_masked != self.masked || old_enabled != self.enabled {
230 if self.enabled && !self.masked {
231 debug!("MSI-X enabled for device 0x{:x}", self.devid);
232 for (idx, table_entry) in self.table_entries.iter().enumerate() {
233 let config = MsiIrqSourceConfig {
234 high_addr: table_entry.msg_addr_hi,
235 low_addr: table_entry.msg_addr_lo,
236 data: table_entry.msg_data,
237 devid: self.devid,
238 };
239
240 if let Err(e) = self.interrupt_source_group.update(
241 idx as InterruptIndex,
242 InterruptSourceConfig::MsiIrq(config),
243 table_entry.masked(),
244 true,
245 ) {
246 error!("Failed updating vector: {e:?}");
247 }
248 }
249 } else if old_enabled || !old_masked {
250 debug!("MSI-X disabled for device 0x{:x}", self.devid);
251 if let Err(e) = self.interrupt_source_group.disable() {
252 error!("Failed disabling irq_fd: {e:?}");
253 }
254 }
255 }
256
257 // If the Function Mask bit was set, and has just been cleared, it's
258 // important to go through the entire PBA to check if there was any
259 // pending MSI-X message to inject, given that the vector is not
260 // masked.
261 if old_masked && !self.masked {
262 for (index, entry) in self.table_entries.clone().iter().enumerate() {
263 if !entry.masked() && self.get_pba_bit(index as u16) == 1 {
264 self.inject_msix_and_clear_pba(index);
265 }
266 }
267 }
268 }
269
270 pub fn read_table(&self, offset: u64, data: &mut [u8]) {
271 assert!(data.len() == 4 || data.len() == 8);

Callers 3

updateMethod · 0.80
write_config_registerMethod · 0.80

Calls 7

iterMethod · 0.80
maskedMethod · 0.80
get_pba_bitMethod · 0.80
updateMethod · 0.45
disableMethod · 0.45
cloneMethod · 0.45

Tested by 1