• Dan Williams's avatar
    x86/mm: Fix decoy address handling vs 32-bit builds · 51c3fbd8
    Dan Williams authored
    A decoy address is used by set_mce_nospec() to update the cache attributes
    for a page that may contain poison (multi-bit ECC error) while attempting
    to minimize the possibility of triggering a speculative access to that
    page.
    
    When reserve_memtype() is handling a decoy address it needs to convert it
    to its real physical alias. The conversion, AND'ing with __PHYSICAL_MASK,
    is broken for a 32-bit physical mask and reserve_memtype() is passed the
    last physical page. Gert reports triggering the:
    
        BUG_ON(start >= end);
    
    ...assertion when running a 32-bit non-PAE build on a platform that has
    a driver resource at the top of physical memory:
    
        BIOS-e820: [mem 0x00000000fff00000-0x00000000ffffffff] reserved
    
    Given that the decoy address scheme is only targeted at 64-bit builds and
    assumes that the top of physical address space is free for use as a decoy
    address range, simply bypass address sanitization in the 32-bit case.
    
    Lastly, there was no need to crash the system when this failure occurred,
    and no need to crash future systems if the assumptions of decoy addresses
    are ever violated. Change the BUG_ON() to a WARN() with an error return.
    
    Fixes: 510ee090 ("x86/mm/pat: Prepare {reserve, free}_memtype() for...")
    Reported-by: default avatarGert Robben <t2@gert.gr>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarGert Robben <t2@gert.gr>
    Cc: stable@vger.kernel.org
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: platform-driver-x86@vger.kernel.org
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/154454337985.789277.12133288391664677775.stgit@dwillia2-desk3.amr.corp.intel.com
    51c3fbd8
pat.c 29.4 KB