lkml.org 
[lkml]   [2017]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 09/11] x86/xen: use capabilities instead of fake cpuid values for xsave
    Date
    When running as pv domain xen_cpuid() is being used instead of
    native_cpuid(). In xen_cpuid() the xsave feature availability is
    indicated by special casing the related cpuid leaf.

    Instead of delivering fake cpuid values set or clear the cpu
    capability bits for xsave instead.

    Signed-off-by: Juergen Gross <jgross@suse.com>
    ---
    arch/x86/xen/enlighten_pv.c | 28 +++++++++++-----------------
    1 file changed, 11 insertions(+), 17 deletions(-)

    diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
    index 38dec28a8e6d..dad1db61e40b 100644
    --- a/arch/x86/xen/enlighten_pv.c
    +++ b/arch/x86/xen/enlighten_pv.c
    @@ -165,8 +165,6 @@ xen_running_on_version_or_later(unsigned int major, unsigned int minor)
    return false;
    }

    -static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;
    -
    static __read_mostly unsigned int cpuid_leaf5_ecx_val;
    static __read_mostly unsigned int cpuid_leaf5_edx_val;

    @@ -174,16 +172,12 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
    unsigned int *cx, unsigned int *dx)
    {
    unsigned maskebx = ~0;
    - unsigned maskecx = ~0;
    +
    /*
    * Mask out inconvenient features, to try and disable as many
    * unsupported kernel subsystems as possible.
    */
    switch (*ax) {
    - case 1:
    - maskecx = cpuid_leaf1_ecx_mask;
    - break;
    -
    case CPUID_MWAIT_LEAF:
    /* Synthesize the values.. */
    *ax = 0;
    @@ -206,7 +200,6 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
    : "0" (*ax), "2" (*cx));

    *bx &= maskebx;
    - *cx &= maskecx;
    }
    STACK_FRAME_NON_STANDARD(xen_cpuid); /* XEN_EMULATE_PREFIX */

    @@ -281,22 +274,19 @@ static bool __init xen_check_mwait(void)
    return false;
    #endif
    }
    -static void __init xen_init_cpuid_mask(void)
    +
    +static bool __init xen_check_xsave(void)
    {
    - unsigned int ax, bx, cx, dx;
    - unsigned int xsave_mask;
    + unsigned int cx, xsave_mask;

    - ax = 1;
    - cx = 0;
    - cpuid(1, &ax, &bx, &cx, &dx);
    + cx = cpuid_ecx(1);

    xsave_mask =
    (1 << (X86_FEATURE_XSAVE % 32)) |
    (1 << (X86_FEATURE_OSXSAVE % 32));

    /* Xen will set CR4.OSXSAVE if supported and not disabled by force */
    - if ((cx & xsave_mask) != xsave_mask)
    - cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */
    + return (cx & xsave_mask) == xsave_mask;
    }

    static void __init xen_init_capabilities(void)
    @@ -316,6 +306,11 @@ static void __init xen_init_capabilities(void)
    setup_force_cpu_cap(X86_FEATURE_MWAIT);
    else
    setup_clear_cpu_cap(X86_FEATURE_MWAIT);
    +
    + if (!xen_check_xsave()) {
    + setup_clear_cpu_cap(X86_FEATURE_XSAVE);
    + setup_clear_cpu_cap(X86_FEATURE_OSXSAVE);
    + }
    }

    static void xen_set_debugreg(int reg, unsigned long val)
    @@ -1308,7 +1303,6 @@ asmlinkage __visible void __init xen_start_kernel(void)
    xen_setup_gdt(0);

    xen_init_irq_ops();
    - xen_init_cpuid_mask();
    xen_init_capabilities();

    #ifdef CONFIG_X86_LOCAL_APIC
    --
    2.12.0
    \
     
     \ /
      Last update: 2017-04-13 12:13    [W:4.364 / U:0.456 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site