|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V7 07/12] xen: Introduce monitor_op domctl
>>> On 12.03.15 at 18:58, <tamas.lengyel@xxxxxxxxxxxx> wrote:
> @@ -91,41 +88,55 @@ static int hvm_event_traps(uint64_t parameters,
> vm_event_request_t *req)
> return 1;
> }
>
> -static void hvm_event_cr(uint32_t reason, unsigned long value,
> - unsigned long old, uint64_t parameters)
> +static inline
> +void hvm_event_cr(uint32_t reason, unsigned long value,
> + unsigned long old, bool_t onchangeonly, bool_t sync)
> {
> - vm_event_request_t req = {
> - .reason = reason,
> - .vcpu_id = current->vcpu_id,
> - .u.mov_to_cr.new_value = value,
> - .u.mov_to_cr.old_value = old
> - };
> -
> - if ( (parameters & HVMPME_onchangeonly) && (value == old) )
> + if ( onchangeonly && value == old )
> + {
> return;
> -
> - hvm_event_traps(parameters, &req);
> + }
> + else
> + {
> + vm_event_request_t req = {
> + .reason = reason,
> + .vcpu_id = current->vcpu_id,
> + .u.mov_to_cr.new_value = value,
> + .u.mov_to_cr.old_value = old
> + };
> +
> + hvm_event_traps(sync, &req);
> + }
... I'd really like to see such done without "else" (which would also
have resulted in a smaller change).
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -5830,19 +5830,11 @@ long do_hvm_op(unsigned long op,
> XEN_GUEST_HANDLE_PARAM(void) arg)
> case HVM_PARAM_MEMORY_EVENT_CR0:
> case HVM_PARAM_MEMORY_EVENT_CR3:
> case HVM_PARAM_MEMORY_EVENT_CR4:
> - if ( d == current->domain )
> - rc = -EPERM;
> - break;
> case HVM_PARAM_MEMORY_EVENT_INT3:
> case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP:
> case HVM_PARAM_MEMORY_EVENT_MSR:
> - if ( d == current->domain )
> - {
> - rc = -EPERM;
> - break;
> - }
> - if ( a.value & HVMPME_onchangeonly )
> - rc = -EINVAL;
> + /* Deprecated */
> + rc = -EPERM;
-EOPNOTSUPP would have been better, but anyway.
> @@ -5902,29 +5894,10 @@ long do_hvm_op(unsigned long op,
> XEN_GUEST_HANDLE_PARAM(void) arg)
> }
> }
>
> - if ( rc == 0 )
> + if ( rc == 0 )
> {
> d->arch.hvm_domain.params[a.index] = a.value;
> -
> - switch( a.index )
> - {
> - case HVM_PARAM_MEMORY_EVENT_INT3:
> - case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP:
> - {
> - domain_pause(d);
> - domain_unpause(d); /* Causes guest to latch new status */
> - break;
> - }
> - case HVM_PARAM_MEMORY_EVENT_CR3:
> - {
> - for_each_vcpu ( d, v )
> - hvm_funcs.update_guest_cr(v, 0); /* Latches new CR3
> mask through CR0 code */
> - break;
> - }
> - }
> -
> }
> -
There's a now pointless pair of braces left in place.
> +int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *mop)
> +{
> + int rc;
> + struct arch_domain *ad = &d->arch;
> +
> + rc = xsm_vm_event_control(XSM_PRIV, d, mop->op, mop->event);
> + if ( rc )
> + return rc;
> +
> + /*
> + * At the moment only Intel HVM domains are supported. However, event
> + * delivery could be extended to AMD and PV domains.
> + */
> + if ( !is_hvm_domain(d) || !cpu_has_vmx )
> + return -EOPNOTSUPP;
> +
> + /*
> + * Sanity check
> + */
> + if ( mop->op != XEN_DOMCTL_MONITOR_OP_ENABLE &&
> + mop->op != XEN_DOMCTL_MONITOR_OP_DISABLE )
> + return -ENOSYS;
Here and further down -EOPNOTSUPP would again be better - we
try to use -ENOSYS only for hypercalls that aren't implemented at
all, not for invalid sub-ops (but there may still be a few violators
in the tree).
> case XEN_VM_EVENT_MONITOR_DISABLE:
> {
> if ( ved->ring_page )
> {
> rc = vm_event_disable(d, ved);
> - d->arch.hvm_domain.introspection_enabled = 0;
> }
Again leaving in place a now pointless pair of braces.
> --- a/xen/include/asm-x86/domain.h
> +++ b/xen/include/asm-x86/domain.h
> @@ -333,12 +333,32 @@ struct arch_domain
> struct e820entry *e820;
> unsigned int nr_e820;
>
> - unsigned int psr_rmid; /* RMID assigned to the domain for CMT */
> -
> /* Shared page for notifying that explicit PIRQ EOI is required. */
> unsigned long *pirq_eoi_map;
> unsigned long pirq_eoi_map_mfn;
> -};
> +
> + unsigned int psr_rmid; /* RMID assigned to the domain for CMT */
I cannot see why this is being moved.
> --- /dev/null
> +++ b/xen/include/asm-x86/monitor.h
> @@ -0,0 +1,31 @@
> +/*
> + * include/asm-x86/monitor.h
> + *
> + * Architecture-specific monitor_op domctl handler.
> + *
> + * Copyright (c) 2015 Tamas K Lengyel (tamas@xxxxxxxxxxxxx)
> + *
> + * 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.
> + */
> +
> +#ifndef __ASM_X86_MONITOR_H__
> +#define __ASM_X86_MONITOR_H__
> +
> +#include <xen/sched.h>
> +#include <public/domctl.h>
> +
> +int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *op);
Didn't we settle on the two includes above being pointless? We
should really aim at reducing the header dependency tree rather
than endlessly growing it (and having basically everyone include
everything).
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -607,24 +607,38 @@ long p2m_set_mem_access(struct domain *d, unsigned long
> start_pfn, uint32_t nr,
> int p2m_get_mem_access(struct domain *d, unsigned long pfn,
> xenmem_access_t *access);
>
> -/* Check for emulation and mark vcpu for skipping one instruction
> - * upon rescheduling if required. */
> -void p2m_mem_access_emulate_check(struct vcpu *v,
> - const vm_event_response_t *rsp);
> +/*
> + * Emulating a memory access requires custom handling
> + */
> +static inline
> +int p2m_mem_access_enable_emulate(struct domain *d)
> +{
> + if ( d->arch.mem_access_emulate_enabled )
> + return -EEXIST;
>
> -/* Enable arch specific introspection options (such as MSR interception). */
> -void p2m_setup_introspection(struct domain *d);
> + d->arch.mem_access_emulate_enabled = 1;
> + return 0;
> +}
>
> -/* Sanity check for vm_event hardware support */
> -static inline bool_t p2m_vm_event_sanity_check(struct domain *d)
> +static inline
> +int p2m_mem_access_disable_emulate(struct domain *d)
> {
> - return hap_enabled(d) && cpu_has_vmx;
> + if ( !d->arch.mem_access_emulate_enabled )
> + return -EEXIST;
> +
> + d->arch.mem_access_emulate_enabled = 0;
> + return 0;
> }
The fact that these seemingly non-atomic checks/updates are safe
(due to being under domctl lock) should be stated in a comment.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |