[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 13/17] x86/VPMU: Add privileged PMU mode
>>> On 21.01.14 at 20:08, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> wrote: > @@ -152,33 +162,62 @@ int vpmu_do_interrupt(struct cpu_user_regs *regs) > err = vpmu->arch_vpmu_ops->arch_vpmu_save(v); > vpmu_reset(vpmu, VPMU_CONTEXT_SAVE | VPMU_CONTEXT_LOADED); > > - /* Store appropriate registers in xenpmu_data */ > - if ( is_pv_32bit_domain(current->domain) ) > + if ( !is_hvm_domain(current->domain) ) > { > - /* > - * 32-bit dom0 cannot process Xen's addresses (which are 64 bit) > - * and therefore we treat it the same way as a non-priviledged > - * PV 32-bit domain. > - */ > - struct compat_cpu_user_regs *cmp; > - > - gregs = guest_cpu_user_regs(); > - > - cmp = (struct compat_cpu_user_regs *) > - &v->arch.vpmu.xenpmu_data->pmu.r.regs; > - XLAT_cpu_user_regs(cmp, gregs); > + uint16_t cs = (current->arch.flags & TF_kernel_mode) ? 0 : 0x3; The surrounding if checks !hvm, i.e. both PV and PVH can make it here. But TF_kernel_mode is meaningful for PV only. > + > + /* Store appropriate registers in xenpmu_data */ > + if ( is_pv_32bit_domain(current->domain) ) > + { > + gregs = guest_cpu_user_regs(); > + > + if ( (vpmu_mode & XENPMU_MODE_PRIV) && > + !is_pv_32bit_domain(v->domain) ) > + memcpy(&v->arch.vpmu.xenpmu_data->pmu.r.regs, > + gregs, sizeof(struct cpu_user_regs)); > + else > + { > + /* > + * 32-bit dom0 cannot process Xen's addresses (which are > + * 64 bit) and therefore we treat it the same way as a > + * non-priviledged PV 32-bit domain. > + */ > + > + struct compat_cpu_user_regs *cmp; > + > + cmp = (struct compat_cpu_user_regs *) > + &v->arch.vpmu.xenpmu_data->pmu.r.regs; > + XLAT_cpu_user_regs(cmp, gregs); > + } > + } > + else if ( !is_control_domain(current->domain) && > + !is_idle_vcpu(current) ) > + { > + /* PV guest */ > + gregs = guest_cpu_user_regs(); > + memcpy(&v->arch.vpmu.xenpmu_data->pmu.r.regs, > + gregs, sizeof(struct cpu_user_regs)); > + } > + else > + memcpy(&v->arch.vpmu.xenpmu_data->pmu.r.regs, > + regs, sizeof(struct cpu_user_regs)); > + > + gregs = &v->arch.vpmu.xenpmu_data->pmu.r.regs; > + gregs->cs = cs; And now you store a NUL selector (i.e. just the RPL bits) into the output field? > } > - else if ( !is_control_domain(current->domain) && > - !is_idle_vcpu(current) ) > + else > { > - /* PV guest */ > + /* HVM guest */ > + struct segment_register cs; > + > gregs = guest_cpu_user_regs(); > memcpy(&v->arch.vpmu.xenpmu_data->pmu.r.regs, > gregs, sizeof(struct cpu_user_regs)); > + > + hvm_get_segment_register(current, x86_seg_cs, &cs); > + gregs = &v->arch.vpmu.xenpmu_data->pmu.r.regs; > + gregs->cs = cs.attr.fields.dpl; And here too? If that's intended, a code comment is a must. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |