@@ -74,6 +74,12 @@
int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val);
int viridian_synic_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val);
+int viridian_synic_vcpu_init(const struct vcpu *v);
+int viridian_synic_domain_init(const struct domain *d);
+
+void viridian_synic_vcpu_deinit(const struct vcpu *v);
+void viridian_synic_domain_deinit(const struct domain *d);
+
void viridian_synic_save_vcpu_ctxt(const struct vcpu *v,
struct hvm_viridian_vcpu_context *ctxt);
void viridian_synic_load_vcpu_ctxt(
@@ -82,6 +88,12 @@ void viridian_synic_load_vcpu_ctxt(
int viridian_time_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val);
int viridian_time_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val);
+int viridian_time_vcpu_init(const struct vcpu *v);
+int viridian_time_domain_init(const struct domain *d);
+
+void viridian_time_vcpu_deinit(const struct vcpu *v);
+void viridian_time_domain_deinit(const struct domain *d);
+
void viridian_time_save_domain_ctxt(
const struct domain *d, struct hvm_viridian_domain_context *ctxt);
void viridian_time_load_domain_ctxt(
@@ -146,6 +146,25 @@ int viridian_synic_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val)
return X86EMUL_OKAY;
}
+int viridian_synic_vcpu_init(const struct vcpu *v)
+{
+ return 0;
+}
+
+int viridian_synic_domain_init(const struct domain *d)
+{
+ return 0;
+}
+
+void viridian_synic_vcpu_deinit(const struct vcpu *v)
+{
+ viridian_unmap_guest_page(&v->arch.hvm.viridian->vp_assist);
+}
+
+void viridian_synic_domain_deinit(const struct domain *d)
+{
+}
+
void viridian_synic_save_vcpu_ctxt(const struct vcpu *v,
struct hvm_viridian_vcpu_context *ctxt)
{
@@ -215,6 +215,24 @@ int viridian_time_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val)
return X86EMUL_OKAY;
}
+int viridian_time_vcpu_init(const struct vcpu *v)
+{
+ return 0;
+}
+
+int viridian_time_domain_init(const struct domain *d)
+{
+ return 0;
+}
+
+void viridian_time_vcpu_deinit(const struct vcpu *v)
+{
+}
+
+void viridian_time_domain_deinit(const struct domain *d)
+{
+}
+
void viridian_time_save_domain_ctxt(
const struct domain *d, struct hvm_viridian_domain_context *ctxt)
{
@@ -418,22 +418,52 @@ int guest_rdmsr_viridian(const struct vcpu *v, uint32_t idx, uint64_t *val)
int viridian_vcpu_init(struct vcpu *v)
{
+ int rc;
+
ASSERT(!v->arch.hvm.viridian);
v->arch.hvm.viridian = xzalloc(struct viridian_vcpu);
if ( !v->arch.hvm.viridian )
return -ENOMEM;
+ rc = viridian_synic_vcpu_init(v);
+ if ( rc )
+ goto fail;
+
+ rc = viridian_time_vcpu_init(v);
+ if ( rc )
+ goto fail;
+
return 0;
+
+ fail:
+ viridian_vcpu_deinit(v);
+
+ return rc;
}
int viridian_domain_init(struct domain *d)
{
+ int rc;
+
ASSERT(!d->arch.hvm.viridian);
d->arch.hvm.viridian = xzalloc(struct viridian_domain);
if ( !d->arch.hvm.viridian )
return -ENOMEM;
+ rc = viridian_synic_domain_init(d);
+ if ( rc )
+ goto fail;
+
+ rc = viridian_time_domain_init(d);
+ if ( rc )
+ goto fail;
+
return 0;
+
+ fail:
+ viridian_domain_deinit(d);
+
+ return rc;
}
void viridian_vcpu_deinit(struct vcpu *v)
@@ -441,8 +471,8 @@ void viridian_vcpu_deinit(struct vcpu *v)
if ( !v->arch.hvm.viridian )
return;
- if ( is_viridian_vcpu(v) )
- viridian_synic_wrmsr(v, HV_X64_MSR_VP_ASSIST_PAGE, 0);
+ viridian_time_vcpu_deinit(v);
+ viridian_synic_vcpu_deinit(v);
XFREE(v->arch.hvm.viridian);
}
@@ -457,6 +487,9 @@ void viridian_domain_deinit(struct domain *d)
if ( !d->arch.hvm.viridian )
return;
+ viridian_time_domain_deinit(d);
+ viridian_synic_domain_deinit(d);
+
XFREE(d->arch.hvm.viridian);
}