lkml.org 
[lkml]   [2016]   [Dec]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/4] x86/microcode/AMD: Do not load when running on a hypervisor
    Date
    From: Borislav Petkov <bp@suse.de>

    Doing so is completely void of sense for multiple reasons so prevent
    it. Set dis_ucode_ldr to true and thus disable the microcode loader by
    default to address xen pv guests which execute the AP path but not the
    BSP path.

    By having it turned off by default, the APs won't run into the loader
    either.

    Also, check CPUID(1).ECX[31] which hypervisors set. Well almost, not the
    xen pv one. That one gets the aforementioned "fix".

    Also, improve the detection method by caching the final decision whether
    to continue loading in dis_ucode_ldr and do it once on the BSP. The APs
    then simply test that value.

    Signed-off-by: Borislav Petkov <bp@suse.de>
    Tested-by: Juergen Gross <jgross@suse.com>
    Acked-by: Juergen Gross <jgross@suse.com>
    Tested-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    ---
    arch/x86/kernel/cpu/microcode/core.c | 28 +++++++++++++++++++---------
    1 file changed, 19 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
    index 6996413c78c3..c4bb2f7169f6 100644
    --- a/arch/x86/kernel/cpu/microcode/core.c
    +++ b/arch/x86/kernel/cpu/microcode/core.c
    @@ -44,7 +44,7 @@
    #define DRIVER_VERSION "2.2"

    static struct microcode_ops *microcode_ops;
    -static bool dis_ucode_ldr;
    +static bool dis_ucode_ldr = true;

    LIST_HEAD(microcode_cache);

    @@ -76,6 +76,7 @@ struct cpu_info_ctx {
    static bool __init check_loader_disabled_bsp(void)
    {
    static const char *__dis_opt_str = "dis_ucode_ldr";
    + u32 a, b, c, d;

    #ifdef CONFIG_X86_32
    const char *cmdline = (const char *)__pa_nodebug(boot_command_line);
    @@ -88,8 +89,23 @@ static bool __init check_loader_disabled_bsp(void)
    bool *res = &dis_ucode_ldr;
    #endif

    - if (cmdline_find_option_bool(cmdline, option))
    - *res = true;
    + if (!have_cpuid_p())
    + return *res;
    +
    + a = 1;
    + c = 0;
    + native_cpuid(&a, &b, &c, &d);
    +
    + /*
    + * CPUID(1).ECX[31]: reserved for hypervisor use. This is still not
    + * completely accurate as xen pv guests don't see that CPUID bit set but
    + * that's good enough as they don't land on the BSP path anyway.
    + */
    + if (c & BIT(31))
    + return *res;
    +
    + if (cmdline_find_option_bool(cmdline, option) <= 0)
    + *res = false;

    return *res;
    }
    @@ -121,9 +137,6 @@ void __init load_ucode_bsp(void)
    if (check_loader_disabled_bsp())
    return;

    - if (!have_cpuid_p())
    - return;
    -
    vendor = x86_cpuid_vendor();
    family = x86_cpuid_family();

    @@ -157,9 +170,6 @@ void load_ucode_ap(void)
    if (check_loader_disabled_ap())
    return;

    - if (!have_cpuid_p())
    - return;
    -
    vendor = x86_cpuid_vendor();
    family = x86_cpuid_family();

    --
    2.11.0
    \
     
     \ /
      Last update: 2016-12-18 17:45    [W:2.229 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site