diff options
Diffstat (limited to 'src/plugin/process.rs')
-rw-r--r-- | src/plugin/process.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/plugin/process.rs b/src/plugin/process.rs index 50b4465..2869847 100644 --- a/src/plugin/process.rs +++ b/src/plugin/process.rs @@ -418,6 +418,35 @@ impl Process { vm.set_gsi_routing(&routes[..]) } + fn handle_set_call_hint(&mut self, hints: &MainRequest_SetCallHint) -> SysResult<()> { + let mut regs: Vec<CallHintDetails> = vec![]; + for hint in &hints.hints { + regs.push(CallHintDetails { + match_rax: hint.match_rax, + match_rbx: hint.match_rbx, + match_rcx: hint.match_rcx, + match_rdx: hint.match_rdx, + rax: hint.rax, + rbx: hint.rbx, + rcx: hint.rcx, + rdx: hint.rdx, + send_sregs: hint.send_sregs, + send_debugregs: hint.send_debugregs, + }); + } + match self.shared_vcpu_state.write() { + Ok(mut lock) => { + let space = match hints.space { + AddressSpace::IOPORT => IoSpace::Ioport, + AddressSpace::MMIO => IoSpace::Mmio, + }; + lock.set_hint(space, hints.address, hints.on_write, regs); + Ok(()) + } + Err(_) => Err(SysError::new(EDEADLK)), + } + } + fn handle_pause_vcpus(&self, vcpu_handles: &[JoinHandle<()>], cpu_mask: u64, user_data: u64) { for (cpu_id, (handle, per_cpu_state)) in vcpu_handles.iter().zip(&self.per_vcpu_states).enumerate() @@ -631,6 +660,9 @@ impl Process { } None => Err(SysError::new(ENODATA)), } + } else if request.has_set_call_hint() { + response.mut_set_call_hint(); + self.handle_set_call_hint(request.get_set_call_hint()) } else if request.has_dirty_log() { let dirty_log_response = response.mut_dirty_log(); match self.objects.get(&request.get_dirty_log().id) { |