return ioctl(vm_fd, MSHV_IOEVENTFD, &args);
}
-static int unregister_ioevent(int vm_fd, int event_fd, uint64_t mmio_addr)
+static int unregister_ioevent(int vm_fd, int event_fd, uint64_t mmio_addr,
+ uint64_t data, uint32_t len, bool data_match)
{
uint32_t flags = 0;
Datamatch dm = {0};
flags |= BIT(MSHV_IOEVENTFD_BIT_DEASSIGN);
- dm.tag = DATAMATCH_NONE;
+ if (!data_match) {
+ dm.tag = DATAMATCH_NONE;
+ } else if (len == sizeof(uint64_t)) {
+ dm.tag = DATAMATCH_U64;
+ dm.value.u64 = data;
+ } else {
+ dm.tag = DATAMATCH_U32;
+ dm.value.u32 = data;
+ }
return ioeventfd(vm_fd, event_fd, mmio_addr, dm, flags);
}
int fd = event_notifier_get_fd(e);
int ret;
uint64_t addr = section->offset_within_address_space;
+ uint64_t len = int128_get64(section->size);
trace_mshv_mem_ioeventfd_del(section->offset_within_address_space,
int128_get64(section->size), data);
- ret = unregister_ioevent(mshv_state->vm, fd, addr);
+ ret = unregister_ioevent(mshv_state->vm, fd, addr, data, len, match_data);
if (ret < 0) {
error_report("Failed to unregister ioeventfd: %s (%d)", strerror(-ret),
-ret);