MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / read_table

Method read_table

pci/src/msix.rs:270–321  ·  view source on GitHub ↗
(&self, offset: u64, data: &mut [u8])

Source from the content-addressed store, hash-verified

268 }
269
270 pub fn read_table(&self, offset: u64, data: &mut [u8]) {
271 assert!(data.len() == 4 || data.len() == 8);
272
273 let index: usize = (offset / MSIX_TABLE_ENTRIES_MODULO) as usize;
274 let modulo_offset = offset % MSIX_TABLE_ENTRIES_MODULO;
275
276 if index >= self.table_entries.len() {
277 debug!("Invalid MSI-X table entry index {index}");
278 data.copy_from_slice(&[0xff; 8][..data.len()]);
279 return;
280 }
281
282 match data.len() {
283 4 => {
284 let value = match modulo_offset {
285 0x0 => self.table_entries[index].msg_addr_lo,
286 0x4 => self.table_entries[index].msg_addr_hi,
287 0x8 => self.table_entries[index].msg_data,
288 0xc => self.table_entries[index].vector_ctl,
289 _ => {
290 error!("invalid offset");
291 0
292 }
293 };
294
295 debug!("MSI_R TABLE offset 0x{offset:x} data 0x{value:x}");
296 LittleEndian::write_u32(data, value);
297 }
298 8 => {
299 let value = match modulo_offset {
300 0x0 => {
301 (u64::from(self.table_entries[index].msg_addr_hi) << 32)
302 | u64::from(self.table_entries[index].msg_addr_lo)
303 }
304 0x8 => {
305 (u64::from(self.table_entries[index].vector_ctl) << 32)
306 | u64::from(self.table_entries[index].msg_data)
307 }
308 _ => {
309 error!("invalid offset");
310 0
311 }
312 };
313
314 debug!("MSI_R TABLE offset 0x{offset:x} data 0x{value:x}");
315 LittleEndian::write_u64(data, value);
316 }
317 _ => {
318 error!("invalid data length");
319 }
320 }
321 }
322
323 pub fn write_table(&mut self, offset: u64, data: &[u8]) {
324 if data.len() != 4 && data.len() != 8 {

Callers 2

msix_read_tableMethod · 0.80
read_barMethod · 0.80

Calls 1

lenMethod · 0.45

Tested by

no test coverage detected