From: Gavin Shan <gshan@redhat.com>
To: kvmarm@lists.cs.columbia.edu
Cc: maz@kernel.org, linux-kernel@vger.kernel.org,
Jonathan.Cameron@huawei.com, pbonzini@redhat.com,
will@kernel.org
Subject: [PATCH v4 00/21] Support SDEI Virtualization
Date: Sun, 15 Aug 2021 08:13:31 +0800 [thread overview]
Message-ID: <20210815001352.81927-1-gshan@redhat.com> (raw)
This series intends to virtualize Software Delegated Exception Interface
(SDEI), which is defined by DEN0054A. It allows the hypervisor to deliver
NMI-alike event to guest and it's needed by asynchronous page fault to
deliver page-not-present notification from hypervisor to guest. The code
and the required qemu changes can be found from:
https://developer.arm.com/documentation/den0054/latest
https://github.com/gwshan/linux ("kvm/arm64_sdei")
https://github.com/gwshan/qemu ("kvm/arm64_sdei")
The SDEI event is identified by a 32-bits number. Bits[31:24] are used
to indicate the SDEI event properties while bits[23:0] are identifying
the unique number. The implementation takes bits[23:22] to indicate the
owner of the SDEI event. For example, those SDEI events owned by KVM
should have these two bits set to 0b01. Besides, the implementation
supports SDEI events owned by KVM only.
The design is pretty straightforward and the implementation is just
following the SDEI specification, to support the defined SMCCC intefaces,
except the IRQ binding stuff. There are several data structures introduced.
Some of the objects have to be migrated by VMM. So their definitions are
split up for VMM to include the corresponding states for migration.
struct kvm_sdei_kvm
Associated with VM and used to track the KVM exposed SDEI events
and those registered by guest.
struct kvm_sdei_vcpu
Associated with vCPU and used to track SDEI event delivery. The
preempted context is saved prior to the delivery and restored
after that.
struct kvm_sdei_event
SDEI events exposed by KVM so that guest can register and enable.
struct kvm_sdei_kvm_event
SDEI events that have been registered by guest.
struct kvm_sdei_vcpu_event
SDEI events that have been queued to specific vCPU for delivery.
The series is organized as below:
PATCH[01] Introduces template for smccc_get_argx()
PATCH[02] Introduces the data structures and infrastructure
PATCH[03-14] Supports various SDEI related hypercalls
PATCH[15] Supports SDEI event notification
PATCH[16-17] Introduces ioctl command for migration
PATCH[18-19] Supports SDEI event injection and cancellation
PATCH[20] Exports SDEI capability
PATCH[21] Adds self-test case for SDEI virtualization
Testing
=======
There are additional patches in the following repositories to create
procfs entries, allowing inject SDEI event and test driver in the guest
to handle the SDEI event. Besides, the additional QEMU changes are needed
so that guest can detect the SDEI service through ACPI table.
https://github.com/gwshan/linux ("kvm/arm64_sdei")
https://github.com/gwshan/qemu ("kvm/arm64_sdei")
The SDEI event is received and handled in the guest after it's injected
through the procfs entries from host side.
host# /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64 \
-accel kvm -machine virt,gic-version=host \
-cpu host -smp 8,sockets=2,cores=4,threads=1 -m 1024M \
: \
-kernel /home/gavin/sandbox/linux.guest/arch/arm64/boot/Image \
-initrd /home/gavin/sandbox/images/rootfs.cpio.xz \
-append 'earlycon=pl011,mmio,0x9000000'
host# echo > /proc/kvm/kvm-10842/vcpu-0
guest# =========== SDEI Event (CPU#0) ===========
num=0x40400000, arg=0xdabfdabf
SP: 0xffff800011613e90 PC: 0x0 pState: 0x0
Regs:
000000000002ac4 ffff00001ff947a0 0000000000002ac2 ffff00001ff976c0
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 ffff80001121a000
ffff8000116199e0 ffff800011619ad8 ffff80001122d8b8 ffff800011619afc
0000000000000000 0000000000000000 ffff800011622140 ffff800011150108
00000000582c0018 ffff800011613e90 ffff800010bd0248
Query context:
x[00]: 0000000000002ac4 errno: 0
x[01]: ffff00001ff947a0 errno: 0
:
x[18]: ffff800010bd01d8 errno: 0
x[19]: fffffffffffffffe errno: -22
x[20]: fffffffffffffffe errno: -22
:
x[30]: fffffffffffffffe errno: -22
host# echo > /proc/kvm/kvm-10842/vcpu-7
guest# =========== SDEI Event (CPU#7) ===========
num=0x40400000, arg=0xdabfdabf
SP: 0xffff800011b73f20 PC: 0x0 pState: 0x0
Regs:
00000000000010d0 ffff00003fde07a0 00000000000010ce 7fffffff1999999a
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 ffff80001121a000
ffff8000116199e0 ffff800011619ad8 ffff80001122d8b8 ffff800011619afc
0000000000000000 0000000000000000 ffff000020032ac0 0000000000000000
0000000000000000 ffff800011b73f20 ffff800010bd0248
Query context:
x[00]: 00000000000010d0 errno: 0
x[01]: ffff00003fde07a0 errno: 0
:
x[18]: ffff800010bd01d8 errno: 0
x[19]: fffffffffffffffe errno: -22
:
x[30]: fffffffffffffffe errno: -22
Changelog
=========
v4:
* Rebased to v5.14.rc5 (Gavin)
v3:
* Rebased to v5.13.rc1 (Gavin)
* Use linux data types in kvm_sdei.h (Gavin)
v2:
* Rebased to v5.11.rc6 (Gavin)
* Dropped changes related to SDEI client driver (Gavin)
* Removed support for passthrou SDEI events (Gavin)
* Redesigned data structures (Gavin)
* Implementation is almost rewritten as the data structures
are totally changed (Gavin)
* Added ioctl commands to support migration (Gavin)
Gavin Shan (21):
KVM: arm64: Introduce template for inline functions
KVM: arm64: Add SDEI virtualization infrastructure
KVM: arm64: Support SDEI_VERSION hypercall
KVM: arm64: Support SDEI_EVENT_REGISTER hypercall
KVM: arm64: Support SDEI_EVENT_{ENABLE, DISABLE} hypercall
KVM: arm64: Support SDEI_EVENT_CONTEXT hypercall
KVM: arm64: Support SDEI_EVENT_UNREGISTER hypercall
KVM: arm64: Support SDEI_EVENT_STATUS hypercall
KVM: arm64: Support SDEI_EVENT_GET_INFO hypercall
KVM: arm64: Support SDEI_EVENT_ROUTING_SET hypercall
KVM: arm64: Support SDEI_PE_{MASK, UNMASK} hypercall
KVM: arm64: Support SDEI_{PRIVATE, SHARED}_RESET hypercall
KVM: arm64: Impment SDEI event delivery
KVM: arm64: Support SDEI_EVENT_{COMPLETE, COMPLETE_AND_RESUME}
hypercall
KVM: arm64: Support SDEI event notifier
KVM: arm64: Support SDEI ioctl commands on VM
KVM: arm64: Support SDEI ioctl commands on vCPU
KVM: arm64: Support SDEI event injection
KVM: arm64: Support SDEI event cancellation
KVM: arm64: Export SDEI capability
KVM: selftests: Add SDEI test case
arch/arm64/include/asm/kvm_emulate.h | 1 +
arch/arm64/include/asm/kvm_host.h | 8 +
arch/arm64/include/asm/kvm_sdei.h | 136 ++
arch/arm64/include/uapi/asm/kvm.h | 1 +
arch/arm64/include/uapi/asm/kvm_sdei.h | 86 ++
arch/arm64/kvm/Makefile | 2 +-
arch/arm64/kvm/arm.c | 19 +
arch/arm64/kvm/hyp/exception.c | 7 +
arch/arm64/kvm/hypercalls.c | 18 +
arch/arm64/kvm/inject_fault.c | 27 +
arch/arm64/kvm/sdei.c | 1519 ++++++++++++++++++++
include/kvm/arm_hypercalls.h | 34 +-
include/uapi/linux/kvm.h | 4 +
tools/testing/selftests/kvm/Makefile | 1 +
tools/testing/selftests/kvm/aarch64/sdei.c | 171 +++
15 files changed, 2014 insertions(+), 20 deletions(-)
create mode 100644 arch/arm64/include/asm/kvm_sdei.h
create mode 100644 arch/arm64/include/uapi/asm/kvm_sdei.h
create mode 100644 arch/arm64/kvm/sdei.c
create mode 100644 tools/testing/selftests/kvm/aarch64/sdei.c
--
2.23.0
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
next reply other threads:[~2021-08-15 0:14 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-15 0:13 Gavin Shan [this message]
2021-08-15 0:13 ` [PATCH v4 01/21] KVM: arm64: Introduce template for inline functions Gavin Shan
2021-11-09 15:26 ` Eric Auger
2022-01-11 7:52 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 02/21] KVM: arm64: Add SDEI virtualization infrastructure Gavin Shan
2021-11-09 15:45 ` Eric Auger
2022-01-11 9:20 ` Gavin Shan
2022-01-27 13:17 ` Eric Auger
2022-01-11 9:40 ` Shannon Zhao
2022-01-13 7:09 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 03/21] KVM: arm64: Support SDEI_VERSION hypercall Gavin Shan
2021-11-09 15:26 ` Eric Auger
2022-01-11 9:25 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 04/21] KVM: arm64: Support SDEI_EVENT_REGISTER hypercall Gavin Shan
2021-11-09 15:50 ` Eric Auger
2022-01-12 2:19 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 05/21] KVM: arm64: Support SDEI_EVENT_{ENABLE, DISABLE} hypercall Gavin Shan
2021-11-09 16:02 ` Eric Auger
2022-01-12 2:29 ` Gavin Shan
2022-01-25 18:23 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 06/21] KVM: arm64: Support SDEI_EVENT_CONTEXT hypercall Gavin Shan
2021-11-10 11:16 ` Eric Auger
2022-01-12 2:33 ` Gavin Shan
2022-01-25 18:29 ` Eric Auger
2022-01-11 9:43 ` Shannon Zhao
2022-01-13 7:02 ` Gavin Shan
2022-01-13 7:13 ` Gavin Shan
2022-01-25 18:32 ` Eric Auger
2022-01-25 18:31 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 07/21] KVM: arm64: Support SDEI_EVENT_UNREGISTER hypercall Gavin Shan
2021-11-09 17:05 ` Eric Auger
2022-01-12 2:38 ` Gavin Shan
2022-01-25 18:42 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 08/21] KVM: arm64: Support SDEI_EVENT_STATUS hypercall Gavin Shan
2021-11-09 17:12 ` Eric Auger
2022-01-12 2:40 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 09/21] KVM: arm64: Support SDEI_EVENT_GET_INFO hypercall Gavin Shan
2021-11-09 17:19 ` Eric Auger
2022-01-12 2:46 ` Gavin Shan
2022-01-27 14:19 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 10/21] KVM: arm64: Support SDEI_EVENT_ROUTING_SET hypercall Gavin Shan
2021-11-09 18:47 ` Eric Auger
2022-01-12 2:54 ` Gavin Shan
2022-01-27 14:13 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 11/21] KVM: arm64: Support SDEI_PE_{MASK, UNMASK} hypercall Gavin Shan
2021-11-09 20:31 ` Eric Auger
2022-01-12 2:58 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 12/21] KVM: arm64: Support SDEI_{PRIVATE, SHARED}_RESET hypercall Gavin Shan
2021-11-09 20:37 ` Eric Auger
2022-01-12 3:01 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 13/21] KVM: arm64: Impment SDEI event delivery Gavin Shan
2021-11-10 10:58 ` Eric Auger
2022-01-12 6:34 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 14/21] KVM: arm64: Support SDEI_EVENT_{COMPLETE, COMPLETE_AND_RESUME} hypercall Gavin Shan
2021-11-10 10:58 ` Eric Auger
2022-01-12 6:43 ` Gavin Shan
2022-01-27 14:47 ` Eric Auger
2022-01-27 15:20 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 15/21] KVM: arm64: Support SDEI event notifier Gavin Shan
2021-11-10 11:35 ` Eric Auger
2022-01-12 6:48 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 16/21] KVM: arm64: Support SDEI ioctl commands on VM Gavin Shan
2021-11-10 13:48 ` Eric Auger
2022-01-12 7:03 ` Gavin Shan
2022-01-27 13:48 ` Eric Auger
2021-08-15 0:13 ` [PATCH v4 17/21] KVM: arm64: Support SDEI ioctl commands on vCPU Gavin Shan
2021-08-15 0:13 ` [PATCH v4 18/21] KVM: arm64: Support SDEI event injection Gavin Shan
2021-11-10 14:05 ` Eric Auger
2022-01-12 7:12 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 19/21] KVM: arm64: Support SDEI event cancellation Gavin Shan
2021-11-10 14:09 ` Eric Auger
2022-01-12 7:19 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 20/21] KVM: arm64: Export SDEI capability Gavin Shan
2021-11-10 13:55 ` Eric Auger
2022-01-12 7:20 ` Gavin Shan
2021-08-15 0:13 ` [PATCH v4 21/21] KVM: selftests: Add SDEI test case Gavin Shan
2021-08-15 0:19 ` [PATCH v4 00/21] Support SDEI Virtualization Gavin Shan
2021-11-10 14:29 ` Eric Auger
2022-01-12 7:24 ` Gavin Shan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210815001352.81927-1-gshan@redhat.com \
--to=gshan@redhat.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=pbonzini@redhat.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).