[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/HVM: improve a few state load checks
Using plain int for instance numbers looks quite dangerous without being aware that hvm_load_instance() returns an unsigned quantity. Make this more explicit. Also replace uint16_t uses by unsigned int. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -976,14 +976,13 @@ unsigned long hvm_cr4_guest_valid_bits(c static int hvm_load_cpu_ctxt(struct domain *d, hvm_domain_context_t *h) { - int vcpuid; + unsigned int vcpuid = hvm_load_instance(h); struct vcpu *v; struct hvm_hw_cpu ctxt; struct segment_register seg; const char *errstr; /* 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", --- a/xen/arch/x86/hvm/mtrr.c +++ b/xen/arch/x86/hvm/mtrr.c @@ -768,7 +768,7 @@ static int hvm_save_mtrr_msr(struct doma static int hvm_load_mtrr_msr(struct domain *d, hvm_domain_context_t *h) { - int vcpuid, i; + unsigned int vcpuid, i; struct vcpu *v; struct mtrr_state *mtrr_state; struct hvm_hw_mtrr hw_mtrr; --- a/xen/arch/x86/hvm/viridian.c +++ b/xen/arch/x86/hvm/viridian.c @@ -1048,11 +1048,10 @@ static int viridian_save_vcpu_ctxt(struc static int viridian_load_vcpu_ctxt(struct domain *d, hvm_domain_context_t *h) { - int vcpuid; + unsigned int vcpuid = hvm_load_instance(h); struct vcpu *v; struct hvm_viridian_vcpu_context ctxt; - vcpuid = hvm_load_instance(h); if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) { dprintk(XENLOG_G_ERR, "HVM restore: dom%d has no vcpu%u\n", --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -1507,7 +1507,7 @@ static void lapic_load_fixup(struct vlap static int lapic_load_hidden(struct domain *d, hvm_domain_context_t *h) { - uint16_t vcpuid; + unsigned int vcpuid = hvm_load_instance(h); struct vcpu *v; struct vlapic *s; @@ -1515,7 +1515,6 @@ static int lapic_load_hidden(struct doma return -ENODEV; /* Which vlapic to load? */ - vcpuid = hvm_load_instance(h); if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) { dprintk(XENLOG_G_ERR, "HVM restore: dom%d has no apic%u\n", @@ -1542,7 +1541,7 @@ static int lapic_load_hidden(struct doma static int lapic_load_regs(struct domain *d, hvm_domain_context_t *h) { - uint16_t vcpuid; + unsigned int vcpuid = hvm_load_instance(h); struct vcpu *v; struct vlapic *s; @@ -1550,7 +1549,6 @@ static int lapic_load_regs(struct domain return -ENODEV; /* Which vlapic to load? */ - vcpuid = hvm_load_instance(h); if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) { dprintk(XENLOG_G_ERR, "HVM restore: dom%d has no apic%u\n", --- a/xen/arch/x86/hvm/vpic.c +++ b/xen/arch/x86/hvm/vpic.c @@ -393,13 +393,12 @@ static int vpic_save(struct domain *d, h static int vpic_load(struct domain *d, hvm_domain_context_t *h) { struct hvm_hw_vpic *s; - uint16_t inst; + unsigned int inst = hvm_load_instance(h); if ( !has_vpic(d) ) return -ENODEV; /* Which PIC is this? */ - inst = hvm_load_instance(h); if ( inst > 1 ) return -EINVAL; s = &d->arch.hvm_domain.vpic[inst]; --- a/xen/include/asm-x86/hvm/save.h +++ b/xen/include/asm-x86/hvm/save.h @@ -84,10 +84,10 @@ void _hvm_read_entry(struct hvm_domain_c _hvm_load_entry(_x, _h, _dst, 0) /* Unmarshalling: what is the instance ID of the next entry? */ -static inline uint16_t hvm_load_instance(struct hvm_domain_context *h) +static inline unsigned int hvm_load_instance(const struct hvm_domain_context *h) { - struct hvm_save_descriptor *d - = (struct hvm_save_descriptor *)&h->data[h->cur]; + const struct hvm_save_descriptor *d = (const void *)&h->data[h->cur]; + return d->instance; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |