• Ard Biesheuvel's avatar
    efi/arm: Work around missing cache maintenance in decompressor handover · c7225494
    Ard Biesheuvel authored
    The EFI stub executes within the context of the zImage as it was
    loaded by the firmware, which means it is treated as an ordinary
    PE/COFF executable, which is loaded into memory, and cleaned to
    the PoU to ensure that it can be executed safely while the MMU
    and caches are on.
    
    When the EFI stub hands over to the decompressor, we clean the caches
    by set/way and disable the MMU and D-cache, to comply with the Linux
    boot protocol for ARM. However, cache maintenance by set/way is not
    sufficient to ensure that subsequent instruction fetches and data
    accesses done with the MMU off see the correct data. This means that
    proceeding as we do currently is not safe, especially since we also
    perform data accesses with the MMU off, from a literal pool as well as
    the stack.
    
    So let's kick this can down the road a bit, and jump into the relocated
    zImage before disabling the caches. This removes the requirement to
    perform any by-VA cache maintenance on the original PE/COFF executable,
    but it does require that the relocated zImage is cleaned to the PoC,
    which is currently not the case. This will be addressed in a subsequent
    patch.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    c7225494
head.S 37.6 KB