If userspace creates a PMU for the VCPU, but doesn't create an in-kernel irqchip, then we end up in a nasty path where we try to take an uninitialized spinlock, which can lead to all sorts of breakages. Luckily, QEMU always creates the VGIC before the PMU, so we can establish this as ABI and check for the VGIC in the PMU init stage. This can be relaxed at a later time if we want to support PMU with a userspace irqchip. Cc: stable@vger.kernel.org Cc: Shannon Zhao <shannon.zhao@linaro.org> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
36 lines
1.5 KiB
Plaintext
36 lines
1.5 KiB
Plaintext
Generic vcpu interface
|
|
====================================
|
|
|
|
The virtual cpu "device" also accepts the ioctls KVM_SET_DEVICE_ATTR,
|
|
KVM_GET_DEVICE_ATTR, and KVM_HAS_DEVICE_ATTR. The interface uses the same struct
|
|
kvm_device_attr as other devices, but targets VCPU-wide settings and controls.
|
|
|
|
The groups and attributes per virtual cpu, if any, are architecture specific.
|
|
|
|
1. GROUP: KVM_ARM_VCPU_PMU_V3_CTRL
|
|
Architectures: ARM64
|
|
|
|
1.1. ATTRIBUTE: KVM_ARM_VCPU_PMU_V3_IRQ
|
|
Parameters: in kvm_device_attr.addr the address for PMU overflow interrupt is a
|
|
pointer to an int
|
|
Returns: -EBUSY: The PMU overflow interrupt is already set
|
|
-ENXIO: The overflow interrupt not set when attempting to get it
|
|
-ENODEV: PMUv3 not supported
|
|
-EINVAL: Invalid PMU overflow interrupt number supplied
|
|
|
|
A value describing the PMUv3 (Performance Monitor Unit v3) overflow interrupt
|
|
number for this vcpu. This interrupt could be a PPI or SPI, but the interrupt
|
|
type must be same for each vcpu. As a PPI, the interrupt number is the same for
|
|
all vcpus, while as an SPI it must be a separate number per vcpu.
|
|
|
|
1.2 ATTRIBUTE: KVM_ARM_VCPU_PMU_V3_INIT
|
|
Parameters: no additional parameter in kvm_device_attr.addr
|
|
Returns: -ENODEV: PMUv3 not supported
|
|
-ENXIO: PMUv3 not properly configured as required prior to calling this
|
|
attribute
|
|
-EBUSY: PMUv3 already initialized
|
|
|
|
Request the initialization of the PMUv3. This must be done after creating the
|
|
in-kernel irqchip. Creating a PMU with a userspace irqchip is currently not
|
|
supported.
|