> -----Original Message-----
> From: Alexandru Isaila [mailto:[email protected]]
> Sent: 28 June 2018 10:26
> To: [email protected]
> Cc: Ian Jackson <[email protected]>; Wei Liu <[email protected]>;
> [email protected]; Andrew Cooper <[email protected]>; Paul
> Durrant <[email protected]>; Alexandru Isaila
> <[email protected]>
> Subject: [PATCH v9 07/11] x86/hvm: Introduce
> viridian_save_vcpu_ctxt_one() func
>
> This is used to save data from a single instance.
>
> Signed-off-by: Alexandru Isaila <[email protected]>
> ---
> xen/arch/x86/hvm/viridian.c | 26 ++++++++++++++++++--------
> 1 file changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c
> index 694eae6..ed164ab 100644
> --- a/xen/arch/x86/hvm/viridian.c
> +++ b/xen/arch/x86/hvm/viridian.c
> @@ -1026,20 +1026,30 @@ static int viridian_load_domain_ctxt(struct
> domain *d, hvm_domain_context_t *h)
> HVM_REGISTER_SAVE_RESTORE(VIRIDIAN_DOMAIN,
> viridian_save_domain_ctxt,
> viridian_load_domain_ctxt, 1, HVMSR_PER_DOM);
>
> -static int viridian_save_vcpu_ctxt(struct domain *d,
> hvm_domain_context_t *h)
> +static int viridian_save_vcpu_ctxt_one(struct vcpu *v,
> hvm_domain_context_t *h)
> {
> - struct vcpu *v;
> + struct hvm_viridian_vcpu_context ctxt;
>
> - if ( !is_viridian_domain(d) )
> + if ( !is_viridian_domain(v->domain) )
> return 0;
>
> + memset(&ctxt, 0, sizeof(ctxt));
> + ctxt.vp_assist_msr = v->arch.hvm_vcpu.viridian.vp_assist.msr.raw;
> + ctxt.vp_assist_pending = v->arch.hvm_vcpu.viridian.vp_assist.pending;
> +
> + if ( hvm_save_entry(VIRIDIAN_VCPU, v->vcpu_id, h, &ctxt) != 0 )
> + return 1;
> + return 0;
Jan also queried the return values from the _save_one functions. I assume you
need to make your 'continue' value reasonably global such that it can still be
used when you move the iteration up in the outer save function. He suggested
passing through the return of hvm_save_entry() but we also need to be sure it
won't clash will the 'continue' value in future so it may now be necessary to
actually define what the possible return values are.
Paul
> +}
> +
> +static int viridian_save_vcpu_ctxt(struct domain *d,
> hvm_domain_context_t *h)
> +{
> + struct vcpu *v;
> +
> for_each_vcpu( d, v ) {
> - struct hvm_viridian_vcpu_context ctxt = {
> - .vp_assist_msr = v->arch.hvm_vcpu.viridian.vp_assist.msr.raw,
> - .vp_assist_pending = v->arch.hvm_vcpu.viridian.vp_assist.pending,
> - };
> + int rc = viridian_save_vcpu_ctxt_one(v, h);
>
> - if ( hvm_save_entry(VIRIDIAN_VCPU, v->vcpu_id, h, &ctxt) != 0 )
> + if ( rc != 0 )
> return 1;
> }
>
> --
> 2.7.4
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel