[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 5/8] x86/vm-event/monitor: don't compromise monitor_write_data on domain cleanup



>>> On 30.06.16 at 20:45, <czuzu@xxxxxxxxxxxxxxx> wrote:
> The arch_vm_event structure is dynamically allocated and freed @
> vm_event_cleanup_domain. This cleanup is triggered e.g. when the toolstack 
> user
> disables domain monitoring (xc_monitor_disable), which in turn effectively
> discards any information that was in arch_vm_event.write_data.

Isn't that rather a toolstack user bug, not warranting a relatively
extensive (even if mostly mechanical) hypervisor change like this
one? Sane monitor behavior, after all, is required anyway for the
monitored guest to survive.

> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -473,24 +473,24 @@ void hvm_do_resume(struct vcpu *v)
>      if ( !handle_hvm_io_completion(v) )
>          return;
>  
> -    if ( unlikely(v->arch.vm_event) )
> +    if ( unlikely(v->arch.vm_event.emulate_flags) )
>      {
> -        if ( v->arch.vm_event->emulate_flags )
> -        {
> -            enum emul_kind kind = EMUL_KIND_NORMAL;
> +        enum emul_kind kind;
>  
> -            if ( v->arch.vm_event->emulate_flags &
> -                 VM_EVENT_FLAG_SET_EMUL_READ_DATA )
> -                kind = EMUL_KIND_SET_CONTEXT;
> -            else if ( v->arch.vm_event->emulate_flags &
> -                      VM_EVENT_FLAG_EMULATE_NOWRITE )
> -                kind = EMUL_KIND_NOWRITE;
> +        ASSERT(v->arch.vm_event.emul_read_data);
>  
> -            hvm_mem_access_emulate_one(kind, TRAP_invalid_op,
> -                                       HVM_DELIVER_NO_ERROR_CODE);
> +        kind = EMUL_KIND_NORMAL;

Please keep this being the initializer of the variable.

>  
> -            v->arch.vm_event->emulate_flags = 0;
> -        }
> +        if ( v->arch.vm_event.emulate_flags & 
> VM_EVENT_FLAG_SET_EMUL_READ_DATA )

Long line.

> --- a/xen/include/asm-x86/domain.h
> +++ b/xen/include/asm-x86/domain.h
> @@ -259,21 +259,6 @@ struct pv_domain
>      struct cpuidmasks *cpuidmasks;
>  };
>  
> -enum monitor_write_status
> -{
> -    MWS_NOWRITE = 0,
> -    MWS_MSR,
> -    MWS_CR0,
> -    MWS_CR3,
> -    MWS_CR4,
> -};
> -
> -struct monitor_write_data {
> -    enum monitor_write_status status;
> -    uint32_t msr;
> -    uint64_t value;
> -};
> -
>  struct arch_domain
>  {
>      struct page_info *perdomain_l3_pg;
> @@ -496,6 +481,31 @@ typedef enum __packed {
>      SMAP_CHECK_DISABLED,        /* disable the check */
>  } smap_check_policy_t;
>  
> +enum monitor_write_status
> +{
> +    MWS_NOWRITE = 0,
> +    MWS_MSR,
> +    MWS_CR0,
> +    MWS_CR3,
> +    MWS_CR4,
> +};
> +
> +struct monitor_write_data {
> +    enum monitor_write_status status;
> +    uint32_t msr;
> +    uint64_t value;
> +};

Instead of moving these around now, may I suggest you put them
into their final place right away in the previous patch?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.