• Mostafa Saleh's avatar
    KVM: arm64: Use BTI for nvhe · b53d4a27
    Mostafa Saleh authored
    CONFIG_ARM64_BTI_KERNEL compiles the kernel to support ARMv8.5-BTI.
    However, the nvhe code doesn't make use of it as it doesn't map any
    pages with Guarded Page(GP) bit.
    
    kvm pgtable code is modified to map executable pages with GP bit
    if BTI is enabled for the kernel.
    
    At hyp init, SCTLR_EL2.BT is set to 1 to match EL1 configuration
    (SCTLR_EL1.BT1) set in bti_enable().
    
    One difference between kernel and nvhe code, is that the kernel maps
    .text with GP while nvhe maps all the executable pages, this makes
    nvhe code need to deal with special initialization code coming from
    other executable sections (.idmap.text).
    For this we need to add bti instruction at the beginning of
    __kvm_handle_stub_hvc as it can be called by  __host_hvc through
    branch instruction(br) and unlike SYM_FUNC_START, SYM_CODE_START
    doesn’t add bti instruction at the beginning, and it can’t be modified
    to add it as it is used with vector tables.
    Another solution which is more intrusive is to convert
    __kvm_handle_stub_hvc to a function and inject “bti jc” instead of
    “bti c” in SYM_FUNC_START
    Signed-off-by: default avatarMostafa Saleh <smostafa@google.com>
    Link: https://lore.kernel.org/r/20230530150845.2856828-1-smostafa@google.comSigned-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
    b53d4a27
sysreg.h 30.7 KB