• Raghavendra Rao Ananta's avatar
    KVM: arm64: Setup a framework for hypercall bitmap firmware registers · 05714cab
    Raghavendra Rao Ananta authored
    KVM regularly introduces new hypercall services to the guests without
    any consent from the userspace. This means, the guests can observe
    hypercall services in and out as they migrate across various host
    kernel versions. This could be a major problem if the guest
    discovered a hypercall, started using it, and after getting migrated
    to an older kernel realizes that it's no longer available. Depending
    on how the guest handles the change, there's a potential chance that
    the guest would just panic.
    
    As a result, there's a need for the userspace to elect the services
    that it wishes the guest to discover. It can elect these services
    based on the kernels spread across its (migration) fleet. To remedy
    this, extend the existing firmware pseudo-registers, such as
    KVM_REG_ARM_PSCI_VERSION, but by creating a new COPROC register space
    for all the hypercall services available.
    
    These firmware registers are categorized based on the service call
    owners, but unlike the existing firmware pseudo-registers, they hold
    the features supported in the form of a bitmap.
    
    During the VM initialization, the registers are set to upper-limit of
    the features supported by the corresponding registers. It's expected
    that the VMMs discover the features provided by each register via
    GET_ONE_REG, and write back the desired values using SET_ONE_REG.
    KVM allows this modification only until the VM has started.
    
    Some of the standard features are not mapped to any bits of the
    registers. But since they can recreate the original problem of
    making it available without userspace's consent, they need to
    be explicitly added to the case-list in
    kvm_hvc_call_default_allowed(). Any function-id that's not enabled
    via the bitmap, or not listed in kvm_hvc_call_default_allowed, will
    be returned as SMCCC_RET_NOT_SUPPORTED to the guest.
    
    Older userspace code can simply ignore the feature and the
    hypercall services will be exposed unconditionally to the guests,
    thus ensuring backward compatibility.
    
    In this patch, the framework adds the register only for ARM's standard
    secure services (owner value 4). Currently, this includes support only
    for ARM True Random Number Generator (TRNG) service, with bit-0 of the
    register representing mandatory features of v1.0. Other services are
    momentarily added in the upcoming patches.
    Signed-off-by: default avatarRaghavendra Rao Ananta <rananta@google.com>
    Reviewed-by: default avatarGavin Shan <gshan@redhat.com>
    [maz: reduced the scope of some helpers, tidy-up bitmap max values,
     dropped error-only fast path]
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20220502233853.1233742-3-rananta@google.com
    05714cab
hypercalls.c 11.3 KB