vm_event: clear up return value of vm_event_monitor_traps

The return value has not been clearly defined, with the function
never returning 0 which seemingly indicated a condition where the
guest should crash.

In this patch we define -rc as error condition where a subscriber is
present but an error prevented the notification from being sent;
0 where there is no subscriber or the notification was sent and the vCPU
is not paused (i.e. safe to continue execution as normal); and 1 where the
notification was sent with the vCPU paused and we are waiting for a
response.

Signed-off-by: Tamas K Lengyel <tamas@tklengyel.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Razvan Cojocaru <rcojocaru@bitdefender.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
Tamas K Lengyel authored and Jan Beulich committed 2016-06-28 11:36:03 +02:00
1 parent 2b63aa1d50
commit 9b15b2e367
3 files changed
+8 -7

No files matched your search

+2 -2
View File
@@ -48,8 +48,8 @@ bool_t hvm_monitor_cr(unsigned int index, unsigned long value, unsigned long old
.u.write_ctrlreg.old_value = old
};
vm_event_monitor_traps(curr, sync, &req);
return 1;
if ( vm_event_monitor_traps(curr, sync, &req) >= 0 )
return 1;
}
return 0;
+3 -3
View File
@@ -3391,11 +3391,11 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
break;
}
else {
int handled =
int rc =
hvm_monitor_breakpoint(regs->eip,
HVM_MONITOR_SOFTWARE_BREAKPOINT);
if ( handled < 0 )
if ( !rc )
{
struct hvm_trap trap = {
.vector = TRAP_int3,
@@ -3409,7 +3409,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
hvm_inject_trap(&trap);
break;
}
else if ( handled )
if ( rc > 0 )
break;
}
+3 -2
View File
@@ -806,7 +806,7 @@ int vm_event_monitor_traps(struct vcpu *v, uint8_t sync,
* If there was no ring to handle the event, then
* simply continue executing normally.
*/
return 1;
return 0;
default:
return rc;
};
@@ -815,6 +815,7 @@ int vm_event_monitor_traps(struct vcpu *v, uint8_t sync,
{
req->flags |= VM_EVENT_FLAG_VCPU_PAUSED;
vm_event_vcpu_pause(v);
rc = 1;
}
if ( altp2m_active(d) )
@@ -826,7 +827,7 @@ int vm_event_monitor_traps(struct vcpu *v, uint8_t sync,
vm_event_fill_regs(req);
vm_event_put_request(d, &d->vm_event->monitor, req);
return 1;
return rc;
}
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.