Re: [Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
On Thu, Oct 12, 2017 at 12:10:25PM +0300, Alexandru Isaila wrote: > This patch adds the old value param and the onchangeonly option > to the VM_EVENT_REASON_MOV_TO_MSR event. > > The param was added to the vm_event_mov_to_msr struct and to the > hvm_monitor_msr function. Finally I've changed the bool_t param > to a bool for the hvm_msr_write_intercept function. > > Signed-off-by: Alexandru Isaila> --- > tools/libxc/include/xenctrl.h | 2 +- > tools/libxc/xc_monitor.c | 3 ++- Acked-by: Wei Liu ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
On Fri, Oct 13, 2017 at 6:17 AM, Jan Beulichwrote: On 13.10.17 at 12:36, wrote: >> On 13.10.2017 13:29, Jan Beulich wrote: +__set_bit(index + sizeof(struct monitor_msr_bitmap), bitmap); >>> >>> I think you miss "* 8" here - a bit position plus sizeof() doesn't >>> produce any useful value. >>> >>> But what's worse - having read till the end of the patch I don't >>> see you change any allocation, yet you clearly need to double >>> the space now that you need two bits per MSR. >> >> We did this: >> >> diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c >> index e59f1f5..a3046c6 100644 >> --- a/xen/arch/x86/monitor.c >> +++ b/xen/arch/x86/monitor.c >> @@ -25,7 +25,7 @@ >> int arch_monitor_init_domain(struct domain *d) >> { >> if ( !d->arch.monitor.msr_bitmap ) >> -d->arch.monitor.msr_bitmap = xzalloc(struct monitor_msr_bitmap); >> +d->arch.monitor.msr_bitmap = xzalloc_array(struct >> monitor_msr_bitmap, 2); >> >> if ( !d->arch.monitor.msr_bitmap ) >> return -ENOMEM; >> @@ -67,7 +67,7 @@ static unsigned long *monitor_bitmap_for_msr(const struct >> domain *d, u32 *msr) >> } >> } >> >> I.e., we are now allocating an array of size 2 of struct >> monitor_msr_bitmaps with xzalloc_array(). > > Oh, I'm not sure how I could overlook this considering that I > specifically looked up the allocation point and searched through > the patch for a respective change. I'm sorry for the noise in > this regard. I do think though that the chosen model is a little > odd and fragile, but that's something you and Tamas as the > maintainers of the code have to judge about. > It looks fine to me. Thanks, Tamas ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
>>> On 13.10.17 at 12:36,wrote: > On 13.10.2017 13:29, Jan Beulich wrote: >>> +__set_bit(index + sizeof(struct monitor_msr_bitmap), bitmap); >> >> I think you miss "* 8" here - a bit position plus sizeof() doesn't >> produce any useful value. >> >> But what's worse - having read till the end of the patch I don't >> see you change any allocation, yet you clearly need to double >> the space now that you need two bits per MSR. > > We did this: > > diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c > index e59f1f5..a3046c6 100644 > --- a/xen/arch/x86/monitor.c > +++ b/xen/arch/x86/monitor.c > @@ -25,7 +25,7 @@ > int arch_monitor_init_domain(struct domain *d) > { > if ( !d->arch.monitor.msr_bitmap ) > -d->arch.monitor.msr_bitmap = xzalloc(struct monitor_msr_bitmap); > +d->arch.monitor.msr_bitmap = xzalloc_array(struct > monitor_msr_bitmap, 2); > > if ( !d->arch.monitor.msr_bitmap ) > return -ENOMEM; > @@ -67,7 +67,7 @@ static unsigned long *monitor_bitmap_for_msr(const struct > domain *d, u32 *msr) > } > } > > I.e., we are now allocating an array of size 2 of struct > monitor_msr_bitmaps with xzalloc_array(). Oh, I'm not sure how I could overlook this considering that I specifically looked up the allocation point and searched through the patch for a respective change. I'm sorry for the noise in this regard. I do think though that the chosen model is a little odd and fragile, but that's something you and Tamas as the maintainers of the code have to judge about. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
On 13.10.2017 13:29, Jan Beulich wrote: +__set_bit(index + sizeof(struct monitor_msr_bitmap), bitmap); I think you miss "* 8" here - a bit position plus sizeof() doesn't produce any useful value. But what's worse - having read till the end of the patch I don't see you change any allocation, yet you clearly need to double the space now that you need two bits per MSR. We did this: diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c index e59f1f5..a3046c6 100644 --- a/xen/arch/x86/monitor.c +++ b/xen/arch/x86/monitor.c @@ -25,7 +25,7 @@ int arch_monitor_init_domain(struct domain *d) { if ( !d->arch.monitor.msr_bitmap ) -d->arch.monitor.msr_bitmap = xzalloc(struct monitor_msr_bitmap); +d->arch.monitor.msr_bitmap = xzalloc_array(struct monitor_msr_bitmap, 2); if ( !d->arch.monitor.msr_bitmap ) return -ENOMEM; @@ -67,7 +67,7 @@ static unsigned long *monitor_bitmap_for_msr(const struct domain *d, u32 *msr) } } I.e., we are now allocating an array of size 2 of struct monitor_msr_bitmaps with xzalloc_array(). Thanks, Razvan ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
>>> On 12.10.17 at 11:10,wrote: > --- a/xen/arch/x86/hvm/monitor.c > +++ b/xen/arch/x86/hvm/monitor.c > @@ -74,16 +74,19 @@ bool hvm_monitor_emul_unimplemented(void) > monitor_traps(curr, true, ) == 1; > } > > -void hvm_monitor_msr(unsigned int msr, uint64_t value) > +void hvm_monitor_msr(unsigned int msr, uint64_t new_value, uint64_t > old_value) > { > struct vcpu *curr = current; > > -if ( monitored_msr(curr->domain, msr) ) > +if ( monitored_msr(curr->domain, msr) && > + ( !monitored_msr_onchangeonly(curr->domain, msr) || > + new_value != old_value ) ) Stray blanks inside the inner parentheses. > @@ -84,6 +84,11 @@ static int monitor_enable_msr(struct domain *d, u32 msr) > > hvm_enable_msr_interception(d, msr); > > +if( onchangeonly ) Style. > +__set_bit(index + sizeof(struct monitor_msr_bitmap), bitmap); I think you miss "* 8" here - a bit position plus sizeof() doesn't produce any useful value. But what's worse - having read till the end of the patch I don't see you change any allocation, yet you clearly need to double the space now that you need two bits per MSR. > --- a/xen/include/asm-x86/monitor.h > +++ b/xen/include/asm-x86/monitor.h > @@ -105,4 +105,6 @@ void arch_monitor_cleanup_domain(struct domain *d); > > bool monitored_msr(const struct domain *d, u32 msr); > > +bool monitored_msr_onchangeonly(const struct domain *d, u32 msr); > + Them belonging together, please have them together (without an intervening blank line). Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
On Thu, Oct 12, 2017 at 3:10 AM, Alexandru Isailawrote: > This patch adds the old value param and the onchangeonly option > to the VM_EVENT_REASON_MOV_TO_MSR event. > > The param was added to the vm_event_mov_to_msr struct and to the > hvm_monitor_msr function. Finally I've changed the bool_t param > to a bool for the hvm_msr_write_intercept function. > > Signed-off-by: Alexandru Isaila Acked-by: Tamas K Lengyel ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
[Xen-devel] [PATCH v1] x86/hvm: Add MSR old value
This patch adds the old value param and the onchangeonly option to the VM_EVENT_REASON_MOV_TO_MSR event. The param was added to the vm_event_mov_to_msr struct and to the hvm_monitor_msr function. Finally I've changed the bool_t param to a bool for the hvm_msr_write_intercept function. Signed-off-by: Alexandru Isaila--- tools/libxc/include/xenctrl.h | 2 +- tools/libxc/xc_monitor.c | 3 ++- xen/arch/x86/hvm/hvm.c| 10 -- xen/arch/x86/hvm/monitor.c| 9 ++--- xen/arch/x86/monitor.c| 26 +++--- xen/include/asm-x86/hvm/monitor.h | 2 +- xen/include/asm-x86/hvm/support.h | 2 +- xen/include/asm-x86/monitor.h | 2 ++ xen/include/public/domctl.h | 2 ++ xen/include/public/vm_event.h | 5 +++-- 10 files changed, 49 insertions(+), 14 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 3bcab3c..b99d6eb 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2048,7 +2048,7 @@ int xc_monitor_write_ctrlreg(xc_interface *xch, domid_t domain_id, * non-architectural indices. */ int xc_monitor_mov_to_msr(xc_interface *xch, domid_t domain_id, uint32_t msr, - bool enable); + bool enable, bool onchangeonly); int xc_monitor_singlestep(xc_interface *xch, domid_t domain_id, bool enable); int xc_monitor_software_breakpoint(xc_interface *xch, domid_t domain_id, bool enable); diff --git a/tools/libxc/xc_monitor.c b/tools/libxc/xc_monitor.c index 6046680..09d04be 100644 --- a/tools/libxc/xc_monitor.c +++ b/tools/libxc/xc_monitor.c @@ -90,7 +90,7 @@ int xc_monitor_write_ctrlreg(xc_interface *xch, domid_t domain_id, } int xc_monitor_mov_to_msr(xc_interface *xch, domid_t domain_id, uint32_t msr, - bool enable) + bool enable, bool onchangeonly) { DECLARE_DOMCTL; @@ -100,6 +100,7 @@ int xc_monitor_mov_to_msr(xc_interface *xch, domid_t domain_id, uint32_t msr, : XEN_DOMCTL_MONITOR_OP_DISABLE; domctl.u.monitor_op.event = XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR; domctl.u.monitor_op.u.mov_to_msr.msr = msr; +domctl.u.monitor_op.u.mov_to_msr.onchangeonly = onchangeonly; return do_domctl(xch, ); } diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 205b4cb..0238787 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3489,7 +3489,7 @@ int hvm_msr_read_intercept(unsigned int msr, uint64_t *msr_content) } int hvm_msr_write_intercept(unsigned int msr, uint64_t msr_content, -bool_t may_defer) +bool may_defer) { struct vcpu *v = current; struct domain *d = v->domain; @@ -3500,6 +3500,12 @@ int hvm_msr_write_intercept(unsigned int msr, uint64_t msr_content, if ( may_defer && unlikely(monitored_msr(v->domain, msr)) ) { +uint64_t msr_old_content; + +ret = hvm_msr_read_intercept(msr, _old_content); +if ( ret != X86EMUL_OKAY ) +return ret; + ASSERT(v->arch.vm_event); /* The actual write will occur in hvm_do_resume() (if permitted). */ @@ -3507,7 +3513,7 @@ int hvm_msr_write_intercept(unsigned int msr, uint64_t msr_content, v->arch.vm_event->write_data.msr = msr; v->arch.vm_event->write_data.value = msr_content; -hvm_monitor_msr(msr, msr_content); +hvm_monitor_msr(msr, msr_content, msr_old_content); return X86EMUL_OKAY; } diff --git a/xen/arch/x86/hvm/monitor.c b/xen/arch/x86/hvm/monitor.c index 4ce778c..74f83b4 100644 --- a/xen/arch/x86/hvm/monitor.c +++ b/xen/arch/x86/hvm/monitor.c @@ -74,16 +74,19 @@ bool hvm_monitor_emul_unimplemented(void) monitor_traps(curr, true, ) == 1; } -void hvm_monitor_msr(unsigned int msr, uint64_t value) +void hvm_monitor_msr(unsigned int msr, uint64_t new_value, uint64_t old_value) { struct vcpu *curr = current; -if ( monitored_msr(curr->domain, msr) ) +if ( monitored_msr(curr->domain, msr) && + ( !monitored_msr_onchangeonly(curr->domain, msr) || + new_value != old_value ) ) { vm_event_request_t req = { .reason = VM_EVENT_REASON_MOV_TO_MSR, .u.mov_to_msr.msr = msr, -.u.mov_to_msr.value = value, +.u.mov_to_msr.new_value = new_value, +.u.mov_to_msr.old_value = old_value }; monitor_traps(curr, 1, ); diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c index e59f1f5..a3046c6 100644 --- a/xen/arch/x86/monitor.c +++ b/xen/arch/x86/monitor.c @@ -25,7 +25,7 @@ int arch_monitor_init_domain(struct domain *d) { if ( !d->arch.monitor.msr_bitmap ) -d->arch.monitor.msr_bitmap = xzalloc(struct monitor_msr_bitmap); +d->arch.monitor.msr_bitmap =