From: Andrew Cooper Date: Thu, 6 Feb 2020 12:40:50 +0000 (+0000) Subject: xen/hvm: Fix handling of obsolete HVM_PARAMs X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~652 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ea53652d78cddd36d99f53a87591910da0c9b1ef;p=xen.git xen/hvm: Fix handling of obsolete HVM_PARAMs The local xc_hvm_param_deprecated_check() in libxc tries to guess Xen's behaviour for the MEMORY_EVENT params, but is wrong for the get side, where Xen would return 0 (which is also a bug). Delete the helper. In Xen, perform the checks in hvm_allow_set_param(), rather than hvm_set_param(), and actually implement checks on the get side so the hypercall doesn't return successfully with 0 as an answer. Signed-off-by: Andrew Cooper Acked-by: Jan Beulich Acked-by: Wei Liu --- diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index e544218d2e..71829c2bce 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1441,31 +1441,10 @@ int xc_domain_send_trigger(xc_interface *xch, return do_domctl(xch, &domctl); } -static inline int xc_hvm_param_deprecated_check(uint32_t param) -{ - switch ( param ) - { - case HVM_PARAM_MEMORY_EVENT_CR0: - case HVM_PARAM_MEMORY_EVENT_CR3: - case HVM_PARAM_MEMORY_EVENT_CR4: - case HVM_PARAM_MEMORY_EVENT_INT3: - case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP: - case HVM_PARAM_MEMORY_EVENT_MSR: - return -EOPNOTSUPP; - default: - break; - }; - - return 0; -} - int xc_hvm_param_set(xc_interface *handle, uint32_t dom, uint32_t param, uint64_t value) { DECLARE_HYPERCALL_BUFFER(xen_hvm_param_t, arg); - int rc = xc_hvm_param_deprecated_check(param); - - if ( rc ) - return rc; + int rc; arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); if ( arg == NULL ) @@ -1484,10 +1463,7 @@ int xc_hvm_param_set(xc_interface *handle, uint32_t dom, uint32_t param, uint64_ int xc_hvm_param_get(xc_interface *handle, uint32_t dom, uint32_t param, uint64_t *value) { DECLARE_HYPERCALL_BUFFER(xen_hvm_param_t, arg); - int rc = xc_hvm_param_deprecated_check(param); - - if ( rc ) - return rc; + int rc; arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg)); if ( arg == NULL ) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 00a9e70b7c..93795dab92 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4105,8 +4105,14 @@ static int hvm_allow_set_param(struct domain *d, break; /* The following parameters are deprecated. */ case HVM_PARAM_DM_DOMAIN: + case HVM_PARAM_MEMORY_EVENT_CR0: + case HVM_PARAM_MEMORY_EVENT_CR3: + case HVM_PARAM_MEMORY_EVENT_CR4: + case HVM_PARAM_MEMORY_EVENT_INT3: + case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP: case HVM_PARAM_BUFIOREQ_EVTCHN: - rc = -EPERM; + case HVM_PARAM_MEMORY_EVENT_MSR: + rc = -EINVAL; break; /* * The following parameters must not be set by the guest @@ -4221,15 +4227,6 @@ static int hvm_set_param(struct domain *d, uint32_t index, uint64_t value) case HVM_PARAM_ACPI_IOPORTS_LOCATION: rc = pmtimer_change_ioport(d, value); break; - case HVM_PARAM_MEMORY_EVENT_CR0: - case HVM_PARAM_MEMORY_EVENT_CR3: - case HVM_PARAM_MEMORY_EVENT_CR4: - case HVM_PARAM_MEMORY_EVENT_INT3: - case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP: - case HVM_PARAM_MEMORY_EVENT_MSR: - /* Deprecated */ - rc = -EOPNOTSUPP; - break; case HVM_PARAM_NESTEDHVM: rc = xsm_hvm_param_nested(XSM_PRIV, d); if ( rc ) @@ -4411,8 +4408,14 @@ static int hvm_allow_get_param(struct domain *d, break; /* The following parameters are deprecated. */ case HVM_PARAM_DM_DOMAIN: + case HVM_PARAM_MEMORY_EVENT_CR0: + case HVM_PARAM_MEMORY_EVENT_CR3: + case HVM_PARAM_MEMORY_EVENT_CR4: + case HVM_PARAM_MEMORY_EVENT_INT3: + case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP: case HVM_PARAM_BUFIOREQ_EVTCHN: - rc = -ENODATA; + case HVM_PARAM_MEMORY_EVENT_MSR: + rc = -EINVAL; break; /* The remaining parameters should not be read by the guest. */ default: diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h index 36832e4b94..68293e314e 100644 --- a/xen/include/public/hvm/params.h +++ b/xen/include/public/hvm/params.h @@ -28,8 +28,14 @@ /* These parameters are deprecated and their meaning is undefined. */ #if defined(__XEN__) || defined(__XEN_TOOLS__) -#define HVM_PARAM_DM_DOMAIN 13 -#define HVM_PARAM_BUFIOREQ_EVTCHN 26 +#define HVM_PARAM_DM_DOMAIN 13 +#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_BUFIOREQ_EVTCHN 26 +#define HVM_PARAM_MEMORY_EVENT_MSR 30 #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ @@ -227,14 +233,6 @@ */ #define HVM_PARAM_ACPI_IOPORTS_LOCATION 19 -/* Deprecated */ -#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 - /* Boolean: Enable nestedhvm (hvm only) */ #define HVM_PARAM_NESTEDHVM 24