lkml.org 
[lkml]   [2018]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] xen: don't use privcmd_call() from xen_mc_flush()
    Date
    Using privcmd_call() for a singleton multicall seems to be wrong, as
    privcmd_call() is using stac()/clac() to enable hypervisor access to
    Linux user space.

    Add a new xen_single_call() function to be use for that purpose.

    Reported-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    ---
    arch/x86/include/asm/xen/hypercall.h | 25 +++++++++++++++++++------
    arch/x86/xen/multicalls.c | 6 +++---
    2 files changed, 22 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
    index bfd882617613..6b2f90a0b149 100644
    --- a/arch/x86/include/asm/xen/hypercall.h
    +++ b/arch/x86/include/asm/xen/hypercall.h
    @@ -209,24 +209,37 @@ extern struct { char _entry[32]; } hypercall_page[];
    })

    static inline long
    -privcmd_call(unsigned call,
    - unsigned long a1, unsigned long a2,
    - unsigned long a3, unsigned long a4,
    - unsigned long a5)
    +xen_single_call(unsigned int call,
    + unsigned long a1, unsigned long a2,
    + unsigned long a3, unsigned long a4,
    + unsigned long a5)
    {
    __HYPERCALL_DECLS;
    __HYPERCALL_5ARG(a1, a2, a3, a4, a5);

    - stac();
    asm volatile(CALL_NOSPEC
    : __HYPERCALL_5PARAM
    : [thunk_target] "a" (&hypercall_page[call])
    : __HYPERCALL_CLOBBER5);
    - clac();

    return (long)__res;
    }

    +static inline long
    +privcmd_call(unsigned int call,
    + unsigned long a1, unsigned long a2,
    + unsigned long a3, unsigned long a4,
    + unsigned long a5)
    +{
    + long res;
    +
    + stac();
    + res = xen_single_call(call, a1, a2, a3, a4, a5);
    + clac();
    +
    + return res;
    +}
    +
    static inline int
    HYPERVISOR_set_trap_table(struct trap_info *table)
    {
    diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c
    index dc502ca8263e..2bce7958ce8b 100644
    --- a/arch/x86/xen/multicalls.c
    +++ b/arch/x86/xen/multicalls.c
    @@ -80,9 +80,9 @@ void xen_mc_flush(void)
    and just do the call directly. */
    mc = &b->entries[0];

    - mc->result = privcmd_call(mc->op,
    - mc->args[0], mc->args[1], mc->args[2],
    - mc->args[3], mc->args[4]);
    + mc->result = xen_single_call(mc->op, mc->args[0], mc->args[1],
    + mc->args[2], mc->args[3],
    + mc->args[4]);
    ret = mc->result < 0;
    break;

    --
    2.13.7
    \
     
     \ /
      Last update: 2018-06-13 11:58    [W:5.142 / U:0.212 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site