[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH V3 10/12] xen: Introduce monitor_op domctl
>>> On 29.01.15 at 22:46, <tamas.lengyel@xxxxxxxxxxxx> wrote: > --- /dev/null > +++ b/xen/arch/x86/monitor.c > @@ -0,0 +1,197 @@ > +/* > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public > + * License v2 as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + * You should have received a copy of the GNU General Public > + * License along with this program; if not, write to the > + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, > + * Boston, MA 021110-1307, USA. > + */ > + > +#include <xen/config.h> > +#include <xen/sched.h> > +#include <xen/mm.h> > +#include <asm/domain.h> > + > +#define DISABLE_OPTION(option) \ > + if ( !option->enabled ) \ > + return -EFAULT; \ > + memset(option, 0, sizeof(*option)) This needs to be wrapped in either ({ }) or do { } while (0), allowing you to drop currently necessary (but suggested to be omitted by ./CODING_STYLE) braces around (some of) its uses below. > +int monitor_domctl(struct xen_domctl_monitor_op *domctl, struct domain *d) > +{ > + /* > + * At the moment only HVM domains are supported. However, event delivery > + * could be extended to PV domains. See comments below. > + */ > + if ( !is_hvm_domain(d) ) > + return -ENOSYS; > + > + if ( domctl->op != XEN_DOMCTL_MONITOR_OP_ENABLE && > + domctl->op != XEN_DOMCTL_MONITOR_OP_DISABLE ) > + return -EFAULT; > + > + switch ( domctl->subop ) > + { > + case XEN_DOMCTL_MONITOR_SUBOP_MOV_TO_CR0: > + { > + /* Note: could be supported on PV domains. */ > + struct mov_to_cr0 *options = &d->arch.monitor_options.mov_to_cr0; > + > + if ( domctl->op == XEN_DOMCTL_MONITOR_OP_ENABLE ) > + { > + if ( options->enabled ) > + return -EBUSY; > + > + options->enabled = 1; > + options->sync = domctl->options.mov_to_cr0.sync; > + options->onchangeonly = domctl->options.mov_to_cr0.onchangeonly; Shouldn't you set "->enabled" last, after a suitable barrier (and with the consuming sides using suitable barriers too)? Or are you missing a domain_pause() here? > + } > + else > + { > + DISABLE_OPTION(options); > + } > + break; > + } > + case XEN_DOMCTL_MONITOR_SUBOP_MOV_TO_CR3: Please consistently have blank lines between individual, not falling through cases. > + default: > + return -EFAULT; Certainly not. > @@ -1179,6 +1180,16 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) > u_domctl) > } > break; > > + case XEN_DOMCTL_monitor_op: > + { > + ret = -EPERM; > + if ( current->domain == d ) > + break; > + > + ret = monitor_domctl(&op->u.monitor_op, d); > + } > + break; Pointless braces. > --- a/xen/common/vm_event.c > +++ b/xen/common/vm_event.c > @@ -617,16 +617,10 @@ int vm_event_domctl(struct domain *d, > xen_domctl_vm_event_op_t *vec, > switch( vec->op ) > { > case XEN_DOMCTL_VM_EVENT_OP_MONITOR_ENABLE: > - case XEN_DOMCTL_VM_EVENT_OP_MONITOR_ENABLE_INTROSPECTION: > { > rc = vm_event_enable(d, vec, ved, _VPF_mem_access, > HVM_PARAM_MONITOR_RING_PFN, > mem_access_notification); > - > - if ( vec->op == > XEN_DOMCTL_VM_EVENT_OP_MONITOR_ENABLE_INTROSPECTION > - && !rc ) > - p2m_setup_introspection(d); > - > } > break; The braces should now be removed too. > @@ -635,7 +629,6 @@ int vm_event_domctl(struct domain *d, > xen_domctl_vm_event_op_t *vec, > if ( ved->ring_page ) > { > rc = vm_event_disable(d, ved); > - d->arch.hvm_domain.introspection_enabled = 0; > } And again. Please go through all of the modification the series makes and adjust for coding style. > --- a/xen/include/asm-x86/domain.h > +++ b/xen/include/asm-x86/domain.h > @@ -236,6 +236,41 @@ struct time_scale { > u32 mul_frac; > }; > > +/************************************************/ > +/* monitor event options */ > +/************************************************/ > +struct mov_to_cr0 { > + uint8_t enabled; > + uint8_t sync; > + uint8_t onchangeonly; > +}; > + > +struct mov_to_cr3 { > + uint8_t enabled; > + uint8_t sync; > + uint8_t onchangeonly; > +}; > + > +struct mov_to_cr4 { > + uint8_t enabled; > + uint8_t sync; > + uint8_t onchangeonly; > +}; As long as they're identical, these should just be a single struct mov_to_cr, allowing (afaict) further abstraction elsewhere. > +struct mov_to_msr { > + uint8_t enabled; > + uint8_t extended_capture; > +}; > + > +struct singlestep { > + uint8_t enabled; > +}; > + > +struct software_breakpoint { > + uint8_t enabled; > +}; These may also better be a common struct debug_event. > + > + > struct pv_domain Just a single blank line please. > --- /dev/null > +++ b/xen/include/asm-x86/monitor.h > @@ -0,0 +1,9 @@ > +#ifndef __ASM_X86_MONITOR_H__ > +#define __ASM_X86_MONITOR_H__ > + > +#include <xen/config.h> Not needed anywhere. Please drop such inclusions from the series. > @@ -1001,6 +1000,58 @@ struct xen_domctl_psr_cmt_op { > typedef struct xen_domctl_psr_cmt_op xen_domctl_psr_cmt_op_t; > DEFINE_XEN_GUEST_HANDLE(xen_domctl_psr_cmt_op_t); > > +/* XEN_DOMCTL_MONITOR_* > + * > + * Enable/disable monitoring various VM events. > + * This domctl configures what events will be reported to helper apps > + * via the ring buffer "MONITOR". The ring has to be first enabled > + * with the domctl XEN_DOMCTL_VM_EVENT_OP_MONITOR. > + * > + * NOTICE: mem_access events are also delivered via the "MONITOR" ring > buffer; > + * however, enabling/disabling those events is performed with the use of > + * memory_op hypercalls! > + * > + */ Stray blank comment line. > +struct xen_domctl_monitor_op { > + uint32_t op; /* XEN_DOMCTL_MONITOR_OP_* */ > + uint32_t subop; /* XEN_DOMCTL_MONITOR_SUBOP_* */ > + > + /* > + * Further options when issuing XEN_DOMCTL_MONITOR_OP_ENABLE. > + */ > + union { > + struct { > + uint8_t sync; /* Pause vCPU until response */ > + uint8_t onchangeonly; /* Send event only on a change of value */ > + uint8_t pad[6]; > + } mov_to_cr0, mov_to_cr3, mov_to_cr4; > + > + /* Enable the capture of msr events on > + MSR_IA32_SYSENTER_EIP > + MSR_IA32_SYSENTER_ESP > + MSR_IA32_SYSENTER_CS > + MSR_IA32_MC0_CTL > + MSR_STAR > + MSR_LSTAR */ Coding style. > --- a/xen/include/public/hvm/params.h > +++ b/xen/include/public/hvm/params.h > @@ -162,21 +162,6 @@ > */ > #define HVM_PARAM_ACPI_IOPORTS_LOCATION 19 > > -/* Enable blocking memory events, async or sync (pause vcpu until response) > - * onchangeonly indicates messages only on a change of value */ > -#define HVM_PARAM_MEMORY_EVENT_CR0 20 > -#define HVM_PARAM_MEMORY_EVENT_CR3 21 > -#define HVM_PARAM_MEMORY_EVENT_CR4 22 > -#define HVM_PARAM_MEMORY_EVENT_INT3 23 > -#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25 > -#define HVM_PARAM_MEMORY_EVENT_MSR 30 I'm not sure if HVM param slots can be re-used. If they can, leaving a note that the deleted numbers are available for re-sue would be nice. If they can't, leaving a note that they shouldn't be re-used would seem mandatory. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |