• Alexandru Elisei's avatar
    KVM: arm64: uapi: Add kvm_debug_exit_arch.hsr_high · 18f3976f
    Alexandru Elisei authored
    When userspace is debugging a VM, the kvm_debug_exit_arch part of the
    kvm_run struct contains arm64 specific debug information: the ESR_EL2
    value, encoded in the field "hsr", and the address of the instruction
    that caused the exception, encoded in the field "far".
    
    Linux has moved to treating ESR_EL2 as a 64-bit register, but unfortunately
    kvm_debug_exit_arch.hsr cannot be changed because that would change the
    memory layout of the struct on big endian machines:
    
    Current layout:			| Layout with "hsr" extended to 64 bits:
    				|
    offset 0: ESR_EL2[31:0] (hsr)   | offset 0: ESR_EL2[61:32] (hsr[61:32])
    offset 4: padding		| offset 4: ESR_EL2[31:0]  (hsr[31:0])
    offset 8: FAR_EL2[61:0] (far)	| offset 8: FAR_EL2[61:0]  (far)
    
    which breaks existing code.
    
    The padding is inserted by the compiler because the "far" field must be
    aligned to 8 bytes (each field must be naturally aligned - aapcs64 [1],
    page 18), and the struct itself must be aligned to 8 bytes (the struct must
    be aligned to the maximum alignment of its fields - aapcs64, page 18),
    which means that "hsr" must be aligned to 8 bytes as it is the first field
    in the struct.
    
    To avoid changing the struct size and layout for the existing fields, add a
    new field, "hsr_high", which replaces the existing padding. "hsr_high" will
    be used to hold the ESR_EL2[61:32] bits of the register. The memory layout,
    both on big and little endian machine, becomes:
    
    offset 0: ESR_EL2[31:0]  (hsr)
    offset 4: ESR_EL2[61:32] (hsr_high)
    offset 8: FAR_EL2[61:0]  (far)
    
    The padding that the compiler inserts for the current struct layout is
    unitialized. To prevent an updated userspace running on an old kernel
    mistaking the padding for a valid "hsr_high" value, add a new flag,
    KVM_DEBUG_ARCH_HSR_HIGH_VALID, to kvm_run->flags to let userspace know that
    "hsr_high" holds a valid ESR_EL2[61:32] value.
    
    [1] https://github.com/ARM-software/abi-aa/releases/download/2021Q3/aapcs64.pdfSigned-off-by: default avatarAlexandru Elisei <alexandru.elisei@arm.com>
    Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20220425114444.368693-6-alexandru.elisei@arm.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    18f3976f
handle_exit.c 9.2 KB