On Wed, 10 Apr 2024 18:54:37 +0100,
Colton Lewis <coltonlewis@xxxxxxxxxx> wrote:
+
+enum kvm_interrupt_passthrough {
+ KVM_INTERRUPT_PASSTHROUGH_DEFAULT,
+ KVM_INTERRUPT_PASSTHROUGH_ALWAYS,
+ KVM_INTERRUPT_PASSTHROUGH_NEVER,
What does this mean? This is not dealing with interrupts, this is
supposed to deal with the behaviour of specific instructions
(WFI/WFE). The notion of "passthrough" is really odd as well. Finally,
both ALWAYS and NEVER are wrong -- the architecture makes no such
guarantee.
- if (single_task_running())
+ if ((kvm_interrupt_passthrough == KVM_INTERRUPT_PASSTHROUGH_ALWAYS
+ && kvm_vgic_global_state.has_gicv4) ||
+ (kvm_interrupt_passthrough == KVM_INTERRUPT_PASSTHROUGH_DEFAULT
+ && single_task_running()))
Why is this affecting both WFI and WFE? They are very different and
lumping them together makes little sense.
@@ -2654,6 +2658,30 @@ static int __init early_kvm_mode_cfg(char *arg)
}
early_param("kvm-arm.mode", early_kvm_mode_cfg);
+static int __init early_kvm_interrupt_passthrough_cfg(char *arg)
+{
+ if (!arg)
+ return -EINVAL;
+
+ if (strcmp(arg, "always") == 0) {
+ kvm_interrupt_passthrough = KVM_INTERRUPT_PASSTHROUGH_ALWAYS;
+ return 0;
+ }
+
+ if (strcmp(arg, "never") == 0) {
+ kvm_interrupt_passthrough = KVM_INTERRUPT_PASSTHROUGH_NEVER;
+ return 0;
+ }
+
+ if (strcmp(arg, "default") == 0) {
+ kvm_interrupt_passthrough = KVM_INTERRUPT_PASSTHROUGH_DEFAULT;
+ return 0;
+ }
+
+ return -EINVAL;
+}
+early_param("kvm-arm.interrupt-passthrough", early_kvm_interrupt_passthrough_cfg);
+
Again, this is not dealing with interrupts. This is dealing with the
*potential* trapping of instructions in certain circumstances.
enum kvm_mode kvm_get_mode(void)
{
return kvm_mode;
Finally, this needs to be documented.