lkml.org 
[lkml]   [2022]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 1/5] x86/microcode/intel: Check against CPU signature before saving microcode
    Date
    When save_microcode_patch() is looking to replace an existing microcode in
    the cache, current code is *only* checks the CPU sig/pf in the main
    header. Microcode can carry additional sig/pf combinations in the extended
    signature table, which is completely missed today.

    For e.g. Current patch is a multi-stepping patch and new incoming patch is
    a specific patch just for this CPUs stepping.

    patch1:
    fms3 <--- header FMS
    ...
    ext_sig:
    fms1
    fms2

    patch2: new
    fms2 <--- header FMS

    Current code takes only fms3 and checks with patch2 fms2.

    saved_patch.header.fms3 != new_patch.header.fms2, so save_microcode_patch
    saves it to the end of list instead of replacing patch1 with patch2.

    There is no functional user observable issue since find_patch() skips
    patch versions that are <= current_patch and will land on patch2 properly.

    Nevertheless this will just end up storing every patch that isn't required.
    Kernel just needs to store the latest patch. Otherwise its a memory leak
    that sits in kernel and never used.

    Cc: stable@vger.kernel.org
    Fixes: fe055896c040 ("x86/microcode: Merge the early microcode loader")
    Tested-by: William Xie <william.xie@intel.com>
    Reported-by: William Xie <william.xie@intel.com>
    Signed-off-by: Ashok Raj <ashok.raj@intel.com>
    ---
    arch/x86/kernel/cpu/microcode/intel.c | 14 +++++++++++---
    1 file changed, 11 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
    index 025c8f0cd948..c4b11e2fbe33 100644
    --- a/arch/x86/kernel/cpu/microcode/intel.c
    +++ b/arch/x86/kernel/cpu/microcode/intel.c
    @@ -114,10 +114,18 @@ static void save_microcode_patch(struct ucode_cpu_info *uci, void *data, unsigne

    list_for_each_entry_safe(iter, tmp, &microcode_cache, plist) {
    mc_saved_hdr = (struct microcode_header_intel *)iter->data;
    - sig = mc_saved_hdr->sig;
    - pf = mc_saved_hdr->pf;

    - if (find_matching_signature(data, sig, pf)) {
    + sig = uci->cpu_sig.sig;
    + pf = uci->cpu_sig.pf;
    +
    + /*
    + * Compare the current CPUs signature with the ones in the
    + * cache to identify the right candidate to replace. At any
    + * given time, we should have no more than one valid patch
    + * file for a given CPU fms+pf in the cache list.
    + */
    +
    + if (find_matching_signature(iter->data, sig, pf)) {
    prev_found = true;

    if (mc_hdr->rev <= mc_saved_hdr->rev)
    --
    2.32.0
    \
     
     \ /
      Last update: 2022-08-17 07:13    [W:2.268 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site