[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
> -----Original Message----- > From: Stefano Stabellini [mailto:stefano.stabellini@xxxxxxxxxxxxx] > Sent: Wednesday, July 03, 2013 8:30 PM > To: Jaeyong Yoo > Cc: xen-devel@xxxxxxxxxxxxx > Subject: 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. Got it. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |