From nobody Tue Dec 16 15:12:06 2025 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F2CA2741B9 for ; Mon, 5 May 2025 21:39:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746481179; cv=none; b=DOOjFIA8dU1/oXBBELif4sKPw4cphBporQ8NecP4y9onkU+7ck/AJpgCBELGr5pddIv7JjAlsh/tDd6FM5Bg7RTFhxnldTOgjWM0O7qDpKzhsWIqcQNONZ6hO7Nu6YRmEEWZNz0ME22akG7WcI/cSMDwRMtwIEV1DqZwLh4B68M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746481179; c=relaxed/simple; bh=5PhR4Cke8yMwoA4uPKJBWa65xrmcQt00CtfyS9bPFCo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p3SVSMk2Xk3Cz4vOvwxPuXE3ySH4y0zOOhhZSm5/YhlDnQWaUmVaQ0FOqCQhSKGv07wN6FeHuTdD5gZqs9DtIAKR4myX0+jwY+MVATUegYa7wqAmFBXLJUQMX9NMvWR+2a5EVvQ44IrDEnq7Mv2pn6UpU6NEWmL6Ux4KV043Gm4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=Ohzy+g+6; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="Ohzy+g+6" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2241053582dso74327965ad.1 for ; Mon, 05 May 2025 14:39:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1746481177; x=1747085977; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=GuR/z1GpxuJ9rGb2JSweVgvKX4SVj6nkkUnTCjHYUz4=; b=Ohzy+g+6hZbJQLRJRHPr0TQ1O87bk+3sRgUZgcxEGSqaxMSjogksq+h3OWw88VRZVh 6Nsry3GiWf32vLrFmWfuuSh/HCHo6cr+QhyoNAT9SPhnM6Xbaj2hB4EAY2+zfeX3LDDC TrTFikHt0hzLHYFBwJ+yej6uVo/zPH6abIZqd40MIK13EzG3aPTaPCaVtGGfwEWBxIGM KXvx/YKEL91ea3kHPKRagtDf9f+ge5MFN95eQQhx3N9zrvTWx3eGgXy8lFnYteUBzicA EdK71MhRIsjs7ptcJ6p710nRUpWkJsabWNmsFOlHeJUR9wXoGQGuJ7CrSEL0X2Cz86v1 8BeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746481177; x=1747085977; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GuR/z1GpxuJ9rGb2JSweVgvKX4SVj6nkkUnTCjHYUz4=; b=kJ5DJA5iNHvuAUS5gsX0Ou/Yikdw4DdOsYCupNzh4wXc7mbkL0hTNItOZy52cXDR8a NJfE+NOOquXAmxAJwt9qnvrAd1v3oEBaHt7Tr3JtMMe3aj+BnMDyJcTslcfXZa4BvHHo ElAyXPqCZQVFXoTuwlAWSMoFcWPa63WjhNJxcCR02AdH4cQYiThjT9xEj2YhKg7aZQsk HC7fzOvnM7oeERSqG8IYucY2dwnkpmd6IqmLI3IR38vEzhaeaYG7fkaXdzRH8f3QcLe7 9m6Jnop2Qz/tH2k5okYoiWdm8/60y0BNe2U496c8RuwCRlOtyjPn2LI29uw4+lcM4vo6 qyIA== X-Forwarded-Encrypted: i=1; AJvYcCWfaW2P/jFgtEv5CAi9WhAGAzNOQUkEXT2TWJSwBuXznC3r56/80aheJmdSPJ9rn257hJVTx/O3S28Oz8I=@vger.kernel.org X-Gm-Message-State: AOJu0Yzc6ohxKIhE01Ro877bDg6+rdU+zfc3CCQ1OpQyw54t+/6QPEAw ba5YJIHXAaUYrD1vnlj6nJoxj56QvFebMtHOiC9QsrFUb9o0MYPWsCjp9xbZeiM= X-Gm-Gg: ASbGnctgoHFdSeIT5KjWVzreMwikj9kJn852rMv9eW9CMmyYb2L07yC8Pj0KikPaQQ/ uGuOS6ffev/wr3rJ6mwuymnp4GGO5RfqL6303kf9BkRiyj2/QcJ/k9WEDlrVH4UWpZiGwBSHWW5 I+dG2sH6bJDlTeVc+m/5FGdTxrOnc6URhmurf8UEBeRwuQmxf8krjF1ilkFDcKvcC77+CFiKAU9 YNyLYF7qWtwTZTjx6u8979uyfE2n+nEecpyeDlP/4ciGgcJv2tdk26yjugEW1od6rjvKl8mw98F 0rX8l8mth514lUHkk6mjO8ZR3tp/SGH2OLnKp2rENbjCcTo2li4faQ== X-Google-Smtp-Source: AGHT+IGhry+0GqEK0QENhdqzpXsxfdR/JgSEWuVPvlQK1RPcseXdT65lptZT2IHTz8U/93rQIvZwKw== X-Received: by 2002:a17:903:41cb:b0:220:e1e6:4472 with SMTP id d9443c01a7336-22e328cf92emr13304615ad.13.1746481177225; Mon, 05 May 2025 14:39:37 -0700 (PDT) Received: from atishp.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74058df12d8sm7388599b3a.78.2025.05.05.14.39.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 May 2025 14:39:36 -0700 (PDT) From: Atish Patra Date: Mon, 05 May 2025 14:39:26 -0700 Subject: [PATCH 1/5] RISC-V: KVM: Lazy enable hstateen IMSIC & ISEL bit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250505-kvm_lazy_enable_stateen-v1-1-3bfc4008373c@rivosinc.com> References: <20250505-kvm_lazy_enable_stateen-v1-0-3bfc4008373c@rivosinc.com> In-Reply-To: <20250505-kvm_lazy_enable_stateen-v1-0-3bfc4008373c@rivosinc.com> To: Anup Patel , Atish Patra , Paul Walmsley , Palmer Dabbelt , Alexandre Ghiti Cc: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Atish Patra X-Mailer: b4 0.15-dev-42535 Currently, we enable the smstateen bit at vcpu configure time by only checking the presence of required ISA extensions. These bits are not required to be enabled if the guest never uses the corresponding architectural state. Enable the smstaeen bits at runtime lazily upon first access. Signed-off-by: Atish Patra --- arch/riscv/include/asm/kvm_aia.h | 1 + arch/riscv/kvm/aia.c | 43 ++++++++++++++++++++++++++++++++++++= ++++ arch/riscv/kvm/aia_imsic.c | 8 ++++++++ 3 files changed, 52 insertions(+) diff --git a/arch/riscv/include/asm/kvm_aia.h b/arch/riscv/include/asm/kvm_= aia.h index 1f37b600ca47..760a1aef09f7 100644 --- a/arch/riscv/include/asm/kvm_aia.h +++ b/arch/riscv/include/asm/kvm_aia.h @@ -112,6 +112,7 @@ int kvm_riscv_aia_aplic_has_attr(struct kvm *kvm, unsig= ned long type); int kvm_riscv_aia_aplic_inject(struct kvm *kvm, u32 source, bool level); int kvm_riscv_aia_aplic_init(struct kvm *kvm); void kvm_riscv_aia_aplic_cleanup(struct kvm *kvm); +bool kvm_riscv_aia_imsic_state_hw_backed(struct kvm_vcpu *vcpu); =20 #ifdef CONFIG_32BIT void kvm_riscv_vcpu_aia_flush_interrupts(struct kvm_vcpu *vcpu); diff --git a/arch/riscv/kvm/aia.c b/arch/riscv/kvm/aia.c index 19afd1f23537..1e0d2217ade7 100644 --- a/arch/riscv/kvm/aia.c +++ b/arch/riscv/kvm/aia.c @@ -241,6 +241,8 @@ int kvm_riscv_vcpu_aia_rmw_topei(struct kvm_vcpu *vcpu, unsigned long new_val, unsigned long wr_mask) { + bool vsfile_present =3D kvm_riscv_aia_imsic_state_hw_backed(vcpu); + /* If AIA not available then redirect trap */ if (!kvm_riscv_aia_available()) return KVM_INSN_ILLEGAL_TRAP; @@ -249,6 +251,26 @@ int kvm_riscv_vcpu_aia_rmw_topei(struct kvm_vcpu *vcpu, if (!kvm_riscv_aia_initialized(vcpu->kvm)) return KVM_INSN_EXIT_TO_USER_SPACE; =20 + /* Continue if smstaeen is not present */ + if (!riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN)) + goto skip_hstateen; + + /* Enable the bit in hstateen0 lazily upon first access */ + if (!(vcpu->arch.cfg.hstateen0 & SMSTATEEN0_AIA_IMSIC)) { + vcpu->arch.cfg.hstateen0 |=3D SMSTATEEN0_AIA_IMSIC; + if (IS_ENABLED(CONFIG_32BIT)) + csr_set(CSR_HSTATEEN0H, SMSTATEEN0_AIA_IMSIC >> 32); + else + csr_set(CSR_HSTATEEN0, SMSTATEEN0_AIA_IMSIC); + if (vsfile_present) + return KVM_INSN_CONTINUE_SAME_SEPC; + } else if (vsfile_present) { + pr_err("Unexpected trap for CSR [%x] with hstateen0 enabled and valid vs= file\n", + csr_num); + return KVM_INSN_EXIT_TO_USER_SPACE; + } + +skip_hstateen: return kvm_riscv_vcpu_aia_imsic_rmw(vcpu, KVM_RISCV_AIA_IMSIC_TOPEI, val, new_val, wr_mask); } @@ -400,11 +422,32 @@ int kvm_riscv_vcpu_aia_rmw_ireg(struct kvm_vcpu *vcpu= , unsigned int csr_num, unsigned long wr_mask) { unsigned int isel; + bool vsfile_present =3D kvm_riscv_aia_imsic_state_hw_backed(vcpu); =20 /* If AIA not available then redirect trap */ if (!kvm_riscv_aia_available()) return KVM_INSN_ILLEGAL_TRAP; =20 + /* Continue if smstaeen is not present */ + if (!riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN)) + goto skip_hstateen; + + /* Enable the bit in hstateen0 lazily upon first access */ + if (!(vcpu->arch.cfg.hstateen0 & SMSTATEEN0_AIA_ISEL)) { + vcpu->arch.cfg.hstateen0 |=3D SMSTATEEN0_AIA_ISEL; + if (IS_ENABLED(CONFIG_32BIT)) + csr_set(CSR_HSTATEEN0H, SMSTATEEN0_AIA_ISEL >> 32); + else + csr_set(CSR_HSTATEEN0, SMSTATEEN0_AIA_ISEL); + if (vsfile_present) + return KVM_INSN_CONTINUE_SAME_SEPC; + } else if (vsfile_present) { + pr_err("Unexpected trap for CSR [%x] with hstateen0 enabled and valid vs= file\n", + csr_num); + return KVM_INSN_EXIT_TO_USER_SPACE; + } + +skip_hstateen: /* First try to emulate in kernel space */ isel =3D ncsr_read(CSR_VSISELECT) & ISELECT_MASK; if (isel >=3D ISELECT_IPRIO0 && isel <=3D ISELECT_IPRIO15) diff --git a/arch/riscv/kvm/aia_imsic.c b/arch/riscv/kvm/aia_imsic.c index 29ef9c2133a9..d8e6f14850c0 100644 --- a/arch/riscv/kvm/aia_imsic.c +++ b/arch/riscv/kvm/aia_imsic.c @@ -361,6 +361,14 @@ static int imsic_mrif_rmw(struct imsic_mrif *mrif, u32= nr_eix, return 0; } =20 +bool kvm_riscv_aia_imsic_state_hw_backed(struct kvm_vcpu *vcpu) +{ + struct kvm_vcpu_aia *vaia =3D &vcpu->arch.aia_context; + struct imsic *imsic =3D vaia->imsic_state; + + return imsic && imsic->vsfile_cpu >=3D 0; +} + struct imsic_vsfile_read_data { int hgei; u32 nr_eix; --=20 2.43.0