(&mut self, addr: u64, nb_blocks: u16, plug: bool)
| 479 | } |
| 480 | |
| 481 | fn state_change_request(&mut self, addr: u64, nb_blocks: u16, plug: bool) -> u16 { |
| 482 | let mut config = self.config.lock().unwrap(); |
| 483 | let size: u64 = nb_blocks as u64 * config.block_size; |
| 484 | |
| 485 | if plug && (config.plugged_size + size > config.requested_size) { |
| 486 | return VIRTIO_MEM_RESP_NACK; |
| 487 | } |
| 488 | if !config.is_valid_range(addr, size) { |
| 489 | return VIRTIO_MEM_RESP_ERROR; |
| 490 | } |
| 491 | |
| 492 | let offset = addr - config.addr; |
| 493 | |
| 494 | let first_block_index = (offset / config.block_size) as usize; |
| 495 | if !self.blocks_state.lock().unwrap().is_range_state( |
| 496 | first_block_index, |
| 497 | nb_blocks as usize, |
| 498 | !plug, |
| 499 | ) { |
| 500 | return VIRTIO_MEM_RESP_ERROR; |
| 501 | } |
| 502 | |
| 503 | if !plug && let Err(e) = self.discard_memory_range(offset, size) { |
| 504 | error!("failed discarding memory range: {e:?}"); |
| 505 | return VIRTIO_MEM_RESP_ERROR; |
| 506 | } |
| 507 | |
| 508 | self.blocks_state |
| 509 | .lock() |
| 510 | .unwrap() |
| 511 | .set_range(first_block_index, nb_blocks as usize, plug); |
| 512 | |
| 513 | let handlers = self.dma_mapping_handlers.lock().unwrap(); |
| 514 | if plug { |
| 515 | let mut gpa = addr; |
| 516 | for _ in 0..nb_blocks { |
| 517 | for (_, handler) in handlers.iter() { |
| 518 | if let Err(e) = handler.map(gpa, gpa, config.block_size) { |
| 519 | error!( |
| 520 | "failed DMA mapping addr 0x{:x} size 0x{:x}: {}", |
| 521 | gpa, config.block_size, e |
| 522 | ); |
| 523 | return VIRTIO_MEM_RESP_ERROR; |
| 524 | } |
| 525 | } |
| 526 | |
| 527 | gpa += config.block_size; |
| 528 | } |
| 529 | |
| 530 | config.plugged_size += size; |
| 531 | } else { |
| 532 | for (_, handler) in handlers.iter() { |
| 533 | if let Err(e) = handler.unmap(addr, size) { |
| 534 | error!("failed DMA unmapping addr 0x{addr:x} size 0x{size:x}: {e}"); |
| 535 | return VIRTIO_MEM_RESP_ERROR; |
| 536 | } |
| 537 | } |
| 538 |
no test coverage detected