Skip to contentSkip to conversation

RISC-V: KVM: Fix sbiret init before forwarding to userspace

PATCH Applied Andrew Jones 3 participants 3 messages Aug 7, 2024 – Oct 1, 2024

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 RISC-V: KVM: Fix sbiret init before forwarding to userspace

When forwarding SBI calls to userspace ensure sbiret.error is initialized to SBI_ERR_NOT_SUPPORTED first, in case userspace neglects to set it to anything. If userspace neglects it then we can't be sure it did anything else either, so we just report it didn't do or try anything. Just init sbiret.value to zero, which is the preferred value to return when nothing special is specified.

KVM was already initializing both sbiret.error and sbiret.value, but the values used appear to come from a copy+paste of the __sbi_ecall() implementation, i.e. a0 and a1, which don't apply prior to the call being executed, nor at all when forwarding to userspace.

Fixes dea8ee31a039 ("RISC-V: KVM: Add SBI v0.1 support")
---
 arch/riscv/kvm/vcpu_sbi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/kvm/vcpu_sbi.c +2 -2
index 62f409d4176e..7de128be8db9 100644
@@ -127,8 +127,8 @@ void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run)
 	run->riscv_sbi.args[3] = cp->a3;
 	run->riscv_sbi.args[4] = cp->a4;
 	run->riscv_sbi.args[5] = cp->a5;
-	run->riscv_sbi.ret[0] = cp->a0;
-	run->riscv_sbi.ret[1] = cp->a1;
+	run->riscv_sbi.ret[0] = SBI_ERR_NOT_SUPPORTED;
+	run->riscv_sbi.ret[1] = 0;
 }
 
 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
Signature · 1 line
2.45.2
#1 lore raw
Quoted 8 lines · On Wed, Aug 7, 2024 at 9:19?PM Andrew Jones <[email protected]> wrote:

When forwarding SBI calls to userspace ensure sbiret.error is initialized to SBI_ERR_NOT_SUPPORTED first, in case userspace neglects to set it to anything. If userspace neglects it then we can't be sure it did anything else either, so we just report it didn't do or try anything. Just init sbiret.value to zero, which is the preferred value to return when nothing special is specified.

Quoted 7 lines

KVM was already initializing both sbiret.error and sbiret.value, but the values used appear to come from a copy+paste of the __sbi_ecall() implementation, i.e. a0 and a1, which don't apply prior to the call being executed, nor at all when forwarding to userspace.

Fixes dea8ee31a039 ("RISC-V: KVM: Add SBI v0.1 support")

Queued this patch for Linux-6.11 fixes.

Thanks,
Anup

Quoted 23 lines
---
 arch/riscv/kvm/vcpu_sbi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/kvm/vcpu_sbi.c +2 -3
index 62f409d4176e..7de128be8db9 100644
@@ -127,8 +127,8 @@ void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run)
        run->riscv_sbi.args[3] = cp->a3;
        run->riscv_sbi.args[4] = cp->a4;
        run->riscv_sbi.args[5] = cp->a5;
-       run->riscv_sbi.ret[0] = cp->a0;
-       run->riscv_sbi.ret[1] = cp->a1;
+       run->riscv_sbi.ret[0] = SBI_ERR_NOT_SUPPORTED;
+       run->riscv_sbi.ret[1] = 0;
 }
 
 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
--

2.45.2

#2 lore raw
In reply to Andrew Jones
This patch was applied to riscv/linux.git (fixes) by Anup Patel <[email protected]>:

Hello:

This patch was applied to riscv/linux.git (fixes)
by Anup Patel <[email protected]>:

Quoted 8 lines · On Wed, 7 Aug 2024 17:49:44 +0200 you wrote:

When forwarding SBI calls to userspace ensure sbiret.error is initialized to SBI_ERR_NOT_SUPPORTED first, in case userspace neglects to set it to anything. If userspace neglects it then we can't be sure it did anything else either, so we just report it didn't do or try anything. Just init sbiret.value to zero, which is the preferred value to return when nothing special is specified.

[...]

Here is the summary with links:
- RISC-V: KVM: Fix sbiret init before forwarding to userspace

    https://git.kernel.org/riscv/c/6b7b282e6bae

You are awesome, thank you!

Signature · 2 lines
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html