lkml.org 
[lkml]   [2022]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    Subject[PATCH v4 00/13] KVM: arm64: Add support for hypercall services selection
    From
    Hello,

    Continuing the discussion from [1], the series tries to add support
    for the user-space to elect the hypercall services that it wishes
    to expose to the guest, rather than the guest discovering them
    unconditionally. The idea employed by the series was taken from
    [1] as suggested by Marc Z.

    In a broad sense, the idea is similar to the current implementation
    of PSCI interface- create a 'firmware psuedo-register' to handle the
    firmware revisions. The series extends this idea to all the other
    hypercalls such as TRNG (True Random Number Generator), PV_TIME
    (Paravirtualized Time), and PTP (Precision Time protocol).

    For better categorization and future scaling, these firmware registers
    are categorized based on the service call owners, but unlike the
    existing firmware psuedo-registers, they hold the features supported
    in the form of a bitmap.

    During the VM initialization, the registers holds an upper-limit of
    the features supported by each one of them. It's expected that the
    userspace discover the features provided by each register via GET_ONE_REG,
    and writeback the desired values using SET_ONE_REG. KVM allows this
    modification only until the VM has started.

    Older VMMs can simply ignore the capability and the hypercall services
    will be exposed unconditionally to the guests, thus ensuring backward
    compatibility.

    Since these registers, including the old ones such as
    KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_[1|2] maintain its state per-VM. Thus
    accessing them via KVM_[GET|SET]_ONE_REG for every vCPU is redundant.
    To optimize this, the series also introduces the capability
    KVM_CAP_ARM_REG_SCOPE. If enabled, KVM_GET_REG_LIST will advertise the
    registers that are VM-scoped by dynamically modifying the register
    encoding. KVM_REG_ARM_SCOPE_* helper macros are introduced to decode
    the same. By learning this, userspace can access such registers only once.

    The patches are based off of mainline kernel 5.17-rc5, with the selftest
    patches from [2] applied.

    Patch-1 factors out the non-PSCI related interface from psci.c to
    hypercalls.c, as the series would extend the list in the upcoming
    patches.

    Patch-2 introduces the KVM_CAP_ARM_REG_SCOPE capability.

    Patch-3 provides helpers to encode existing registers withe the scope
    information. The only users in the patch would be the registers,
    KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_[1|2]

    Patch-4 tracks if the VM has started running, which would be used in the
    upcoming patches.

    Patch-5 sets up the framework for the bitmap firmware psuedo-registers.
    It includes read/write helpers for the registers, and a helper to check
    if a particular hypercall service is supported for the guest.
    It also adds the register KVM_REG_ARM_STD_HYP_BMAP to support ARM's
    standard secure services.

    Patch-6 introduces the firmware register, KVM_REG_ARM_STD_HYP_BMAP,
    which holds the standard hypervisor services (such as PV_TIME).

    Patch-7 introduces the firmware register, KVM_REG_ARM_VENDOR_HYP_BMAP,
    which holds the vendor specific hypercall services.

    Patch-8,9 Add the necessary documentation for the newly added firmware
    registers.

    Patch-10 imports the SMCCC definitions from linux/arm-smccc.h into tools/
    for further use in selftests.

    Patch-11,12 adds the selftest to test the guest (using 'hvc') and
    userspace interfaces (SET/GET_ONE_REG).

    Patch-13 adds these firmware registers into the get-reg-list selftest.

    [1]: https://lore.kernel.org/kvmarm/874kbcpmlq.wl-maz@kernel.org/T/
    [2]: https://lore.kernel.org/kvmarm/YUzgdbYk8BeCnHyW@google.com/

    Regards,
    Raghavendra

    v3 -> v4

    Addressed comments and took suggestions by Reiji, Oliver, Marc,
    Sean and Jim:

    - Renamed and moved the VM has run once check to arm64.
    - Introduced the capability to dynamically modify the register
    encodings to include the scope information.
    - Replaced mutex_lock with READ_ONCE and WRITE_ONCE when the
    bitmaps are accessed.
    - The hypercalls selftest re-runs with KVM_CAP_ARM_REG_SCOPE
    enabled.

    v2 -> v3

    Addressed comments by Marc and Andrew:

    - Dropped kvm_vcpu_has_run_once() implementation.
    - Redifined kvm_vm_has_run_once() as kvm_vm_has_started() in the core
    KVM code that introduces a new field, 'vm_started', to track this.
    - KVM_CAP_ARM_HVC_FW_REG_BMAP returns the number of psuedo-firmware
    bitmap registers upon a 'read'. Support for 'write' removed.
    - Removed redundant spinlock, 'fw_reg_bmap_enabled' fields from the
    hypercall descriptor structure.
    - A separate sub-struct to hold the bitmap info is removed. The bitmap
    info is directly stored in the hypercall descriptor structure
    (struct kvm_hvc_desc).

    v1 -> v2

    Addressed comments by Oliver (thanks!):

    - Introduced kvm_vcpu_has_run_once() and kvm_vm_has_run_once() in the
    core kvm code, rather than relying on ARM specific
    vcpu->arch.has_run_once.
    - Writing to KVM_REG_ARM_PSCI_VERSION is done in hypercalls.c itself,
    rather than separating out to psci.c.
    - Introduced KVM_CAP_ARM_HVC_FW_REG_BMAP to enable the extension.
    - Tracks the register accesses from VMM to decide whether to sanitize
    a register or not, as opposed to sanitizing upon the first 'write'
    in v1.
    - kvm_hvc_call_supported() is implemented using a direct switch-case
    statement, instead of looping over all the registers to pick the
    register for the function-id.
    - Replaced the register bit definitions with #defines, instead of enums.
    - Removed the patch v1-06/08 that imports the firmware register
    definitions as it's not needed.
    - Separated out the documentations in its own patch, and the renaming
    of hypercalls.rst to psci.rst into another patch.
    - Add the new firmware registers to get-reg-list KVM selftest.

    v1: https://lore.kernel.org/kvmarm/20211102002203.1046069-1-rananta@google.com/
    v2: https://lore.kernel.org/kvmarm/20211113012234.1443009-1-rananta@google.com/
    v3: https://lore.kernel.org/linux-arm-kernel/20220104194918.373612-1-rananta@google.com/

    Raghavendra Rao Ananta (13):
    KVM: arm64: Factor out firmware register handling from psci.c
    KVM: arm64: Introduce KVM_CAP_ARM_REG_SCOPE
    KVM: arm64: Encode the scope for firmware registers
    KVM: arm64: Capture VM's first run
    KVM: arm64: Setup a framework for hypercall bitmap firmware registers
    KVM: arm64: Add standard hypervisor firmware register
    KVM: arm64: Add vendor hypervisor firmware register
    Docs: KVM: Add doc for the bitmap firmware registers
    Docs: KVM: Rename psci.rst to hypercalls.rst
    tools: Import ARM SMCCC definitions
    selftests: KVM: aarch64: Introduce hypercall ABI test
    selftests: KVM: aarch64: hypercalls: Test with KVM_CAP_ARM_REG_SCOPE
    selftests: KVM: aarch64: Add the bitmap firmware registers to
    get-reg-list

    Documentation/virt/kvm/api.rst | 16 +
    Documentation/virt/kvm/arm/hypercalls.rst | 124 +++++
    Documentation/virt/kvm/arm/psci.rst | 77 ---
    arch/arm64/include/asm/kvm_host.h | 30 ++
    arch/arm64/include/uapi/asm/kvm.h | 22 +
    arch/arm64/kvm/arm.c | 23 +-
    arch/arm64/kvm/guest.c | 82 +++-
    arch/arm64/kvm/hypercalls.c | 301 +++++++++++-
    arch/arm64/kvm/psci.c | 166 -------
    include/kvm/arm_hypercalls.h | 17 +
    include/kvm/arm_psci.h | 7 -
    include/uapi/linux/kvm.h | 1 +
    tools/include/linux/arm-smccc.h | 188 ++++++++
    tools/testing/selftests/kvm/.gitignore | 1 +
    tools/testing/selftests/kvm/Makefile | 1 +
    .../selftests/kvm/aarch64/get-reg-list.c | 3 +
    .../selftests/kvm/aarch64/hypercalls.c | 443 ++++++++++++++++++
    17 files changed, 1243 insertions(+), 259 deletions(-)
    create mode 100644 Documentation/virt/kvm/arm/hypercalls.rst
    delete mode 100644 Documentation/virt/kvm/arm/psci.rst
    create mode 100644 tools/include/linux/arm-smccc.h
    create mode 100644 tools/testing/selftests/kvm/aarch64/hypercalls.c

    --
    2.35.1.473.g83b2b277ed-goog

    \
     
     \ /
      Last update: 2022-02-24 18:26    [W:3.340 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site