|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-next] x86/svm: Correct vm_event API for descriptor accesses
On Thu, Nov 28, 2019 at 4:44 AM Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote:
>
> c/s d0a699a389f1 "x86/monitor: add support for descriptor access events"
> introduced logic looking for what appeared to be exitinfo (not that this
> exists in SVM - exitinfo1 or 2 do), but actually passed the exit IDT vectoring
> information. There is never any IDT vectoring involved in these intercepts so
> the value passed is always zero.
>
> In fact, SVM doesn't provide any information, even in exitinfo1 and 2. Note
> the error in the public API and state that this field is always 0, and drop
> the SVM logic in hvm_monitor_descriptor_access().
>
> In the SVM vmexit handler itself, optimise the switch statement by observing
> that there is a linear transformation between the SVM exit_reason and
> VM_EVENT_DESC_* values. (Bloat-o-meter reports 6028 => 5877 for a saving of
> 151 bytes).
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Wei Liu <wl@xxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
> CC: Tamas K Lengyel <tamas@xxxxxxxxxxxxx>
> CC: Alexandru Isaila <aisaila@xxxxxxxxxxxxxxx>
> CC: Petre Pircalabu <ppircalabu@xxxxxxxxxxxxxxx>
> CC: Adrian Pop <apop@xxxxxxxxxxxxxxx>
>
> Adrian: Do you recall what information you were attempting to forward from the
> VMCB? I can't locate anything which would plausibly be interesting.
>
> This is part of a longer cleanup series I gathered in the wake of the task
> switch issues, but it is pulled out ahead due to its interaction with the
> public interface.
> ---
> xen/arch/x86/hvm/monitor.c | 4 ----
> xen/arch/x86/hvm/svm/svm.c | 37 +++++++++++++++++--------------------
> xen/include/public/vm_event.h | 4 ++--
> 3 files changed, 19 insertions(+), 26 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/monitor.c b/xen/arch/x86/hvm/monitor.c
> index 7fb1e2c04e..1f23fe25e8 100644
> --- a/xen/arch/x86/hvm/monitor.c
> +++ b/xen/arch/x86/hvm/monitor.c
> @@ -113,10 +113,6 @@ void hvm_monitor_descriptor_access(uint64_t exit_info,
> req.u.desc_access.arch.vmx.instr_info = exit_info;
> req.u.desc_access.arch.vmx.exit_qualification =
> vmx_exit_qualification;
> }
> - else
> - {
> - req.u.desc_access.arch.svm.exitinfo = exit_info;
> - }
>
> monitor_traps(current, true, &req);
> }
> diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
> index 0fb1908c18..776cf11459 100644
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -2980,29 +2980,26 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
> svm_vmexit_do_pause(regs);
> break;
>
> - case VMEXIT_IDTR_READ:
> - case VMEXIT_IDTR_WRITE:
> - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0,
> - VM_EVENT_DESC_IDTR, exit_reason == VMEXIT_IDTR_WRITE);
> - break;
> -
> - case VMEXIT_GDTR_READ:
> - case VMEXIT_GDTR_WRITE:
> - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0,
> - VM_EVENT_DESC_GDTR, exit_reason == VMEXIT_GDTR_WRITE);
> - break;
> + case VMEXIT_IDTR_READ ... VMEXIT_TR_WRITE:
> + {
> + /*
> + * Consecutive block of 8 exit codes (sadly not aligned). Top bit
> + * indicates write (vs read), bottom 2 bits map linearly to
> + * VM_EVENT_DESC_* values.
> + */
> +#define E2D(e) ((((e) - VMEXIT_IDTR_READ) & 3) + 1)
> + bool write = ((exit_reason - VMEXIT_IDTR_READ) & 4);
> + unsigned int desc = E2D(exit_reason);
>
> - case VMEXIT_LDTR_READ:
> - case VMEXIT_LDTR_WRITE:
> - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0,
> - VM_EVENT_DESC_LDTR, exit_reason == VMEXIT_LDTR_WRITE);
> - break;
> + BUILD_BUG_ON(E2D(VMEXIT_IDTR_READ) != VM_EVENT_DESC_IDTR);
> + BUILD_BUG_ON(E2D(VMEXIT_GDTR_READ) != VM_EVENT_DESC_GDTR);
> + BUILD_BUG_ON(E2D(VMEXIT_LDTR_READ) != VM_EVENT_DESC_LDTR);
> + BUILD_BUG_ON(E2D(VMEXIT_TR_READ) != VM_EVENT_DESC_TR);
> +#undef E2D
>
> - case VMEXIT_TR_READ:
> - case VMEXIT_TR_WRITE:
> - hvm_descriptor_access_intercept(vmcb->exitintinfo.bytes, 0,
> - VM_EVENT_DESC_TR, exit_reason == VMEXIT_TR_WRITE);
> + hvm_descriptor_access_intercept(0, 0, desc, write);
> break;
> + }
>
> default:
> unexpected_exit_type:
> diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h
> index 959083d8c4..d1b5c95f72 100644
> --- a/xen/include/public/vm_event.h
> +++ b/xen/include/public/vm_event.h
> @@ -302,8 +302,8 @@ struct vm_event_desc_access {
> uint64_t exit_qualification; /* VMX: VMCS Exit Qualification */
> } vmx;
> struct {
> - uint64_t exitinfo; /* SVM: VMCB EXITINFO */
> - uint64_t _pad2;
> + uint64_t exitinfo; /* SVM: Always 0. This field made
> */
There really is no point in retaining a useless field. Just remove it
and bump the event interface version. That's what it's for.
> + uint64_t _pad2; /* its way into the API by error.
> */
Also not sure what this field is for, we just want to pad things to be
64-bit aligned. So having a 64-bit pad field makes no sense, please
also just remove it.
Thanks,
Tamas
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |