[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC v2 2/9] xen/arm: Implement save and restore for gic, vtimer, and ptimer
On Wed, 3 Jul 2013, Jaeyong Yoo wrote: > +static int vtimer_save(struct domain *d, hvm_domain_context_t *h) > +{ > + struct hvm_hw_vtimer ctxt; > + struct vcpu *v; > + > + ctxt.vtb_offset = d->arch.virt_timer_base.offset; > + > + /* Save the state of vtimer */ > + for_each_vcpu( d, v ) > + { > + ctxt.cval = v->arch.virt_timer.cval; > + ctxt.ctl = v->arch.virt_timer.ctl; > + if ( hvm_save_entry(VTIMER, v->vcpu_id, h, &ctxt) != 0 ) > + return 1; > + } > + > + return 0; > +} > + > +static int vtimer_load(struct domain *d, hvm_domain_context_t *h) > +{ > + int vcpuid; > + struct hvm_hw_vtimer ctxt; > + struct vcpu *v; > + /* Which vcpu is this? */ > + vcpuid = hvm_load_instance(h); > + if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) > + { > + dprintk(XENLOG_G_ERR, "HVM restore: dom%u has no vcpu%u\n", > + d->domain_id, vcpuid); > + return -EINVAL; > + } > + > + if ( hvm_load_entry(VTIMER, h, &ctxt) != 0 ) > + return -EINVAL; > + > + v->arch.virt_timer.cval = ctxt.cval; > + v->arch.virt_timer.ctl = ctxt.ctl; > + v->arch.virt_timer.v = v; > + > + d->arch.virt_timer_base.offset = ctxt.vtb_offset; > + > + return 0; > +} > + > +HVM_REGISTER_SAVE_RESTORE(VTIMER, vtimer_save, vtimer_load, 1, > HVMSR_PER_VCPU); > + > +static int ptimer_save(struct domain *d, hvm_domain_context_t *h) > +{ > + struct hvm_hw_ptimer ctxt; > + struct vcpu *v; > + > + ctxt.ptb_offset = d->arch.phys_timer_base.offset; > + > + /* Save the state of ptimer */ > + for_each_vcpu( d, v ) > + { > + ctxt.p_cval = v->arch.phys_timer.cval; > + ctxt.p_ctl = v->arch.phys_timer.ctl; > + > + if ( hvm_save_entry(PTIMER, v->vcpu_id, h, &ctxt) != 0 ) > + return 1; > + } > + > + return 0; > +} > + > +static int ptimer_load(struct domain *d, hvm_domain_context_t *h) > +{ > + int vcpuid; > + struct hvm_hw_ptimer ctxt; > + struct vcpu *v; > + /* Which vcpu is this? */ > + vcpuid = hvm_load_instance(h); > + if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) > + { > + dprintk(XENLOG_G_ERR, "HVM restore: dom%u has no vcpu%u\n", > + d->domain_id, vcpuid); > + return -EINVAL; > + } > + > + if ( hvm_load_entry(PTIMER, h, &ctxt) != 0 ) > + return -EINVAL; > + > + v->arch.phys_timer.cval = ctxt.p_cval; > + v->arch.phys_timer.ctl = ctxt.p_ctl; > + v->arch.phys_timer.v = v; > + > + d->arch.phys_timer_base.offset = ctxt.ptb_offset; > + > + return 0; > +} Given that the ptimer and vtimer save and load functions as well as the save records are identical, I think it might be better to declare a single timer record with a timer type and reuse the same load and save functions for both ptimer and vtimer. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |