linux/arch/arm64
Raghavendra Rao Ananta 05714cab7d KVM: arm64: Setup a framework for hypercall bitmap firmware registers
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: Raghavendra Rao Ananta <rananta@google.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
[maz: reduced the scope of some helpers, tidy-up bitmap max values,
 dropped error-only fast path]
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220502233853.1233742-3-rananta@google.com
2022-05-03 21:30:19 +01:00
..
boot arm64: dts: qcom/sdm845-shift-axolotl: Fix boolean properties with values 2022-04-14 22:52:17 +02:00
configs ARM: DT updates for 5.18 2022-03-23 18:37:22 -07:00
crypto crypto: arm64 - cleanup comments 2022-03-09 15:12:32 +12:00
hyperv arm64: hyperv: Initialize hypervisor on boot 2021-08-04 16:54:36 +00:00
include KVM: arm64: Setup a framework for hypercall bitmap firmware registers 2022-05-03 21:30:19 +01:00
kernel arm64: Add part number for Arm Cortex-A78AE 2022-04-08 11:46:46 +01:00
kvm KVM: arm64: Setup a framework for hypercall bitmap firmware registers 2022-05-03 21:30:19 +01:00
lib Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 2022-03-21 16:02:36 -07:00
mm arm64: fix typos in comments 2022-04-04 10:32:50 +01:00
net kasan, arm64: don't tag executable vmalloc allocations 2022-03-24 19:06:48 -07:00
tools Merge branch 'for-next/spectre-bhb' into for-next/core 2022-03-14 19:08:31 +00:00
xen xen: allow pv-only hypercalls only with CONFIG_XEN_PV 2021-11-02 08:11:01 -05:00
Kbuild kbuild: use more subdir- for visiting subdirectories while cleaning 2021-10-24 13:49:46 +09:00
Kconfig Char/Misc and other driver updates for 5.18-rc1 2022-03-28 12:27:35 -07:00
Kconfig.debug
Kconfig.platforms ARM: DT updates for 5.18 2022-03-23 18:37:22 -07:00
Makefile arm64/xor: use EOR3 instructions when available 2021-12-14 12:14:26 +00:00