[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3] xen/vm_event: Clean up control-register-write vm_events
>>> On 19.05.15 at 10:31, <rcojocaru@xxxxxxxxxxxxxxx> wrote: > The CR0, CR3 and CR4 events are > now pre-write vm_events. I didn't get the impression you and Tamas had already settled on whether this is the way to go forward. > --- a/xen/arch/x86/hvm/event.c > +++ b/xen/arch/x86/hvm/event.c > @@ -88,55 +88,29 @@ static int hvm_event_traps(uint8_t sync, > vm_event_request_t *req) > return 1; > } > > -static inline > -void hvm_event_cr(uint32_t reason, unsigned long value, > - unsigned long old, bool_t onchangeonly, bool_t sync) > +void hvm_event_cr(unsigned short index, unsigned long value, unsigned long > old) What's the point of using "unsigned short" here? > { > - if ( onchangeonly && value == old ) > + struct arch_domain *currad = ¤t->domain->arch; > + > + if ( !(currad->monitor.write_ctrlreg_enabled & index) ) > + return; > + > + if ( (currad->monitor.write_ctrlreg_onchangeonly & index) && value == > old ) > return; > else > { Considering that nothing follows this else block, please invert the condition and avoid both return and else. > @@ -3201,6 +3204,8 @@ int hvm_set_cr0(unsigned long value) > goto gpf; > } > > + hvm_event_cr(VM_EVENT_X86_CR0, value, old_value); > + > if ( (value & X86_CR0_PG) && !(old_value & X86_CR0_PG) ) > { > if ( v->arch.hvm_vcpu.guest_efer & EFER_LME ) If the monitor's response isn't being checked (i.e. "deny" not [yet] being honored), what's the point of moving the generation of the event in this patch (which would be involved enough without these extra adjustments)? > @@ -3287,7 +3291,9 @@ int hvm_set_cr3(unsigned long value) > { > struct vcpu *v = current; > struct page_info *page; > - unsigned long old; > + unsigned long old = v->arch.hvm_vcpu.guest_cr[3]; > + > + hvm_event_cr(VM_EVENT_X86_CR3, value, old); I don't think the local variable is warranted anymore with the moved event generation point. > @@ -2010,7 +2010,7 @@ static int vmx_cr_access(unsigned long > exit_qualification) > unsigned long old = curr->arch.hvm_vcpu.guest_cr[0]; > curr->arch.hvm_vcpu.guest_cr[0] &= ~X86_CR0_TS; > vmx_update_guest_cr(curr, 0); > - hvm_event_cr0(curr->arch.hvm_vcpu.guest_cr[0], old); > + hvm_event_cr(VM_EVENT_X86_CR0, curr->arch.hvm_vcpu.guest_cr[0], old); Why is this not becoming a pre event? > +/* Supported values for the vm_event_write_ctrlreg index. */ > +#define VM_EVENT_X86_CR0 (1 << 0) > +#define VM_EVENT_X86_CR3 (1 << 1) > +#define VM_EVENT_X86_CR4 (1 << 2) > +#define VM_EVENT_X86_XCR0 (1 << 3) Why bit masks rather than an enumeration like thing? > @@ -156,7 +158,8 @@ struct vm_event_mem_access { > uint32_t _pad; > }; > > -struct vm_event_mov_to_cr { > +struct vm_event_write_ctrlreg { > + uint64_t index; In particular here - what meaning would it have if there was more than one bit set? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |