[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V7] vm_event: Allow subscribing to write events for specific MSR-s
On 05/04/2016 05:45 PM, Jan Beulich wrote: >>>> On 29.04.16 at 08:03, <rcojocaru@xxxxxxxxxxxxxxx> wrote: >> --- a/xen/arch/x86/monitor.c >> +++ b/xen/arch/x86/monitor.c >> @@ -22,6 +22,104 @@ >> #include <asm/monitor.h> >> #include <public/vm_event.h> >> >> +int arch_monitor_init_domain(struct domain *d) >> +{ >> + if ( !d->arch.monitor_msr_bitmap ) >> + d->arch.monitor_msr_bitmap = xzalloc(struct monitor_msr_bitmap); >> + >> + if ( !d->arch.monitor_msr_bitmap ) >> + return -ENOMEM; >> + >> + memset(&d->arch.monitor, 0, sizeof(d->arch.monitor)); >> + memset(&d->monitor, 0, sizeof(d->monitor)); >> + >> + return 0; >> +} >> + >> +void arch_monitor_cleanup_domain(struct domain *d) >> +{ >> + xfree(d->arch.monitor_msr_bitmap); >> + d->arch.monitor_msr_bitmap = NULL; >> +} > > Considering that struct domain starts out zeroed, it would seem > slightly more efficient to move the memset()-s into the cleanup > function. After all that's how it has been before you moved the > code here. No problem. >> +static void *monitor_bitmap_for_msr(struct domain *d, u32 *msr) >> +{ >> + ASSERT(d->arch.monitor_msr_bitmap && msr); >> + >> + switch ( *msr ) >> + { >> + case 0 ... 0x1fff: >> + BUILD_BUG_ON(ARRAY_SIZE(d->arch.monitor_msr_bitmap->low) * 8 < >> 0x1fff); >> + return &d->arch.monitor_msr_bitmap->low; >> + >> + case 0x40000000 ... 0x40001fff: >> + BUILD_BUG_ON( >> + ARRAY_SIZE(d->arch.monitor_msr_bitmap->hypervisor) * 8 < >> 0x1fff); >> + *msr &= 0x1fff; >> + return &d->arch.monitor_msr_bitmap->hypervisor; >> + >> + case 0xc0000000 ... 0xc0001fff: >> + BUILD_BUG_ON(ARRAY_SIZE(d->arch.monitor_msr_bitmap->high) * 8 < >> 0x1fff); > > I really recommend using sizeof() instead of ARRAY_SIZE() in all of > these, so the code isn't dependent on the base type of those arrays > (which really ought to change to proper bitmaps anyway, due to > the __set_bit() and __clear_bit() the callers of this function do). Also > the comparison with 0x1fff is (in a benign way) off by one - I think > you really mean either <= or 0x2000. I'll change it to 0x2000, and switch to sizeof(). >> + *msr &= 0x1fff; >> + return &d->arch.monitor_msr_bitmap->high; >> + >> + default: >> + return NULL; >> + } >> +} >> + >> +static int monitor_enable_msr(struct domain *d, u32 msr) >> +{ >> + u32 *bitmap; > > Together with the above - unsigned long * please (and the helper > function's return type should then also be unsigned long *). Understood. >> --- a/xen/include/asm-x86/domain.h >> +++ b/xen/include/asm-x86/domain.h >> @@ -401,12 +401,12 @@ struct arch_domain >> unsigned int write_ctrlreg_enabled : 4; >> unsigned int write_ctrlreg_sync : 4; >> unsigned int write_ctrlreg_onchangeonly : 4; >> - unsigned int mov_to_msr_enabled : 1; >> - unsigned int mov_to_msr_extended : 1; >> unsigned int singlestep_enabled : 1; >> unsigned int software_breakpoint_enabled : 1; >> } monitor; >> >> + struct monitor_msr_bitmap *monitor_msr_bitmap; > > Why is this not being made part of the immediately preceding > structure (omitting the monitor_ prefix)? I'll move it. Thanks, Razvan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |