Print this page
13275 bhyve needs richer INIT/SIPI support
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Approved by: Gordon Ross <gordon.w.ross@gmail.com>
*** 1915,1926 ****
/*
* Start vcpu with specified RIP.
*/
static int
! svm_vmrun(void *arg, int vcpu, uint64_t rip, pmap_t pmap,
! struct vm_eventinfo *evinfo)
{
struct svm_regctx *gctx;
struct svm_softc *svm_sc;
struct svm_vcpu *vcpustate;
struct vmcb_state *state;
--- 1915,1925 ----
/*
* Start vcpu with specified RIP.
*/
static int
! svm_vmrun(void *arg, int vcpu, uint64_t rip, pmap_t pmap)
{
struct svm_regctx *gctx;
struct svm_softc *svm_sc;
struct svm_vcpu *vcpustate;
struct vmcb_state *state;
*** 2008,2048 ****
* safe (and prudent) to perform with interrupts disabled.
*/
inject_state = svm_inject_vlapic(svm_sc, vcpu, vlapic,
inject_state);
! if (vcpu_suspended(evinfo)) {
enable_gintr();
- vm_exit_suspended(vm, vcpu, state->rip);
break;
}
! if (vcpu_runblocked(evinfo)) {
enable_gintr();
! vm_exit_runblock(vm, vcpu, state->rip);
break;
}
- if (vcpu_reqidle(evinfo)) {
- enable_gintr();
- vm_exit_reqidle(vm, vcpu, state->rip);
- break;
- }
-
- /* We are asked to give the cpu by scheduler. */
- if (vcpu_should_yield(vm, vcpu)) {
- enable_gintr();
- vm_exit_astpending(vm, vcpu, state->rip);
- break;
- }
-
- if (vcpu_debugged(vm, vcpu)) {
- enable_gintr();
- vm_exit_debug(vm, vcpu, state->rip);
- break;
- }
-
/*
* If subsequent activity queued events which require injection
* handling, take another lap to handle them.
*/
if (svm_inject_recheck(svm_sc, vcpu, inject_state)) {
--- 2007,2031 ----
* safe (and prudent) to perform with interrupts disabled.
*/
inject_state = svm_inject_vlapic(svm_sc, vcpu, vlapic,
inject_state);
! /*
! * Check for vCPU bail-out conditions. This must be done after
! * svm_inject_events() to detect a triple-fault condition.
! */
! if (vcpu_entry_bailout_checks(vm, vcpu, state->rip)) {
enable_gintr();
break;
}
! if (vcpu_run_state_pending(vm, vcpu)) {
enable_gintr();
! vm_exit_run_state(vm, vcpu, state->rip);
break;
}
/*
* If subsequent activity queued events which require injection
* handling, take another lap to handle them.
*/
if (svm_inject_recheck(svm_sc, vcpu, inject_state)) {
*** 2301,2311 ****
return (0);
}
static int
! svm_setdesc(void *arg, int vcpu, int reg, struct seg_desc *desc)
{
struct vmcb *vmcb;
struct svm_softc *sc;
struct vmcb_segment *seg;
--- 2284,2294 ----
return (0);
}
static int
! svm_setdesc(void *arg, int vcpu, int reg, const struct seg_desc *desc)
{
struct vmcb *vmcb;
struct svm_softc *sc;
struct vmcb_segment *seg;