if ( viridian_feature_mask(v->domain) & HVMPV_apic_assist )
{
v->arch.hvm_vcpu.viridian.apic_assist.va = va;
- v->arch.hvm_vcpu.viridian.apic_assist.vector = -1;
return;
}
if ( !va )
return;
+ if ( vector < 0x10 )
+ return;
+
/*
* If there is already an assist pending then something has gone
* wrong and the VM will most likely hang so force a crash now
* to make the problem clear.
*/
- if ( v->arch.hvm_vcpu.viridian.apic_assist.vector >= 0 )
+ if ( v->arch.hvm_vcpu.viridian.apic_assist.vector )
domain_crash(v->domain);
v->arch.hvm_vcpu.viridian.apic_assist.vector = vector;
int vector;
if ( !va )
- return -1;
+ return 0;
if ( *va & 1u )
- return -1; /* Interrupt not yet processed by the guest. */
+ return 0; /* Interrupt not yet processed by the guest. */
vector = v->arch.hvm_vcpu.viridian.apic_assist.vector;
- v->arch.hvm_vcpu.viridian.apic_assist.vector = -1;
+ v->arch.hvm_vcpu.viridian.apic_assist.vector = 0;
return vector;
}
return;
*va &= ~1u;
- v->arch.hvm_vcpu.viridian.apic_assist.vector = -1;
+ v->arch.hvm_vcpu.viridian.apic_assist.vector = 0;
}
static void update_reference_tsc(struct domain *d, bool_t initialize)
for_each_vcpu( d, v ) {
struct hvm_viridian_vcpu_context ctxt;
- ctxt.apic_assist = v->arch.hvm_vcpu.viridian.apic_assist.msr.raw;
+ ctxt.apic_assist_msr = v->arch.hvm_vcpu.viridian.apic_assist.msr.raw;
+ ctxt.apic_assist_vector = v->arch.hvm_vcpu.viridian.apic_assist.vector;
if ( hvm_save_entry(VIRIDIAN_VCPU, v->vcpu_id, h, &ctxt) != 0 )
return 1;
return -EINVAL;
}
- if ( hvm_load_entry(VIRIDIAN_VCPU, h, &ctxt) != 0 )
+ if ( hvm_load_entry_zeroextend(VIRIDIAN_VCPU, h, &ctxt) != 0 )
return -EINVAL;
- v->arch.hvm_vcpu.viridian.apic_assist.msr.raw = ctxt.apic_assist;
+ v->arch.hvm_vcpu.viridian.apic_assist.msr.raw = ctxt.apic_assist_msr;
if ( v->arch.hvm_vcpu.viridian.apic_assist.msr.fields.enabled )
initialize_apic_assist(v);
+ v->arch.hvm_vcpu.viridian.apic_assist.vector = ctxt.apic_assist_vector;
+
return 0;
}
DECLARE_HVM_SAVE_TYPE(VIRIDIAN_DOMAIN, 15, struct hvm_viridian_domain_context);
struct hvm_viridian_vcpu_context {
- uint64_t apic_assist;
+ uint64_t apic_assist_msr;
+ uint8_t apic_assist_vector;
+ uint8_t _pad[7];
};
DECLARE_HVM_SAVE_TYPE(VIRIDIAN_VCPU, 17, struct hvm_viridian_vcpu_context);