All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Steffen Eiden" <seiden@linux.ibm.com>
Cc: "Alexander Gordeev" <agordeev@linux.ibm.com>,
	linux-s390@vger.kernel.org, "Oliver Upton" <oupton@kernel.org>,
	kvmarm@lists.linux.dev, "Heiko Carstens" <hca@linux.ibm.com>,
	"Vasily Gorbik" <gor@linux.ibm.com>,
	"Marc Zyngier" <maz@kernel.org>,
	kvm@vger.kernel.org
Subject: Re: [PATCH v4 25/27] KVM: s390: arm64: Implement vCPU IOCTLs
Date: Mon, 06 Jul 2026 10:16:41 +0000	[thread overview]
Message-ID: <20260706101643.69DCC1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260706085229.979525-26-seiden@linux.ibm.com>

Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider:
- [High] Guest vector registers are not properly reset when KVM_REQ_VCPU_RESET is processed during the KVM_RUN loop.
- [High] Userspace-reachable WARN_ONCE during validity intercept handling allows unprivileged processes to taint or panic the kernel.
- [High] Executing local_irq_enable() while in an RCU extended quiescent state (EQS) triggers lockdep warnings and system crashes.
- [High] Guest PC increment is overwritten and lost due to calling `adjust_pc` before `vcpu_put`.
- [High] Missing `vcpu_load()` and `vcpu_put()` around KVM IOCTLs modifying architectural state.
- [Medium] KVM_GET_REG_LIST ioctl returns a positive integer instead of 0 on success.
- [Medium] KVM_ARM_VCPU_FINALIZE ioctl unconditionally returns 0, failing to reject unrecognized features.
--

commit 13eb2c521ea373c254d3f7904b5979dc114e1d21
Author: Steffen Eiden <seiden@linux.ibm.com>
Subject: KVM: s390: arm64: Implement vCPU IOCTLs

Implement all vCPU IOCTLs.

> diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c
> --- a/arch/s390/kvm/arm64/arm.c
> +++ b/arch/s390/kvm/arm64/arm.c
[ ... ]
> @@ -375,6 +375,18 @@ static void arm_vcpu_run(struct kvm_vcpu *vcpu)
>  {
>  	struct kvm_sae_block *sae_block = &vcpu->arch.sae_block;
>  
>  	adjust_pc(vcpu);
>  
>  	local_irq_disable();
>  	guest_enter_irqoff();
>  	local_irq_enable();

[Severity: High]
Could enabling interrupts immediately after entering the guest context
trigger an RCU-idle splat?

guest_enter_irqoff() places the CPU into an RCU extended quiescent state
(EQS). Calling local_irq_enable() inside this state violates the API
contract since it makes the kernel preemptible while RCU is not watching,
which can lead to lockdep warnings and system stalls.

[ ... ]
> @@ -396,6 +408,61 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
>  {
>  	DECLARE_KERNEL_FPU_ONSTACK32(fpu_save);
>  	struct kvm_run *kvm_run = vcpu->run;
>  	int ret;
[ ... ]
>  	kernel_fpu_begin(&fpu_save, KERNEL_FPC | KERNEL_VXR);
>  	load_vx_regs((vcpu->arch.ctxt.vregs));
>  
>  	if (!vcpu->wants_to_run) {
>  		ret = -EINTR;
>  		goto out;
>  	}
>  
>  	kvm_sigset_activate(vcpu);
>  
>  	might_fault();
>  
>  	ret = 1;
>  	do {
[ ... ]
>  		if (ret > 0)
>  			ret = check_vcpu_requests(vcpu);

[Severity: High]
If a KVM_REQ_VCPU_RESET is pending and processed by check_vcpu_requests(),
the memory copy of the core registers is zeroed out by kvm_reset_vcpu().
However, the hardware CPU vector registers were already loaded before the
loop via load_vx_regs().

When the loop exits, won't save_vx_regs() copy the stale hardware state back
into memory, completely overriding the reset we just performed?

[ ... ]
>  		arm_vcpu_run(vcpu);
>  
>  		ret = handle_exit(vcpu);
>  
>  	} while (ret > 0);
>  
>  	kvm_sigset_deactivate(vcpu);
>  out:
>  	if (unlikely(vcpu_get_flag(vcpu, INCREMENT_PC)))
>  		adjust_pc(vcpu);
>  
>  	save_vx_regs(vcpu->arch.ctxt.vregs);
>  	kernel_fpu_end(&fpu_save, KERNEL_FPC | KERNEL_VXR);
>  	vcpu_put(vcpu);

[Severity: High]
Does this sequence overwrite the PC increment?

adjust_pc() modifies the PC in the vCPU's memory state, but the immediate
subsequent call to vcpu_put() executes the stiasrm hardware instruction.
This dumps the current internal hardware register state (with the
un-incremented PC) into the exact same memory save area.

Could this permanently overwrite the software increment and cause infinite
guest execution loops?

[ ... ]
> @@ -463,6 +530,95 @@ long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long ar
>  {
>  	struct kvm_vcpu *vcpu = filp->private_data;
>  	void __user *argp = (void __user *)arg;
>  	struct kvm_device_attr attr;
>  	int ret;
>  
>  	switch (ioctl) {

[Severity: High]
Are we missing calls to vcpu_load() and vcpu_put() around these IOCTLs?

Operations like KVM_SET_ONE_REG and KVM_ARM_VCPU_INIT directly modify or
read the vCPU architectural state. The KVM subsystem mandates that IOCTLs
modifying architectural state must use these wrappers to manage vCPU
attachment.

Without them, could this lead to hardware state synchronization issues or
leaked preempt notifiers?

[ ... ]
>  	case KVM_GET_REG_LIST: {
>  		struct kvm_reg_list __user *user_list = argp;
>  		struct kvm_reg_list reg_list;
>  		unsigned int n;
[ ... ]
>  		n = reg_list.n;
>  		reg_list.n = kvm_arm_num_regs(vcpu);
>  		if (copy_to_user(user_list, &reg_list, sizeof(reg_list)))
>  			break;
>  		ret = -E2BIG;
>  		if (n < reg_list.n)
>  			break;
>  		ret = kvm_arm_copy_reg_indices(vcpu, user_list->reg);
>  		break;
>  	}

[Severity: Medium]
Should this explicitly return 0 on success?

kvm_arm_copy_reg_indices() returns the positive number of registers copied.
Passing this positive count directly back to userspace goes against the KVM
ABI requirement that this ioctl returns 0 on success.

Could this cause userspace programs like QEMU to misinterpret a successful
call as an error?

[ ... ]
> diff --git a/arch/s390/kvm/arm64/handle_exit.c b/arch/s390/kvm/arm64/handle_exit.c
> --- a/arch/s390/kvm/arm64/handle_exit.c
> +++ b/arch/s390/kvm/arm64/handle_exit.c
[ ... ]
> @@ -55,6 +57,35 @@ exit_handle_fn arm_exit_handlers[] = {
>  	[ESR_ELx_EC_HVC64]	= handle_hvc,
>  };
>  
> +int handle_exit(struct kvm_vcpu *vcpu)
> +{
> +	u8 icptr = vcpu->arch.sae_block.icptr;
> +	int ret = 1;
> +
> +	switch (icptr) {
> +	case SAE_ICPTR_SPURIOUS:
> +		break;
> +	case SAE_ICPTR_VALIDITY:
> +		WARN_ONCE(true, "SAE: validity intercept. vir: 0x%04x",
> +			  vcpu->arch.sae_block.vir);
> +		ret = -EINVAL;
> +		break;

[Severity: High]
Is it safe to have a WARN_ONCE here?

Unprivileged host userspace can set arbitrary guest register states via
KVM_SET_ONE_REG prior to calling KVM_RUN. This allows a malicious userspace
process to intentionally construct an invalid CPU state that hardware
rejects.

Would this allow an unprivileged process to drive this warning condition and
create a host-side denial of service vector if panic_on_warn is enabled?

[ ... ]
> diff --git a/arch/s390/kvm/arm64/reset.c b/arch/s390/kvm/arm64/reset.c
> --- /dev/null
> +++ b/arch/s390/kvm/arm64/reset.c
[ ... ]
> +int kvm_arm_vcpu_finalize(struct kvm_vcpu *vcpu, int feature)
> +{
> +	return 0;
> +}

[Severity: Medium]
Should this validate the feature parameter instead of unconditionally
returning 0?

The KVM API specifies that finalizing an unsupported or invalid feature must
fail with -EINVAL or -EPERM. Returning 0 silently acknowledges invalid
feature finalizations.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260706085229.979525-1-seiden@linux.ibm.com?part=25

  reply	other threads:[~2026-07-06 10:16 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-06  8:52 [PATCH v4 00/27] KVM: s390: Introduce arm64 KVM Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 01/27] VFIO: take reference to the KVM module Steffen Eiden
2026-07-06  9:12   ` sashiko-bot
2026-07-06 19:53   ` Jason Gunthorpe
2026-07-06 21:12     ` Sean Christopherson
2026-07-07  7:39       ` Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 02/27] KVM, vfio: remove symbol_get(kvm_get_kvm_safe) from vfio Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 03/27] KVM, vfio: remove symbol_get(kvm_put_kvm) " Steffen Eiden
2026-07-06  9:25   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 04/27] KVM: Make device name configurable Steffen Eiden
2026-07-06  9:14   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 05/27] KVM: Remove KVM_MMIO as config option Steffen Eiden
2026-07-06 20:53   ` Marc Zyngier
2026-07-06  8:52 ` [PATCH v4 06/27] arm64: Use proper include variant Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 07/27] arm64: Prepare sharing arm64 headers with s390 Steffen Eiden
2026-07-06 21:22   ` Marc Zyngier
2026-07-06  8:52 ` [PATCH v4 08/27] KVM: arm64: Prepare sharing arm64 code " Steffen Eiden
2026-07-06  9:21   ` sashiko-bot
2026-07-06 21:28   ` Marc Zyngier
2026-07-07  7:20     ` Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 09/27] KVM: arm64: Access elements of vcpu_gp_regs individually Steffen Eiden
2026-07-06 17:44   ` Marc Zyngier
2026-07-06  8:52 ` [PATCH v4 10/27] KVM: arm64: Refactor core-reset into a separate function Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 11/27] s390: Use arm64 headers Steffen Eiden
2026-07-06  9:31   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 12/27] KVM: s390: Use arm64 code Steffen Eiden
2026-07-06  9:26   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 13/27] KVM: s390: Prepare KVM/s390 for a second KVM module Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 14/27] KVM: s390: Move s390 kvm code into a subdirectory Steffen Eiden
2026-07-06  9:35   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 15/27] KVM: S390: Prepare gmap for a second KVM implementation Steffen Eiden
2026-07-06  9:36   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 16/27] KVM: s390: gmap: Refactor storage key and CMMA code into separate files Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 17/27] KVM: s390: Refactor prefix handling into a separate file Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 18/27] KVM: s390: Prepare kvm-s390 for a second kvm module Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 19/27] s390: Introduce Start Arm Execution instruction Steffen Eiden
2026-07-06 11:17   ` Janosch Frank
2026-07-06 11:30     ` Christian Borntraeger
2026-07-06 11:58       ` Steffen Eiden
2026-07-06 11:53     ` Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 20/27] KVM: s390: arm64: Introduce host definitions Steffen Eiden
2026-07-06  8:52 ` [PATCH v4 21/27] s390/hwcaps: Report SAE support as hwcap Steffen Eiden
2026-07-06 11:50   ` Janosch Frank
2026-07-06  8:52 ` [PATCH v4 22/27] KVM: s390: Add basic arm64 kvm module Steffen Eiden
2026-07-06  9:51   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 23/27] KVM: s390: arm64: Implement required functions Steffen Eiden
2026-07-06  9:55   ` sashiko-bot
2026-07-06 12:15   ` Janosch Frank
2026-07-06 20:35   ` Marc Zyngier
2026-07-06  8:52 ` [PATCH v4 24/27] KVM: s390: arm64: Implement vm/vcpu create destroy Steffen Eiden
2026-07-06 10:04   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 25/27] KVM: s390: arm64: Implement vCPU IOCTLs Steffen Eiden
2026-07-06 10:16   ` sashiko-bot [this message]
2026-07-06  8:52 ` [PATCH v4 26/27] KVM: s390: arm64: Implement basic page fault handler Steffen Eiden
2026-07-06 10:03   ` sashiko-bot
2026-07-06  8:52 ` [PATCH v4 27/27] KVM: s390: arm64: Enable KVM_ARM64 config and Kbuild Steffen Eiden
2026-07-06 10:07   ` sashiko-bot

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=20260706101643.69DCC1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=agordeev@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-s390@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=oupton@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=seiden@linux.ibm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.