• Linus Torvalds's avatar
    Merge tag 'x86-urgent-2024-09-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip · c9f016e7
    Linus Torvalds authored
    Pull x86 fixes from Thomas Gleixner:
    
     - x2apic_disable() clears x2apic_state and x2apic_mode unconditionally,
       even when the state is X2APIC_ON_LOCKED, which prevents the kernel to
       disable it thereby creating inconsistent state.
    
       Reorder the logic so it actually works correctly
    
     - The XSTATE logic for handling LBR is incorrect as it assumes that
       XSAVES supports LBR when the CPU supports LBR. In fact both
       conditions need to be true. Otherwise the enablement of LBR in the
       IA32_XSS MSR fails and subsequently the machine crashes on the next
       XRSTORS operation because IA32_XSS is not initialized.
    
       Cache the XSTATE support bit during init and make the related
       functions use this cached information and the LBR CPU feature bit to
       cure this.
    
     - Cure a long standing bug in KASLR
    
       KASLR uses the full address space between PAGE_OFFSET and vaddr_end
       to randomize the starting points of the direct map, vmalloc and
       vmemmap regions. It thereby limits the size of the direct map by
       using the installed memory size plus an extra configurable margin for
       hot-plug memory. This limitation is done to gain more randomization
       space because otherwise only the holes between the direct map,
       vmalloc, vmemmap and vaddr_end would be usable for randomizing.
    
       The limited direct map size is not exposed to the rest of the kernel,
       so the memory hot-plug and resource management related code paths
       still operate under the assumption that the available address space
       can be determined with MAX_PHYSMEM_BITS.
    
       request_free_mem_region() allocates from (1 << MAX_PHYSMEM_BITS) - 1
       downwards. That means the first allocation happens past the end of
       the direct map and if unlucky this address is in the vmalloc space,
       which causes high_memory to become greater than VMALLOC_START and
       consequently causes iounmap() to fail for valid ioremap addresses.
    
       Cure this by exposing the end of the direct map via PHYSMEM_END and
       use that for the memory hot-plug and resource management related
       places instead of relying on MAX_PHYSMEM_BITS. In the KASLR case
       PHYSMEM_END maps to a variable which is initialized by the KASLR
       initialization and otherwise it is based on MAX_PHYSMEM_BITS as
       before.
    
     - Prevent a data leak in mmio_read(). The TDVMCALL exposes the value of
       an initialized variabled on the stack to the VMM. The variable is
       only required as output value, so it does not have to exposed to the
       VMM in the first place.
    
     - Prevent an array overrun in the resource control code on systems with
       Sub-NUMA Clustering enabled because the code failed to adjust the
       index by the number of SNC nodes per L3 cache.
    
    * tag 'x86-urgent-2024-09-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
      x86/resctrl: Fix arch_mbm_* array overrun on SNC
      x86/tdx: Fix data leak in mmio_read()
      x86/kaslr: Expose and use the end of the physical memory address space
      x86/fpu: Avoid writing LBR bit to IA32_XSS unless supported
      x86/apic: Make x2apic_disable() work correctly
    c9f016e7
sparse.c 25.9 KB