|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 4/9] x86/pv: Implement pv_hypercall() in C
On Tue, Sep 6, 2016 at 11:12 AM, Andrew Cooper
<andrew.cooper3@xxxxxxxxxx> wrote:
> In a similar style to hvm_do_hypercall(). The C version is far easier to
> understand and edit than the assembly versions.
>
> There are a few small differences however. The register clobbering values
> have changed (to match the HVM side), and in particular clobber the upper
> 32bits of 64bit arguments. The hypercall and performance counter record are
> reordered to increase code sharing between the 32bit and 64bit cases.
>
> The sole callers of __trace_hypercall_entry() were the assembly code. Given
> the new C layout, it is more convenient to fold __trace_hypercall_entry() into
> pv_hypercall(), and call __trace_hypercall() directly.
>
> Finally, pv_hypercall() will treat a NULL hypercall function pointer as
> -ENOSYS, allowing further cleanup.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
>
> v2:
> * Use guest_mode_kernel() rather than TF_kernel_mode
> * Consistent use of 32bit stores
> * Don't truncate rax for 64bit domains
> * Move eax return assignment into C
> ---
> xen/arch/x86/hypercall.c | 120
> +++++++++++++++++++++++++++++++++++++
> xen/arch/x86/trace.c | 27 ---------
> xen/arch/x86/x86_64/asm-offsets.c | 1 -
> xen/arch/x86/x86_64/compat/entry.S | 69 +--------------------
> xen/arch/x86/x86_64/entry.S | 61 +------------------
> 5 files changed, 124 insertions(+), 154 deletions(-)
>
> diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
> index 4b42f86..13a89a0 100644
> --- a/xen/arch/x86/hypercall.c
> +++ b/xen/arch/x86/hypercall.c
> @@ -17,7 +17,12 @@
> * Copyright (c) 2015,2016 Citrix Systems Ltd.
> */
>
> +#include <xen/compiler.h>
> #include <xen/hypercall.h>
> +#include <xen/trace.h>
> +
> +extern hypercall_fn_t *const hypercall_table[NR_hypercalls],
> + *const compat_hypercall_table[NR_hypercalls];
>
> #define ARGS(x, n) \
> [ __HYPERVISOR_ ## x ] = (n)
> @@ -111,6 +116,121 @@ const uint8_t
> compat_hypercall_args_table[NR_hypercalls] =
>
> #undef ARGS
>
> +void pv_hypercall(struct cpu_user_regs *regs)
> +{
> + struct vcpu *curr = current;
> +#ifndef NDEBUG
> + unsigned long old_rip = regs->rip;
> +#endif
> + unsigned long eax;
> +
> + ASSERT(guest_kernel_mode(curr, regs));
> +
> + eax = is_pv_32bit_vcpu(curr) ? regs->_eax : regs->eax;
> +
> + if ( (eax >= NR_hypercalls) || !hypercall_table[eax] )
> + {
> + regs->eax = -ENOSYS;
> + return;
> + }
> +
> + if ( !is_pv_32bit_vcpu(curr) )
> + {
> + unsigned long rdi = regs->rdi;
> + unsigned long rsi = regs->rsi;
> + unsigned long rdx = regs->rdx;
> + unsigned long r10 = regs->r10;
> + unsigned long r8 = regs->r8;
> + unsigned long r9 = regs->r9;
> +
> +#ifndef NDEBUG
> + /* Deliberately corrupt parameter regs not used by this hypercall. */
> + switch ( hypercall_args_table[eax] )
> + {
> + case 0: rdi = 0xdeadbeefdeadf00dUL;
> + case 1: rsi = 0xdeadbeefdeadf00dUL;
> + case 2: rdx = 0xdeadbeefdeadf00dUL;
> + case 3: r10 = 0xdeadbeefdeadf00dUL;
> + case 4: r8 = 0xdeadbeefdeadf00dUL;
> + case 5: r9 = 0xdeadbeefdeadf00dUL;
> + }
Out of curiosity, is Coverity going to complain about the lack of /*
FALLTHROUGH */ in these stanzas, or is there some magic that lets it
know this is intended? (Or does it ignore DEBUG code?)
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |