[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v14 06/11] x86/hvm: Introduce hvm_save_mtrr_msr_one func
>>> On 25.07.18 at 14:14, <aisaila@xxxxxxxxxxxxxxx> wrote: > This is used to save data from a single instance. > > Signed-off-by: Alexandru Isaila <aisaila@xxxxxxxxxxxxxxx> > > --- > Changes since v11: > - hvm_save_mtrr_msr() now returns err from hvm_save_mtrr_msr_one(). > > Note: This patch is based on Roger Pau Monne's series[1] > --- > xen/arch/x86/hvm/mtrr.c | 81 > +++++++++++++++++++++++++++---------------------- > 1 file changed, 44 insertions(+), 37 deletions(-) > > diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c > index 48facbb..47a5c29 100644 > --- a/xen/arch/x86/hvm/mtrr.c > +++ b/xen/arch/x86/hvm/mtrr.c > @@ -718,52 +718,59 @@ int hvm_set_mem_pinned_cacheattr(struct domain *d, > uint64_t gfn_start, > return 0; > } > > -static int hvm_save_mtrr_msr(struct domain *d, hvm_domain_context_t *h) > +static int hvm_save_mtrr_msr_one(struct vcpu *v, hvm_domain_context_t *h) > { > - struct vcpu *v; > + const struct mtrr_state *mtrr_state = &v->arch.hvm_vcpu.mtrr; > + struct hvm_hw_mtrr hw_mtrr = { > + .msr_mtrr_def_type = mtrr_state->def_type | > + MASK_INSR(mtrr_state->fixed_enabled, > + MTRRdefType_FE) | > + MASK_INSR(mtrr_state->enabled, MTRRdefType_E), > + .msr_mtrr_cap = mtrr_state->mtrr_cap, > + }; > + unsigned int i; > > - /* save mtrr&pat */ > - for_each_vcpu(d, v) > + if ( MASK_EXTR(hw_mtrr.msr_mtrr_cap, MTRRcap_VCNT) > > + (ARRAY_SIZE(hw_mtrr.msr_mtrr_var) / 2) ) > { > - const struct mtrr_state *mtrr_state = &v->arch.hvm_vcpu.mtrr; > - struct hvm_hw_mtrr hw_mtrr = { > - .msr_mtrr_def_type = mtrr_state->def_type | > - MASK_INSR(mtrr_state->fixed_enabled, > - MTRRdefType_FE) | > - MASK_INSR(mtrr_state->enabled, > MTRRdefType_E), > - .msr_mtrr_cap = mtrr_state->mtrr_cap, > - }; > - unsigned int i; > + dprintk(XENLOG_G_ERR, > + "HVM save: %pv: too many (%lu) variable range MTRRs\n", > + v, MASK_EXTR(hw_mtrr.msr_mtrr_cap, MTRRcap_VCNT)); > + return -EINVAL; > + } > > - if ( MASK_EXTR(hw_mtrr.msr_mtrr_cap, MTRRcap_VCNT) > > - (ARRAY_SIZE(hw_mtrr.msr_mtrr_var) / 2) ) > - { > - dprintk(XENLOG_G_ERR, > - "HVM save: %pv: too many (%lu) variable range MTRRs\n", > - v, MASK_EXTR(hw_mtrr.msr_mtrr_cap, MTRRcap_VCNT)); > - return -EINVAL; > - } > + hvm_get_guest_pat(v, &hw_mtrr.msr_pat_cr); > > - hvm_get_guest_pat(v, &hw_mtrr.msr_pat_cr); > + for ( i = 0; i < MASK_EXTR(hw_mtrr.msr_mtrr_cap, MTRRcap_VCNT); i++ ) > + { > + /* save physbase */ > + hw_mtrr.msr_mtrr_var[i*2] = > + ((uint64_t*)mtrr_state->var_ranges)[i*2]; > + /* save physmask */ > + hw_mtrr.msr_mtrr_var[i*2+1] = > + ((uint64_t*)mtrr_state->var_ranges)[i*2+1]; > + } As you move/re-indent code, please fix obvious style violations (here: missing blanks around binary operators). It also would be really nice if you got rid of the ugly and risky casts, and used the actual structure fields instead. > - for ( i = 0; i < MASK_EXTR(hw_mtrr.msr_mtrr_cap, MTRRcap_VCNT); i++ ) > - { > - /* save physbase */ > - hw_mtrr.msr_mtrr_var[i*2] = > - ((uint64_t*)mtrr_state->var_ranges)[i*2]; > - /* save physmask */ > - hw_mtrr.msr_mtrr_var[i*2+1] = > - ((uint64_t*)mtrr_state->var_ranges)[i*2+1]; > - } > + for ( i = 0; i < NUM_FIXED_MSR; i++ ) > + hw_mtrr.msr_mtrr_fixed[i] = > + ((uint64_t*)mtrr_state->fixed_ranges)[i]; Whereas here I think you would best simply use memcpy(), again to get rid of the cast. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |