From nobody Sat Oct 4 15:59:02 2025 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 85BA524168D for ; Thu, 14 Aug 2025 15:56:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186971; cv=none; b=pC/4TBVFjmkvniM/NG7rg4IZLkVqcNSEyJrGRDsrxGH2ZVRSAdxdzg91L2/P/3wzpffrB5eVNVmrhVEmEiRCO+cTmi1zXicW4xAy8l9m7jYnn9X0e6aBMKIha2bjNEs/dBU+c3bwMjZVJETlHsh8Cmc9f7lBDL74YyYtSHW9J1c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186971; c=relaxed/simple; bh=AMl3xYJNuSAGeF7OLy/Kzv4+2drH4oPVNI0DIJBBJPI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UHFwNIz2958IGQ9SXqmIygr/TGcCMy2XzledK02XcbzI60sHgotlC70r0YtY3cmD8Om1a+/q19nzeZBGwMEorcR2ytMJqNWSqWEiQLH2nNox+8KVbqjVmsI9flWIUzyXTgIsAy43y2euNiSWwfbi8urndrTK8tNYq8j+O+ziSIg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=fiz69Bs3; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="fiz69Bs3" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-244581c3b43so9805495ad.2 for ; Thu, 14 Aug 2025 08:56:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1755186966; x=1755791766; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Bm60/2Cr4w6uAzbvsdcbKrh6VNvMu+/Ils5A4Kn+0Hk=; b=fiz69Bs38/4zeuGfhRlrC409rA6lEj1VYNmfke5l81TWzPBup8G8xjG+Ix46y4RGnD tANIVvox1Lw+H8k6HCjSBfy475Iao8yS1/4G7BtiaPYU9pxFCHqtFJ+iwmpGHPOk7S4/ SgvIYlk+1XRCUhPURCkSVHCFCNaLG70zX+XwHwSE8/XrzPrErUWjAWfU+t6Bd4/dpIRE OMSq8M3wYKY8Cpt1pEGXOaZ/LjyKOOiJBWLXe3yYgpODVdVSabxAKEvbI4W79O5fw2j/ jrPsFqMgYeNvQX0Uq41CqV4WgUX7mPhmb8ZGwbNawawJAnvIIAFs+v6qp9Nu0ZDIIcCb jAow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755186966; x=1755791766; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Bm60/2Cr4w6uAzbvsdcbKrh6VNvMu+/Ils5A4Kn+0Hk=; b=qsEzjJakfonTjxvYsE16U+wQDtQH6xtLP2LFxCnlBG3jZIjoUXtEnm5SBl7GD8vXp1 FYs+3dGCFHNaIcl/vckIetoTUKRI4wk4/0sJm7BEjWBeJclpObAR0yglpcO8Yw6hOmid p1UP4YcAr6QelglPrBVQGQDoFqGPg72ja6QACxN1Rq26dZRAVp7KyfZEfUh0G2Ji/yPN 6FvLRp9IPIVBkaiUtDgeUcGTzpu2NldndRp/GKz4/+NlwTfNV3sN4tyBtqmbeUcFVWeH bDrKHR2z4dJTGGaSCbWnylBzbY9FhwNcOTYUOHdT12+oGHt8E0lWp1m//GRxAgu45wMy rjZw== X-Forwarded-Encrypted: i=1; AJvYcCWNqlY4fztqRm8aoKkeiI+3DFnM8eksBpDuIaR85lwXVSf+9oLlu2ohuJNagADcDU2XNJ+MHIRxMo0e1k8=@vger.kernel.org X-Gm-Message-State: AOJu0Yxc3dDCa3qpHx/MnpUrnXVCS+9PF8x6c3rGhDu0g6jEiyaKPl4B Q5G3MTKi9GapvIFSk88jgjV3sQSoBga2ZCgCGYPrKGkoDh61gNsmkWkEoa7BR/pb4ag= X-Gm-Gg: ASbGncu+EM+HnV6LqOoZfnU3usYrjU+g5LM3K9iV+TXr1PTUFRMcT6I19OSiddlWpVt 6y29s7iiQm3ZODvPWx9BHg4vLKGFF2TiRaHMJ0+0wEUVGZrYuQT3K8Euijs/YDtWD8ZuW40aWsQ yB2MIxNUOkZRaTPmGMvFSq8BOsDNnMidW8GOorI1aYx1kzMdHcGCWWjT969hQm7hUYSBS335PwS 7HGUsaEdBDCF883l7XQD/S/GoFHfkShPPTsv3wQWm5WCZYsBsYQeBHw2rrhjXdE16mZzJ5l+ajw PNJc6PLjc7rv0TJxM9zzV3NUf18ijPK2vTxWtmCsk08ENRDYXWr2yrpjf626KAKk4lJjLgusggh F/4UgwdkKFc4pfYxc7npMuU7/4KDIQ+hv+cA/1m8jJvnR4lM6/bFexiqhP27UQw== X-Google-Smtp-Source: AGHT+IFZMx0P1JKNMfotkf1h9uD05/LbUJ3nHS+qqEqkenBGx5Rm/Php8OZMQlv5/iu6GkzqmdURRg== X-Received: by 2002:a17:902:cccb:b0:23f:f065:f2be with SMTP id d9443c01a7336-244586a0e5bmr50715635ad.26.1755186965537; Thu, 14 Aug 2025 08:56:05 -0700 (PDT) Received: from anup-ubuntu-vm.localdomain ([103.97.166.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3233108e1d9sm2225500a91.29.2025.08.14.08.56.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Aug 2025 08:56:05 -0700 (PDT) From: Anup Patel To: Atish Patra Cc: Palmer Dabbelt , Paul Walmsley , Alexandre Ghiti , Andrew Jones , Anup Patel , Paolo Bonzini , Shuah Khan , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Anup Patel Subject: [PATCH 1/6] RISC-V: KVM: Set initial value of hedeleg in kvm_arch_vcpu_create() Date: Thu, 14 Aug 2025 21:25:43 +0530 Message-ID: <20250814155548.457172-2-apatel@ventanamicro.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814155548.457172-1-apatel@ventanamicro.com> References: <20250814155548.457172-1-apatel@ventanamicro.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The hedeleg may be updated by ONE_REG interface before the VCPU is run at least once hence set the initial value of hedeleg in kvm_arch_vcpu_create() instead of kvm_riscv_vcpu_setup_config(). Signed-off-by: Anup Patel Reviewed-by: Andrew Jones --- arch/riscv/kvm/vcpu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c index f001e56403f9..86025f68c374 100644 --- a/arch/riscv/kvm/vcpu.c +++ b/arch/riscv/kvm/vcpu.c @@ -133,6 +133,8 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) =20 /* Mark this VCPU never ran */ vcpu->arch.ran_atleast_once =3D false; + + vcpu->arch.cfg.hedeleg =3D KVM_HEDELEG_DEFAULT; vcpu->arch.mmu_page_cache.gfp_zero =3D __GFP_ZERO; bitmap_zero(vcpu->arch.isa, RISCV_ISA_EXT_MAX); =20 @@ -570,7 +572,6 @@ static void kvm_riscv_vcpu_setup_config(struct kvm_vcpu= *vcpu) cfg->hstateen0 |=3D SMSTATEEN0_SSTATEEN0; } =20 - cfg->hedeleg =3D KVM_HEDELEG_DEFAULT; if (vcpu->guest_debug) cfg->hedeleg &=3D ~BIT(EXC_BREAKPOINT); } --=20 2.43.0 From nobody Sat Oct 4 15:59:02 2025 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (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 510C723C4F4 for ; Thu, 14 Aug 2025 15:56:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186973; cv=none; b=WN1Z2G3G80dBT0T81ZviyDK9esttCLtay9asaWc845JIoWzj3/ielt1Eg7c1jmpjwhr70BKc7sd5Jv2zuIQdqNsCJwAQWctgzq7mIoMUPnkh9dvN30G4ClomqyhL+h9NmrH7PqVMajqcFuyYFjklGmjx0A6vy38WArGpiez+Mzk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186973; c=relaxed/simple; bh=OAG+rNqDoUjd+RELKmOJev7nbWr03ivllHVNaYObMaA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rybwIbTLSF4zWFLHzCDh7+k8qIhw+/Cu3MdnxXVVhQbHX0PzzFVQGQntMHeMhwc/7RTBW7BdahIfK7ubbXpYZsoPFE4SVdMDO3Ja3nCZ+AD0o/+ejromrdfvlT+P2HmG0R4ZD9id3TNGvnhIBmqeJ9Hfvn+QmP5liA7w+a4cyZA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=pMktD8Mo; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="pMktD8Mo" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-323267b7dfcso1151335a91.1 for ; Thu, 14 Aug 2025 08:56:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1755186972; x=1755791772; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OQNPbIdIHYbwO34hliHe+Dii/8OaWGaAGknLYtaJxxA=; b=pMktD8MouJMxo1PUfAaF8LwL+zPcEnU6aEoOkbLnL6s/wlBJpCrRc06YCdT2wHw3kt ad7hIkubt4AX2LaAnQOCPIxuxaDxAM5xSVoYkHyUqC9cG05v8h/91QwGWuy+E3KGf8Sw KnLBkYUsGjx/o5WQCeBmBb7XD4vNMSFAHKwUHYXJo1Ula7XPC/uhRMBlpVs773rDx7NF aJTmc4rQe2Ktyaqa9qs6FD8Xcn0Liy7xob1RUPGeP+i8sXTQxj/9DUUOSorYb/yXWrO4 9uiV2a3CIJZ5NAGv88OoQxY4HkHfaRDyHSE1cEOBx16S+Rw130XsvE7EI9kKS3WCNUzR kCJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755186972; x=1755791772; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OQNPbIdIHYbwO34hliHe+Dii/8OaWGaAGknLYtaJxxA=; b=LbuoosiEkcz3+lUkJH4OVQlUUUPFMCyE9/Ut6WOJ6iirGBUaVy5r9Sj7zF02ZsumXE RM4hWgFoZcdMOXiqyk5xp42bCCwtHBeSpZ9r2ldwNcXbihal+IONlmwGBK0kwCsp2YM6 ufQFBKFjKJurifF2y37vZwkZ8t73hLj3X8X0DdCOJraDTOjrcHz5utv/OOYf4JfpP9IY aFe1GKWDYzvq5d+lgDrrGrePraY9CJaSUGSWcijxvr9hIKp2R433qWLZ9yRAqeeWqmm4 ICmTzlJ+LNBDIPmZw+CJR7jf00U9myxNfSUsL81itQRRyUM6wtJL1m0tw/cdUfYr8vld W2uA== X-Forwarded-Encrypted: i=1; AJvYcCXDnisr2zH6FV6kRFbnvYnfdRdw6ySUEPiV21PJkqzP4cALKFtcJQCsffb9z5CEYH6/UjoUzLz5FnPCEVk=@vger.kernel.org X-Gm-Message-State: AOJu0YwSVzJcY6Jz7vGOr4Tn82Q6j/HWb+guTO2R1oLyzka4gl2Alze5 4El7ZTboCrMig6cdo2Khc9wE387ztPQf61++ACpJr9vNXkX4INlXvYLAlQgZ1X9gBpHQAYupIml llScP X-Gm-Gg: ASbGncsmqJPpZZPtfK19joNcaZbDXL7rPIk7Qv4darOjp5lMQmzkhrmJJXzPbck5WAW /8yvsFfvGGay2J8iUtFtacLCVLULqHxkMgemvxKcrJ/Vp5VIzoa4iwsqa03pJ19OmYP12d+aYfO nVcQiUBXJdAoI7aehzqOlnBtB3Mcr8tqGX+lyOJqS9uwpcuO9TTovhoiS/b8888Y4Zp1m5Ciuxe 4sv5KmWnr8kynYq27x5NIrNC2HVJezQvGVtSYayCwZm/vJDDF2+iWbdzss2c0v/yewTORbPqhF4 2OVtV9l8oi/89shLYH6EM6Wyk62lvH5cuVOcrjyaiV334LFdPfV3nF14H6uXYcP9CaoKKzsiqnk FiMT5DgVibM76Mkr/YyNLYfURGaPHs8l9l7QSvvem9tPAVp6+C1BSTlViP+8b9g== X-Google-Smtp-Source: AGHT+IEH2lHONmY7yOykbcxyMlWHAYogmXhk5h922kUnrQe0tO8VefaBP+3/9ekNxpfG4JCDWaX1hA== X-Received: by 2002:a17:90b:5303:b0:312:1c83:58e9 with SMTP id 98e67ed59e1d1-3232795877emr5105743a91.5.1755186971369; Thu, 14 Aug 2025 08:56:11 -0700 (PDT) Received: from anup-ubuntu-vm.localdomain ([103.97.166.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3233108e1d9sm2225500a91.29.2025.08.14.08.56.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Aug 2025 08:56:10 -0700 (PDT) From: Anup Patel To: Atish Patra Cc: Palmer Dabbelt , Paul Walmsley , Alexandre Ghiti , Andrew Jones , Anup Patel , Paolo Bonzini , Shuah Khan , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Anup Patel Subject: [PATCH 2/6] RISC-V: KVM: Introduce feature specific reset for SBI FWFT Date: Thu, 14 Aug 2025 21:25:44 +0530 Message-ID: <20250814155548.457172-3-apatel@ventanamicro.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814155548.457172-1-apatel@ventanamicro.com> References: <20250814155548.457172-1-apatel@ventanamicro.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The SBI FWFT feature values must be reset upon VCPU reset so introduce feature specific reset callback for this purpose. Signed-off-by: Anup Patel Reviewed-by: Andrew Jones --- arch/riscv/kvm/vcpu_sbi_fwft.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kvm/vcpu_sbi_fwft.c b/arch/riscv/kvm/vcpu_sbi_fwft.c index 164a01288b0a..5a3bad0f9330 100644 --- a/arch/riscv/kvm/vcpu_sbi_fwft.c +++ b/arch/riscv/kvm/vcpu_sbi_fwft.c @@ -30,6 +30,13 @@ struct kvm_sbi_fwft_feature { */ bool (*supported)(struct kvm_vcpu *vcpu); =20 + /** + * @reset: Reset the feature value irrespective whether feature is suppor= ted or not + * + * This callback is mandatory + */ + void (*reset)(struct kvm_vcpu *vcpu); + /** * @set: Set the feature value * @@ -75,6 +82,13 @@ static bool kvm_sbi_fwft_misaligned_delegation_supported= (struct kvm_vcpu *vcpu) return misaligned_traps_can_delegate(); } =20 +static void kvm_sbi_fwft_reset_misaligned_delegation(struct kvm_vcpu *vcpu) +{ + struct kvm_vcpu_config *cfg =3D &vcpu->arch.cfg; + + cfg->hedeleg &=3D ~MIS_DELEG; +} + static long kvm_sbi_fwft_set_misaligned_delegation(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, unsigned long value) @@ -124,6 +138,11 @@ static bool kvm_sbi_fwft_pointer_masking_pmlen_support= ed(struct kvm_vcpu *vcpu) return fwft->have_vs_pmlen_7 || fwft->have_vs_pmlen_16; } =20 +static void kvm_sbi_fwft_reset_pointer_masking_pmlen(struct kvm_vcpu *vcpu) +{ + vcpu->arch.cfg.henvcfg &=3D ~ENVCFG_PMM; +} + static long kvm_sbi_fwft_set_pointer_masking_pmlen(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, unsigned long value) @@ -180,6 +199,7 @@ static const struct kvm_sbi_fwft_feature features[] =3D= { { .id =3D SBI_FWFT_MISALIGNED_EXC_DELEG, .supported =3D kvm_sbi_fwft_misaligned_delegation_supported, + .reset =3D kvm_sbi_fwft_reset_misaligned_delegation, .set =3D kvm_sbi_fwft_set_misaligned_delegation, .get =3D kvm_sbi_fwft_get_misaligned_delegation, }, @@ -187,6 +207,7 @@ static const struct kvm_sbi_fwft_feature features[] =3D= { { .id =3D SBI_FWFT_POINTER_MASKING_PMLEN, .supported =3D kvm_sbi_fwft_pointer_masking_pmlen_supported, + .reset =3D kvm_sbi_fwft_reset_pointer_masking_pmlen, .set =3D kvm_sbi_fwft_set_pointer_masking_pmlen, .get =3D kvm_sbi_fwft_get_pointer_masking_pmlen, }, @@ -321,11 +342,16 @@ static void kvm_sbi_ext_fwft_deinit(struct kvm_vcpu *= vcpu) =20 static void kvm_sbi_ext_fwft_reset(struct kvm_vcpu *vcpu) { - int i; struct kvm_sbi_fwft *fwft =3D vcpu_to_fwft(vcpu); + const struct kvm_sbi_fwft_feature *feature; + int i; =20 - for (i =3D 0; i < ARRAY_SIZE(features); i++) + for (i =3D 0; i < ARRAY_SIZE(features); i++) { fwft->configs[i].flags =3D 0; + feature =3D &features[i]; + if (feature->reset) + feature->reset(vcpu); + } } =20 const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_fwft =3D { --=20 2.43.0 From nobody Sat Oct 4 15:59:02 2025 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 2D4B524169D for ; Thu, 14 Aug 2025 15:56:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186979; cv=none; b=IBEUsUpbLFq6U+X7gu0yeeVM37KEwcbuHmC/hHUu/WXDtTJp3BGR15/FysUVjkG9o0Q0rZQn8bgvdGE5TZEZvyasjqvzfOZMwzxT1PIyoVKHqTppu8AfIiyTn5maDrx6B/l3ziw/HsuoGm1/+m+T+y5pYUgYJzXoXzCIshUo4zs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186979; c=relaxed/simple; bh=Zv6FgrHew/Ek+2uF8NLnj+TFtkte+TJ5pINKwvlDgys=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MbGMEI+4BIz/3lvx8WwegfXbgognb305pAqrLf1veMipbnjVpjPRBD5afIz1gPKALuhzQas3foKhzEoYxoWQ6lzn0CVbTIlCPQtjUYEQI51nZZgtUFSK1hM+bUcxJ0hHrW5zkMpEqeR7pvR3lp1u0E9EOwSLgBdbkddryNa6lpg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=ZJS6xMAC; arc=none smtp.client-ip=209.85.216.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="ZJS6xMAC" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-32326e5a623so1076618a91.3 for ; Thu, 14 Aug 2025 08:56:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1755186977; x=1755791777; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=voblbOo+QfvOAACcm5KZQLQjl5caMotAdJEG/UANWVA=; b=ZJS6xMAC/2nar6F8MHT2+vFFslQdIqDsHgrii7levobu/uEmd2u+hDN+ppKvT0wP5J o5n9K1tAHuLHTO4qMH7fC/pqjILMAd/4P1x/iMuTVlsh8iu+P+B38He1TCwuCoGbt7Mp 8TwZgxXK2d/bm86gJtH/zpEYfsCkZYu9KXF+Uq0KMssnAF/0ptlg8ajBdXXXcW1BUDtV FD3eec4zP1tKmcbSyDZo6JYIzvAYOjTGUa8r37eKrVPmYyVGRMoeMYzscbozh4HcGbFa dibJsN9dJcfgFDVtIxBkCs+Hfc63CTkscn2JGkkdA/WsckxtE3XSBpILllGvAI3NtSqz Rypg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755186977; x=1755791777; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=voblbOo+QfvOAACcm5KZQLQjl5caMotAdJEG/UANWVA=; b=nIR6q0Tz8H7hVQTdqqDyfLNlM7FC2jZS3UnCoXslBS0MPdBbGjd3bxQCF+Mvl5TJYP qgwWRMbtWpJ4WnpWM1CnJpYuqT9VyzrAJ9HHg5IufKd+q1/6nuRVRKa5bnstRFWi3Hkq +4g7bFBXjnFyZWqFKHXZMfnu+pYFJo7crWw2FsekYClFAuNuRFSx8/LoX//TMNZRJq70 QzVdnUIN13v7nsy4giCACIPAKaL6npnkOXJG1iuy1xjJx/WX6cnwV3Y1s30N4h81LLiM kA5x7+Ov/ngPv9Vo3Z4aqQ7Bd5/ZcuQyeouWUMbOkOyMlQR/kVfewvQyAVUjC7fPmQ7O y94A== X-Forwarded-Encrypted: i=1; AJvYcCX2PYeSOXOGi4juPaWHniAVTI/sHKHhvpVPxDQLROPr6nO8Kb+osuqtnfITQDZSBIvwQkVwHZIw0ZgW/sQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yym3OEAABFzuzQM62XBWrs1+UeA22uSE362z4S2PN+Zvs6LDezi V1aItV0HXfoYZ+WpY0QzGbkb0c6i9dLH2nMj1PFty481GWJMCueoUy77+Hs4yC/cfMI= X-Gm-Gg: ASbGnctm4feoYp7uJBAXY7bFBgzxkXXOh6DOjeeXhaJ4JNuhhUv2kYlNYFWQ1Mv1E/O QIqDUD4lLa0QDcIpDu+1uGiVDu0c7T4s5aZS8QxY6S+X7XtVOkdDqtPJz8xpsX3FetMfp5z99W0 eMpfygMwGRNehEy9Ffdqa/c0W83xJHZKG+I5XYIBaVzXrAir5DdwbUZjZ4ZlurFGwNyl5YT07jo CUZLXbntojAqtlMfw9GMA10Mj7JejKRXAcmpuzyjDfBZO7M0FpUV5+jGtBkWgB0wb84r90hShaK qLCWia3DOSxj/oiyNlXAC5dQRshj6exVgl8gUdp6m6bhVJff3unU9u1iCoXuFcSS0AD/oN8iFhU 18u8ISSQWaru8ojLiZGKSwAAM8vwVS6baI1w6To3MqMtRrSIJYbbP1/a6CtSnNA== X-Google-Smtp-Source: AGHT+IEWlbE9RkFR5n0JYrCg/svcoKE1yY0HvyVS2YpuZCp4xKVZZIkxAHVif5GhfUz0bUo0i/cEoQ== X-Received: by 2002:a17:90b:2790:b0:318:f0cb:5a50 with SMTP id 98e67ed59e1d1-32327b4916emr5400286a91.26.1755186977266; Thu, 14 Aug 2025 08:56:17 -0700 (PDT) Received: from anup-ubuntu-vm.localdomain ([103.97.166.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3233108e1d9sm2225500a91.29.2025.08.14.08.56.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Aug 2025 08:56:16 -0700 (PDT) From: Anup Patel To: Atish Patra Cc: Palmer Dabbelt , Paul Walmsley , Alexandre Ghiti , Andrew Jones , Anup Patel , Paolo Bonzini , Shuah Khan , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Anup Patel Subject: [PATCH 3/6] RISC-V: KVM: Introduce optional ONE_REG callbacks for SBI extensions Date: Thu, 14 Aug 2025 21:25:45 +0530 Message-ID: <20250814155548.457172-4-apatel@ventanamicro.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814155548.457172-1-apatel@ventanamicro.com> References: <20250814155548.457172-1-apatel@ventanamicro.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" SBI extensions can have per-VCPU state which needs to be saved/restored through ONE_REG interface for Guest/VM migration. Introduce optional ONE_REG callbacks for SBI extensions so that ONE_REG implementation for an SBI extenion is part of the extension sources. Signed-off-by: Anup Patel Reviewed-by: Andrew Jones --- arch/riscv/include/asm/kvm_vcpu_sbi.h | 21 ++-- arch/riscv/kvm/vcpu_onereg.c | 31 +----- arch/riscv/kvm/vcpu_sbi.c | 145 ++++++++++++++++++++++---- arch/riscv/kvm/vcpu_sbi_sta.c | 64 ++++++++---- 4 files changed, 178 insertions(+), 83 deletions(-) diff --git a/arch/riscv/include/asm/kvm_vcpu_sbi.h b/arch/riscv/include/asm= /kvm_vcpu_sbi.h index 766031e80960..144c3f6d5eb9 100644 --- a/arch/riscv/include/asm/kvm_vcpu_sbi.h +++ b/arch/riscv/include/asm/kvm_vcpu_sbi.h @@ -59,6 +59,15 @@ struct kvm_vcpu_sbi_extension { void (*deinit)(struct kvm_vcpu *vcpu); =20 void (*reset)(struct kvm_vcpu *vcpu); + + bool have_state; + unsigned long state_reg_subtype; + unsigned long (*get_state_reg_count)(struct kvm_vcpu *vcpu); + int (*get_state_reg_id)(struct kvm_vcpu *vcpu, int index, u64 *reg_id); + int (*get_state_reg)(struct kvm_vcpu *vcpu, unsigned long reg_num, + unsigned long reg_size, void *reg_val); + int (*set_state_reg)(struct kvm_vcpu *vcpu, unsigned long reg_num, + unsigned long reg_size, const void *reg_val); }; =20 void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run= ); @@ -73,10 +82,9 @@ int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); -int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, - const struct kvm_one_reg *reg); -int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, - const struct kvm_one_reg *reg); +int kvm_riscv_vcpu_reg_indices_sbi(struct kvm_vcpu *vcpu, u64 __user *uind= ices); +int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one= _reg *reg); +int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one= _reg *reg); const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext( struct kvm_vcpu *vcpu, unsigned long extid); bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx); @@ -85,11 +93,6 @@ void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu); void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu); void kvm_riscv_vcpu_sbi_reset(struct kvm_vcpu *vcpu); =20 -int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long re= g_num, - unsigned long *reg_val); -int kvm_riscv_vcpu_set_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long re= g_num, - unsigned long reg_val); - #ifdef CONFIG_RISCV_SBI_V01 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01; #endif diff --git a/arch/riscv/kvm/vcpu_onereg.c b/arch/riscv/kvm/vcpu_onereg.c index b77748a56a59..5843b0519224 100644 --- a/arch/riscv/kvm/vcpu_onereg.c +++ b/arch/riscv/kvm/vcpu_onereg.c @@ -1090,36 +1090,9 @@ static unsigned long num_sbi_ext_regs(struct kvm_vcp= u *vcpu) return copy_sbi_ext_reg_indices(vcpu, NULL); } =20 -static int copy_sbi_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindice= s) -{ - struct kvm_vcpu_sbi_context *scontext =3D &vcpu->arch.sbi_context; - int total =3D 0; - - if (scontext->ext_status[KVM_RISCV_SBI_EXT_STA] =3D=3D KVM_RISCV_SBI_EXT_= STATUS_ENABLED) { - u64 size =3D IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_= U64; - int n =3D sizeof(struct kvm_riscv_sbi_sta) / sizeof(unsigned long); - - for (int i =3D 0; i < n; i++) { - u64 reg =3D KVM_REG_RISCV | size | - KVM_REG_RISCV_SBI_STATE | - KVM_REG_RISCV_SBI_STA | i; - - if (uindices) { - if (put_user(reg, uindices)) - return -EFAULT; - uindices++; - } - } - - total +=3D n; - } - - return total; -} - static inline unsigned long num_sbi_regs(struct kvm_vcpu *vcpu) { - return copy_sbi_reg_indices(vcpu, NULL); + return kvm_riscv_vcpu_reg_indices_sbi(vcpu, NULL); } =20 static inline unsigned long num_vector_regs(const struct kvm_vcpu *vcpu) @@ -1247,7 +1220,7 @@ int kvm_riscv_vcpu_copy_reg_indices(struct kvm_vcpu *= vcpu, return ret; uindices +=3D ret; =20 - ret =3D copy_sbi_reg_indices(vcpu, uindices); + ret =3D kvm_riscv_vcpu_reg_indices_sbi(vcpu, uindices); if (ret < 0) return ret; uindices +=3D ret; diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c index 01a93f4fdb16..8b3c393e0c83 100644 --- a/arch/riscv/kvm/vcpu_sbi.c +++ b/arch/riscv/kvm/vcpu_sbi.c @@ -364,64 +364,163 @@ int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *= vcpu, return 0; } =20 -int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, - const struct kvm_one_reg *reg) +int kvm_riscv_vcpu_reg_indices_sbi(struct kvm_vcpu *vcpu, u64 __user *uind= ices) +{ + struct kvm_vcpu_sbi_context *scontext =3D &vcpu->arch.sbi_context; + const struct kvm_riscv_sbi_extension_entry *entry; + const struct kvm_vcpu_sbi_extension *ext; + unsigned long state_reg_count; + int i, j, rc, count =3D 0; + u64 reg; + + for (i =3D 0; i < ARRAY_SIZE(sbi_ext); i++) { + entry =3D &sbi_ext[i]; + ext =3D entry->ext_ptr; + + if (!ext->have_state || + scontext->ext_status[entry->ext_idx] !=3D KVM_RISCV_SBI_EXT_STATUS_E= NABLED) + continue; + + state_reg_count =3D ext->get_state_reg_count(vcpu); + if (!uindices) + goto skip_put_user; + + for (j =3D 0; j < state_reg_count; j++) { + if (ext->get_state_reg_id) { + rc =3D ext->get_state_reg_id(vcpu, j, ®); + if (rc) + return rc; + } else { + reg =3D KVM_REG_RISCV | + (IS_ENABLED(CONFIG_32BIT) ? + KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64) | + KVM_REG_RISCV_SBI_STATE | + ext->state_reg_subtype | j; + } + + if (put_user(reg, uindices)) + return -EFAULT; + uindices++; + } + +skip_put_user: + count +=3D state_reg_count; + } + + return count; +} + +static const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext_withstat= e(struct kvm_vcpu *vcpu, + unsigned long subtype) +{ + struct kvm_vcpu_sbi_context *scontext =3D &vcpu->arch.sbi_context; + const struct kvm_riscv_sbi_extension_entry *entry; + const struct kvm_vcpu_sbi_extension *ext; + int i; + + for (i =3D 0; i < ARRAY_SIZE(sbi_ext); i++) { + entry =3D &sbi_ext[i]; + ext =3D entry->ext_ptr; + + if (ext->have_state && + ext->state_reg_subtype =3D=3D subtype && + scontext->ext_status[entry->ext_idx] =3D=3D KVM_RISCV_SBI_EXT_STATUS= _ENABLED) + return ext; + } + + return NULL; +} + +int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one= _reg *reg) { unsigned long __user *uaddr =3D (unsigned long __user *)(unsigned long)reg->addr; unsigned long reg_num =3D reg->id & ~(KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_RISCV_SBI_STATE); - unsigned long reg_subtype, reg_val; - - if (KVM_REG_SIZE(reg->id) !=3D sizeof(unsigned long)) + const struct kvm_vcpu_sbi_extension *ext; + unsigned long reg_subtype; + void *reg_val; + u64 data64; + u32 data32; + u16 data16; + u8 data8; + + switch (KVM_REG_SIZE(reg->id)) { + case 1: + reg_val =3D &data8; + break; + case 2: + reg_val =3D &data16; + break; + case 4: + reg_val =3D &data32; + break; + case 8: + reg_val =3D &data64; + break; + default: return -EINVAL; + }; =20 - if (copy_from_user(®_val, uaddr, KVM_REG_SIZE(reg->id))) + if (copy_from_user(reg_val, uaddr, KVM_REG_SIZE(reg->id))) return -EFAULT; =20 reg_subtype =3D reg_num & KVM_REG_RISCV_SUBTYPE_MASK; reg_num &=3D ~KVM_REG_RISCV_SUBTYPE_MASK; =20 - switch (reg_subtype) { - case KVM_REG_RISCV_SBI_STA: - return kvm_riscv_vcpu_set_reg_sbi_sta(vcpu, reg_num, reg_val); - default: + ext =3D kvm_vcpu_sbi_find_ext_withstate(vcpu, reg_subtype); + if (!ext || !ext->set_state_reg) return -EINVAL; - } =20 - return 0; + return ext->set_state_reg(vcpu, reg_num, KVM_REG_SIZE(reg->id), reg_val); } =20 -int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, - const struct kvm_one_reg *reg) +int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one= _reg *reg) { unsigned long __user *uaddr =3D (unsigned long __user *)(unsigned long)reg->addr; unsigned long reg_num =3D reg->id & ~(KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_RISCV_SBI_STATE); - unsigned long reg_subtype, reg_val; + const struct kvm_vcpu_sbi_extension *ext; + unsigned long reg_subtype; + void *reg_val; + u64 data64; + u32 data32; + u16 data16; + u8 data8; int ret; =20 - if (KVM_REG_SIZE(reg->id) !=3D sizeof(unsigned long)) + switch (KVM_REG_SIZE(reg->id)) { + case 1: + reg_val =3D &data8; + break; + case 2: + reg_val =3D &data16; + break; + case 4: + reg_val =3D &data32; + break; + case 8: + reg_val =3D &data64; + break; + default: return -EINVAL; + }; =20 reg_subtype =3D reg_num & KVM_REG_RISCV_SUBTYPE_MASK; reg_num &=3D ~KVM_REG_RISCV_SUBTYPE_MASK; =20 - switch (reg_subtype) { - case KVM_REG_RISCV_SBI_STA: - ret =3D kvm_riscv_vcpu_get_reg_sbi_sta(vcpu, reg_num, ®_val); - break; - default: + ext =3D kvm_vcpu_sbi_find_ext_withstate(vcpu, reg_subtype); + if (!ext || !ext->get_state_reg) return -EINVAL; - } =20 + ret =3D ext->get_state_reg(vcpu, reg_num, KVM_REG_SIZE(reg->id), reg_val); if (ret) return ret; =20 - if (copy_to_user(uaddr, ®_val, KVM_REG_SIZE(reg->id))) + if (copy_to_user(uaddr, reg_val, KVM_REG_SIZE(reg->id))) return -EFAULT; =20 return 0; diff --git a/arch/riscv/kvm/vcpu_sbi_sta.c b/arch/riscv/kvm/vcpu_sbi_sta.c index cc6cb7c8f0e4..d14cf6255d83 100644 --- a/arch/riscv/kvm/vcpu_sbi_sta.c +++ b/arch/riscv/kvm/vcpu_sbi_sta.c @@ -151,63 +151,83 @@ static unsigned long kvm_sbi_ext_sta_probe(struct kvm= _vcpu *vcpu) return !!sched_info_on(); } =20 -const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta =3D { - .extid_start =3D SBI_EXT_STA, - .extid_end =3D SBI_EXT_STA, - .handler =3D kvm_sbi_ext_sta_handler, - .probe =3D kvm_sbi_ext_sta_probe, - .reset =3D kvm_riscv_vcpu_sbi_sta_reset, -}; +static unsigned long kvm_sbi_ext_sta_get_state_reg_count(struct kvm_vcpu *= vcpu) +{ + return sizeof(struct kvm_riscv_sbi_sta) / sizeof(unsigned long); +} =20 -int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu, - unsigned long reg_num, - unsigned long *reg_val) +static int kvm_sbi_ext_sta_get_reg(struct kvm_vcpu *vcpu, unsigned long re= g_num, + unsigned long reg_size, void *reg_val) { + unsigned long *value; + + if (reg_size !=3D sizeof(unsigned long)) + return -EINVAL; + value =3D reg_val; + switch (reg_num) { case KVM_REG_RISCV_SBI_STA_REG(shmem_lo): - *reg_val =3D (unsigned long)vcpu->arch.sta.shmem; + *value =3D (unsigned long)vcpu->arch.sta.shmem; break; case KVM_REG_RISCV_SBI_STA_REG(shmem_hi): if (IS_ENABLED(CONFIG_32BIT)) - *reg_val =3D upper_32_bits(vcpu->arch.sta.shmem); + *value =3D upper_32_bits(vcpu->arch.sta.shmem); else - *reg_val =3D 0; + *value =3D 0; break; default: - return -EINVAL; + return -ENOENT; } =20 return 0; } =20 -int kvm_riscv_vcpu_set_reg_sbi_sta(struct kvm_vcpu *vcpu, - unsigned long reg_num, - unsigned long reg_val) +static int kvm_sbi_ext_sta_set_reg(struct kvm_vcpu *vcpu, unsigned long re= g_num, + unsigned long reg_size, const void *reg_val) { + unsigned long value; + + if (reg_size !=3D sizeof(unsigned long)) + return -EINVAL; + value =3D *(const unsigned long *)reg_val; + switch (reg_num) { case KVM_REG_RISCV_SBI_STA_REG(shmem_lo): if (IS_ENABLED(CONFIG_32BIT)) { gpa_t hi =3D upper_32_bits(vcpu->arch.sta.shmem); =20 - vcpu->arch.sta.shmem =3D reg_val; + vcpu->arch.sta.shmem =3D value; vcpu->arch.sta.shmem |=3D hi << 32; } else { - vcpu->arch.sta.shmem =3D reg_val; + vcpu->arch.sta.shmem =3D value; } break; case KVM_REG_RISCV_SBI_STA_REG(shmem_hi): if (IS_ENABLED(CONFIG_32BIT)) { gpa_t lo =3D lower_32_bits(vcpu->arch.sta.shmem); =20 - vcpu->arch.sta.shmem =3D ((gpa_t)reg_val << 32); + vcpu->arch.sta.shmem =3D ((gpa_t)value << 32); vcpu->arch.sta.shmem |=3D lo; - } else if (reg_val !=3D 0) { + } else if (value !=3D 0) { return -EINVAL; } break; default: - return -EINVAL; + return -ENOENT; } =20 return 0; } + +const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta =3D { + .extid_start =3D SBI_EXT_STA, + .extid_end =3D SBI_EXT_STA, + .handler =3D kvm_sbi_ext_sta_handler, + .probe =3D kvm_sbi_ext_sta_probe, + .reset =3D kvm_riscv_vcpu_sbi_sta_reset, + .have_state =3D true, + .state_reg_subtype =3D KVM_REG_RISCV_SBI_STA, + .get_state_reg_count =3D kvm_sbi_ext_sta_get_state_reg_count, + .get_state_reg =3D kvm_sbi_ext_sta_get_reg, + .set_state_reg =3D kvm_sbi_ext_sta_set_reg, +}; --=20 2.43.0 From nobody Sat Oct 4 15:59:02 2025 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.182]) (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 0AE2D25A62E for ; Thu, 14 Aug 2025 15:56:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186985; cv=none; b=MkMX8EO3h+BvQ5C/xntoyaCI+p4QPzMfOP5/DfRxzu/6lpntoDpzjLgsJR8OyzROumI3RomUuJUMq7vFOZSjupkekjvJC9YrZZbgjl0ESlt7mRpIIooP6HzeaSKawLA5g5mRqHUPcBbqEwFyTuVqtDK0hTWi3SNxR67uX0YGhH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186985; c=relaxed/simple; bh=xDTORQO8wR4Y6gL1EQL3uPFlKMfbNy0CTvdho8dymHM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P9lxEfLoAEhVZsrnOEGF7fpvkgmEMWU+iShni0uIpernG8d8QtpgDXUsOHeZU9o2z5OdgLiL1IKwUhz7h0DejZeR8IGKYZc3mA08N9R7y3nc7KeKNcagodGc9DzGNZCR52O2kd/Z//VTzFhy6cizZK7tqb9uOCamWTRt/gx3sCA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=Oi12IA5X; arc=none smtp.client-ip=209.85.215.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="Oi12IA5X" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-b4716f46a2eso751453a12.0 for ; Thu, 14 Aug 2025 08:56:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1755186983; x=1755791783; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BjEBV0XycMWcBVpHucFxuLGWtwgSmQrzNPLz1/7S0Uc=; b=Oi12IA5XdEZLo1S0NmtaI10RG/YfdWwGmQLOBeaeeOWStcjl2Pj3RacbRbEFFpFiPJ vDAy8iMeqZ+JIPWKHXZjmZtJ9MJr9K2k2DJ5Cphp81h/njPgr7vs44xPFJVkKxpkutXB cKYOLFkg0cAZ43aijSeGotvdOinOrD8GEoGj7lszpYUbjFf3/1gcK1Q+FX2pEqAL1L5C xyyrtdV7ztAut0jbMBOa8dFGGZUZfxJa628msWG88Af9lk9++GALPDFDSj4UR3C2ibAd RIXI4vxEmNcQ0q34e5kvXmuHDJ/GmTXagaxtXvgb9MAGEtFQP0EDzl3EyxirE8NXqSIH eprw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755186983; x=1755791783; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BjEBV0XycMWcBVpHucFxuLGWtwgSmQrzNPLz1/7S0Uc=; b=MyuAwJ23htIlFOqNbcVTrV5+rebImJezPiSvMvvZ0gDYqdfvmh1HK4qntf999vzTVM GE1BXhfwYI/5IPW87Pbyrbamx0KPNrcVcX9QUFI4kDFmLofYJ89g9xFkiJyk63xf9gSC 3ItWS5fKmwElAIKcJTSfmc1Qq1JtTWYBMHAIToiSSikeS0AD/u7QIgZYm2P7yiJQ75ac KuNyBCTzolFUr7oYnCeeaqZcU0aY/1S1Gf8MKXiPpQbFSed3Oc8nmhedWo+GB/RluXlg chxFU16UZBdsMWYAY6AursQV4/mbDqN8dMx5wDrCb0n5ZAm5l+M0BKWwT+oB1HxqT0e8 nexw== X-Forwarded-Encrypted: i=1; AJvYcCV2B7pHU+c7ffC2LaaM5LelOodLpqXb+rX1ziLzw214LCtbRivALERClNkyzrjeb9eIbdW3QEC5RoiV14Q=@vger.kernel.org X-Gm-Message-State: AOJu0YyGN7sXi4xsb8d8zGKKAslLc/NbCuTdq8ignApckXEHtsal/nVB GdWvYvdcfn0Axpr01vpUMbKvjgZeVDLit8J24Gv/qFibnMiE5zugkkjy0uNSoGkvXh8= X-Gm-Gg: ASbGncsIJc2ZjkCIXKhTWljr2KV9/OSeyyYswvItt7xAqw6eDipvhEA3wf7u3UoW7K4 2GbYTyvNjtAzXZ7Re8ChZLA7p6Bz5Ycnh5jc/nvg0EMurck9xqZoHhvKjrdex/RNejieq3voSDv 6pMaPW7gQl2Psgz8LgNQalFsy64bYenGS2UUZfI9YxMg6JVQyUj1ZmVZdpKmm1KKVQJix5pAK6z bp+D/3y9LeXeVsEuaNG1WEIVB61g8xVlWuB8UWwJN1qshqVtOIClWUXqqEhv3NfV3Wg6duwIIlB V4U1Ii2/M6jHqQ+LBcEhIbVLKuqTLsuYV5Gk5NLShgv3U70If7jkdcfY7qo2QEsUWBt5NbMExTn T1qfBWFw+h2AeOZTglO7/yu/dVzVMWKO+XgTJ5YdVJTZTZsFaePII31fLP9tL9Q== X-Google-Smtp-Source: AGHT+IGItqFm8z55cDwxSzzGs3dPEK+gv7cx+ag71dX5oyptRWM4L/1ck05jILA7+mE1V8PQvvjeLQ== X-Received: by 2002:a17:90b:5246:b0:311:eb85:96df with SMTP id 98e67ed59e1d1-32327a63a5cmr6292953a91.17.1755186983087; Thu, 14 Aug 2025 08:56:23 -0700 (PDT) Received: from anup-ubuntu-vm.localdomain ([103.97.166.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3233108e1d9sm2225500a91.29.2025.08.14.08.56.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Aug 2025 08:56:22 -0700 (PDT) From: Anup Patel To: Atish Patra Cc: Palmer Dabbelt , Paul Walmsley , Alexandre Ghiti , Andrew Jones , Anup Patel , Paolo Bonzini , Shuah Khan , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Anup Patel Subject: [PATCH 4/6] RISC-V: KVM: Move copy_sbi_ext_reg_indices() to SBI implementation Date: Thu, 14 Aug 2025 21:25:46 +0530 Message-ID: <20250814155548.457172-5-apatel@ventanamicro.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814155548.457172-1-apatel@ventanamicro.com> References: <20250814155548.457172-1-apatel@ventanamicro.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The ONE_REG handling of SBI extension enable/disable registers and SBI extension state registers is already under SBI implementation. On similar lines, let's move copy_sbi_ext_reg_indices() under SBI implementation. Signed-off-by: Anup Patel Reviewed-by: Andrew Jones --- arch/riscv/include/asm/kvm_vcpu_sbi.h | 2 +- arch/riscv/kvm/vcpu_onereg.c | 29 ++------------------------- arch/riscv/kvm/vcpu_sbi.c | 27 ++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/arch/riscv/include/asm/kvm_vcpu_sbi.h b/arch/riscv/include/asm= /kvm_vcpu_sbi.h index 144c3f6d5eb9..212c31629bc8 100644 --- a/arch/riscv/include/asm/kvm_vcpu_sbi.h +++ b/arch/riscv/include/asm/kvm_vcpu_sbi.h @@ -78,6 +78,7 @@ void kvm_riscv_vcpu_sbi_request_reset(struct kvm_vcpu *vc= pu, unsigned long pc, unsigned long a1); void kvm_riscv_vcpu_sbi_load_reset_state(struct kvm_vcpu *vcpu); int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run); +int kvm_riscv_vcpu_reg_indices_sbi_ext(struct kvm_vcpu *vcpu, u64 __user *= uindices); int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu, @@ -87,7 +88,6 @@ int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, con= st struct kvm_one_reg * int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one= _reg *reg); const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext( struct kvm_vcpu *vcpu, unsigned long extid); -bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx); int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run); void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu); void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu); diff --git a/arch/riscv/kvm/vcpu_onereg.c b/arch/riscv/kvm/vcpu_onereg.c index 5843b0519224..0894ab517525 100644 --- a/arch/riscv/kvm/vcpu_onereg.c +++ b/arch/riscv/kvm/vcpu_onereg.c @@ -1060,34 +1060,9 @@ static inline unsigned long num_isa_ext_regs(const s= truct kvm_vcpu *vcpu) return copy_isa_ext_reg_indices(vcpu, NULL); } =20 -static int copy_sbi_ext_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uin= dices) -{ - unsigned int n =3D 0; - - for (int i =3D 0; i < KVM_RISCV_SBI_EXT_MAX; i++) { - u64 size =3D IS_ENABLED(CONFIG_32BIT) ? - KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64; - u64 reg =3D KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT | - KVM_REG_RISCV_SBI_SINGLE | i; - - if (!riscv_vcpu_supports_sbi_ext(vcpu, i)) - continue; - - if (uindices) { - if (put_user(reg, uindices)) - return -EFAULT; - uindices++; - } - - n++; - } - - return n; -} - static unsigned long num_sbi_ext_regs(struct kvm_vcpu *vcpu) { - return copy_sbi_ext_reg_indices(vcpu, NULL); + return kvm_riscv_vcpu_reg_indices_sbi_ext(vcpu, NULL); } =20 static inline unsigned long num_sbi_regs(struct kvm_vcpu *vcpu) @@ -1215,7 +1190,7 @@ int kvm_riscv_vcpu_copy_reg_indices(struct kvm_vcpu *= vcpu, return ret; uindices +=3D ret; =20 - ret =3D copy_sbi_ext_reg_indices(vcpu, uindices); + ret =3D kvm_riscv_vcpu_reg_indices_sbi_ext(vcpu, uindices); if (ret < 0) return ret; uindices +=3D ret; diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c index 8b3c393e0c83..19e0e3d7b598 100644 --- a/arch/riscv/kvm/vcpu_sbi.c +++ b/arch/riscv/kvm/vcpu_sbi.c @@ -110,7 +110,7 @@ riscv_vcpu_get_sbi_ext(struct kvm_vcpu *vcpu, unsigned = long idx) return sext; } =20 -bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx) +static bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx) { struct kvm_vcpu_sbi_context *scontext =3D &vcpu->arch.sbi_context; const struct kvm_riscv_sbi_extension_entry *sext; @@ -288,6 +288,31 @@ static int riscv_vcpu_get_sbi_ext_multi(struct kvm_vcp= u *vcpu, return 0; } =20 +int kvm_riscv_vcpu_reg_indices_sbi_ext(struct kvm_vcpu *vcpu, u64 __user *= uindices) +{ + unsigned int n =3D 0; + + for (int i =3D 0; i < KVM_RISCV_SBI_EXT_MAX; i++) { + u64 size =3D IS_ENABLED(CONFIG_32BIT) ? + KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64; + u64 reg =3D KVM_REG_RISCV | size | KVM_REG_RISCV_SBI_EXT | + KVM_REG_RISCV_SBI_SINGLE | i; + + if (!riscv_vcpu_supports_sbi_ext(vcpu, i)) + continue; + + if (uindices) { + if (put_user(reg, uindices)) + return -EFAULT; + uindices++; + } + + n++; + } + + return n; +} + int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { --=20 2.43.0 From nobody Sat Oct 4 15:59:02 2025 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) (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 D0B51204680 for ; Thu, 14 Aug 2025 15:56:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186991; cv=none; b=SfRQfNfwh/DGKn2+uv0PVOnrFr6YgMRrxw0ZdU3WIanwEzDv9o1axinJ1iUq1SbYU6FF4jl+/Rx9CAvw4SBGzlv8uBxdNYLVQ4moFZ+8gKn5z5iqxgtdYE6q7QFqzSPwapetLZGHqjvjZQ1jvBK0ysGJC7QwcKYgeha7EEmjW9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186991; c=relaxed/simple; bh=pOWZZ1yAolvhQ4qPW38kR3SL9AJb1VbT0Ng7NeaENQM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RmgvuesxBnOGqxAs6WmOwxnfAucQuB+muRgSMee5hyAkV7BwpWumOBG4nvFRwWsMLN/PFnJ4RS+bKucjEGqjbESDDtJMtKLN/mOJeB/5RZbiq5OU1Ggvuc6ECozPvZz1OYN/bO6lInjXrYlIJVX1Bbg7bHe2mG4LdTOnHi793D8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=cXo7Zr2U; arc=none smtp.client-ip=209.85.216.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="cXo7Zr2U" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-321cfa7ad29so1687423a91.1 for ; Thu, 14 Aug 2025 08:56:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1755186989; x=1755791789; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Svq7qseUrNtldzbZ0qzqJnQgBxG3tF3m1Pv4UZc1zUI=; b=cXo7Zr2UUreGQbmiy/pZucQ89c5uQ3PXtGXLyyHSdOwNTI9fEsXzLukCZIe7RJqFM9 mFO4+1tY3chXD/BbK9qcAohDgKAmxspwpX08IkDOuOKNjQuJoWLg/KSeW3rFZSGCQPEY CpBVlBehzaXs+JMVayVzhCxwnQ7mVFipO/GwBQuEOSGS/GoX+pwezuLyi3VwzQSAtJw+ tn9+H/pUDOz/XQjVW1uDJguvhLDJdkJcxOtBSInykkiw+wak9JRVwNKs2TQEqkTfMLl4 YyV98dW/v/tCrxmHGa+mzftYUyWzkT/r64rXhCTB167Q01k2ZGavr5ib60j7JWIYZTJq vQwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755186989; x=1755791789; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Svq7qseUrNtldzbZ0qzqJnQgBxG3tF3m1Pv4UZc1zUI=; b=b76+KX7rDG+lWFOSi+DjVe3vCuVSXTSW9wpiv83QVKq8RPkU0WA9fuDcvuTqzxJKwu NPeYOLJAstYXTab02KHUSSR/38YFcjFmz6C5xQNQr4PqdgDlOPnfjQ++zBLA2r9hbq3g /mUOQkDDdvPRBtGIke0+pqD6yuDNFdx/Z0nYil10G4KsCv8yFwdezO0yQ/Wsz0IqloOA RH+csxsNY2/5D2e1/JZgDN567bbjwo7YGSsWZ/L+UbsfXOsZr6ndyAkwjzg1jNEb00wq uEqA1mibWuj4N/M03dft0trWjUVSkfTrm2idmSETSlhqaLl13xzG4wLaUjxhEwcb58JV S/jA== X-Forwarded-Encrypted: i=1; AJvYcCWc3RZgbRlwXVz5WJ+2frUgYYiPjxgv6ganLzp+mJigVm/dTZdUsU/bbeS+BgBfOcgvqmFbeE9LWGzaoHc=@vger.kernel.org X-Gm-Message-State: AOJu0YyL3x0c/nvBitr5bVWR9wyTbNcr9kSM9lfnjQ8yi5CBdieocm8r sqyWb8vmHXZ05JVT2iQXitdWR0B1GhP5Tb7gvEzzsA9/hcpmb51BnTPsYtXh8dTr2h8= X-Gm-Gg: ASbGncsUi+cW+eYwrpbknao23noDS/BJn5/mirj+BH/0NOQoIlyXxXA3/XFqx7iP+sN XI2CqC48lwcWRJEcy1wUHbKCkO/UbI2f9MkF1RpvCYYgE5CaHZNEYtviLlMKAqXWiaUjIMG+ASh s9oMHzmOscOs4RMza571fm8GhEWJzZ+klqVele89YsYT7TYZQKZDfaZ+T5ZAs8fB/GZlxUg8xxW aXeBna4QpPq9jjCihv8UYPmN2S1BsVy6H3vbUyiVNnkpf2SPfP0iMCQ/6CMdTFr5FAfzK59f5zb l0Y/ApIMkB1kFx6XsK4aFOTovPMrXpkM5fx4FprZU6LRXDT7CW8mIscnoSQ3h8rm8nYj2a82vvr MuHwKS+M9p2AyHMhk4iYYUEQvqI4M9bk5FuBJYuqd/vEgzhcjQDA5H1IgILu8GfZ+h+bGYrIS X-Google-Smtp-Source: AGHT+IHWMmf5xN+1nUuUZiP9NZI9A2OjHQdZYcHTdLM60KutAKjF+UXZWVbDMBBXW8FB6v09Xkb8yg== X-Received: by 2002:a17:90b:4990:b0:31f:ecf:36f with SMTP id 98e67ed59e1d1-3232969ad39mr5129703a91.1.1755186988804; Thu, 14 Aug 2025 08:56:28 -0700 (PDT) Received: from anup-ubuntu-vm.localdomain ([103.97.166.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3233108e1d9sm2225500a91.29.2025.08.14.08.56.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Aug 2025 08:56:28 -0700 (PDT) From: Anup Patel To: Atish Patra Cc: Palmer Dabbelt , Paul Walmsley , Alexandre Ghiti , Andrew Jones , Anup Patel , Paolo Bonzini , Shuah Khan , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Anup Patel Subject: [PATCH 5/6] RISC-V: KVM: Implement ONE_REG interface for SBI FWFT state Date: Thu, 14 Aug 2025 21:25:47 +0530 Message-ID: <20250814155548.457172-6-apatel@ventanamicro.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814155548.457172-1-apatel@ventanamicro.com> References: <20250814155548.457172-1-apatel@ventanamicro.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The KVM user-space needs a way to save/restore the state of SBI FWFT features so implement SBI extension ONE_REG callbacks. Signed-off-by: Anup Patel --- arch/riscv/include/uapi/asm/kvm.h | 14 +++ arch/riscv/kvm/vcpu_sbi_fwft.c | 169 +++++++++++++++++++++++++++--- 2 files changed, 171 insertions(+), 12 deletions(-) diff --git a/arch/riscv/include/uapi/asm/kvm.h b/arch/riscv/include/uapi/as= m/kvm.h index a5ca0f4ce2d3..fc5624e89c7b 100644 --- a/arch/riscv/include/uapi/asm/kvm.h +++ b/arch/riscv/include/uapi/asm/kvm.h @@ -215,6 +215,17 @@ struct kvm_riscv_sbi_sta { unsigned long shmem_hi; }; =20 +struct kvm_riscv_sbi_fwft_feature { + unsigned long flags; + unsigned long value; +}; + +/* SBI FWFT extension registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_sbi_fwft { + struct kvm_riscv_sbi_fwft_feature misaligned_deleg; + struct kvm_riscv_sbi_fwft_feature pointer_masking; +}; + /* Possible states for kvm_riscv_timer */ #define KVM_RISCV_TIMER_STATE_OFF 0 #define KVM_RISCV_TIMER_STATE_ON 1 @@ -298,6 +309,9 @@ struct kvm_riscv_sbi_sta { #define KVM_REG_RISCV_SBI_STA (0x0 << KVM_REG_RISCV_SUBTYPE_SHIFT) #define KVM_REG_RISCV_SBI_STA_REG(name) \ (offsetof(struct kvm_riscv_sbi_sta, name) / sizeof(unsigned long)) +#define KVM_REG_RISCV_SBI_FWFT (0x1 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_SBI_FWFT_REG(name) \ + (offsetof(struct kvm_riscv_sbi_fwft, name) / sizeof(unsigned long)) =20 /* Device Control API: RISC-V AIA */ #define KVM_DEV_RISCV_APLIC_ALIGN 0x1000 diff --git a/arch/riscv/kvm/vcpu_sbi_fwft.c b/arch/riscv/kvm/vcpu_sbi_fwft.c index 5a3bad0f9330..0d740e7c5713 100644 --- a/arch/riscv/kvm/vcpu_sbi_fwft.c +++ b/arch/riscv/kvm/vcpu_sbi_fwft.c @@ -22,6 +22,11 @@ struct kvm_sbi_fwft_feature { */ enum sbi_fwft_feature_t id; =20 + /** + * @flags_reg_num: ONE_REG index of the feature flag + */ + unsigned long flags_reg_num; + /** * @supported: Check if the feature is supported on the vcpu * @@ -44,7 +49,8 @@ struct kvm_sbi_fwft_feature { * * This callback is mandatory */ - long (*set)(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, unsi= gned long value); + long (*set)(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, + bool one_reg_access, unsigned long value); =20 /** * @get: Get the feature current value @@ -53,7 +59,8 @@ struct kvm_sbi_fwft_feature { * * This callback is mandatory */ - long (*get)(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, unsi= gned long *value); + long (*get)(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, + bool one_reg_access, unsigned long *value); }; =20 static const enum sbi_fwft_feature_t kvm_fwft_defined_features[] =3D { @@ -91,16 +98,18 @@ static void kvm_sbi_fwft_reset_misaligned_delegation(st= ruct kvm_vcpu *vcpu) =20 static long kvm_sbi_fwft_set_misaligned_delegation(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, - unsigned long value) + bool one_reg_access, unsigned long value) { struct kvm_vcpu_config *cfg =3D &vcpu->arch.cfg; =20 if (value =3D=3D 1) { cfg->hedeleg |=3D MIS_DELEG; - csr_set(CSR_HEDELEG, MIS_DELEG); + if (!one_reg_access) + csr_set(CSR_HEDELEG, MIS_DELEG); } else if (value =3D=3D 0) { cfg->hedeleg &=3D ~MIS_DELEG; - csr_clear(CSR_HEDELEG, MIS_DELEG); + if (!one_reg_access) + csr_clear(CSR_HEDELEG, MIS_DELEG); } else { return SBI_ERR_INVALID_PARAM; } @@ -110,10 +119,11 @@ static long kvm_sbi_fwft_set_misaligned_delegation(st= ruct kvm_vcpu *vcpu, =20 static long kvm_sbi_fwft_get_misaligned_delegation(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, - unsigned long *value) + bool one_reg_access, unsigned long *value) { - *value =3D (csr_read(CSR_HEDELEG) & MIS_DELEG) =3D=3D MIS_DELEG; + struct kvm_vcpu_config *cfg =3D &vcpu->arch.cfg; =20 + *value =3D (cfg->hedeleg & MIS_DELEG) =3D=3D MIS_DELEG; return SBI_SUCCESS; } =20 @@ -145,7 +155,7 @@ static void kvm_sbi_fwft_reset_pointer_masking_pmlen(st= ruct kvm_vcpu *vcpu) =20 static long kvm_sbi_fwft_set_pointer_masking_pmlen(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, - unsigned long value) + bool one_reg_access, unsigned long value) { struct kvm_sbi_fwft *fwft =3D vcpu_to_fwft(vcpu); unsigned long pmm; @@ -167,14 +177,15 @@ static long kvm_sbi_fwft_set_pointer_masking_pmlen(st= ruct kvm_vcpu *vcpu, * update here so that VCPU see's pointer masking mode change * immediately. */ - csr_write(CSR_HENVCFG, vcpu->arch.cfg.henvcfg); + if (!one_reg_access) + csr_write(CSR_HENVCFG, vcpu->arch.cfg.henvcfg); =20 return SBI_SUCCESS; } =20 static long kvm_sbi_fwft_get_pointer_masking_pmlen(struct kvm_vcpu *vcpu, struct kvm_sbi_fwft_config *conf, - unsigned long *value) + bool one_reg_access, unsigned long *value) { switch (vcpu->arch.cfg.henvcfg & ENVCFG_PMM) { case ENVCFG_PMM_PMLEN_0: @@ -198,6 +209,8 @@ static long kvm_sbi_fwft_get_pointer_masking_pmlen(stru= ct kvm_vcpu *vcpu, static const struct kvm_sbi_fwft_feature features[] =3D { { .id =3D SBI_FWFT_MISALIGNED_EXC_DELEG, + .flags_reg_num =3D offsetof(struct kvm_riscv_sbi_fwft, misaligned_deleg.= flags) / + sizeof(unsigned long), .supported =3D kvm_sbi_fwft_misaligned_delegation_supported, .reset =3D kvm_sbi_fwft_reset_misaligned_delegation, .set =3D kvm_sbi_fwft_set_misaligned_delegation, @@ -206,6 +219,8 @@ static const struct kvm_sbi_fwft_feature features[] =3D= { #ifndef CONFIG_32BIT { .id =3D SBI_FWFT_POINTER_MASKING_PMLEN, + .flags_reg_num =3D offsetof(struct kvm_riscv_sbi_fwft, pointer_masking.f= lags) / + sizeof(unsigned long), .supported =3D kvm_sbi_fwft_pointer_masking_pmlen_supported, .reset =3D kvm_sbi_fwft_reset_pointer_masking_pmlen, .set =3D kvm_sbi_fwft_set_pointer_masking_pmlen, @@ -214,6 +229,21 @@ static const struct kvm_sbi_fwft_feature features[] = =3D { #endif }; =20 +static const struct kvm_sbi_fwft_feature *kvm_sbi_fwft_regnum_to_feature(u= nsigned long reg_num) +{ + const struct kvm_sbi_fwft_feature *feature; + int i; + + for (i =3D 0; i < ARRAY_SIZE(features); i++) { + feature =3D &features[i]; + if (feature->flags_reg_num =3D=3D reg_num || + (feature->flags_reg_num + 1) =3D=3D reg_num) + return feature; + } + + return NULL; +} + static struct kvm_sbi_fwft_config * kvm_sbi_fwft_get_config(struct kvm_vcpu *vcpu, enum sbi_fwft_feature_t fea= ture) { @@ -267,7 +297,7 @@ static int kvm_sbi_fwft_set(struct kvm_vcpu *vcpu, u32 = feature, =20 conf->flags =3D flags; =20 - return conf->feature->set(vcpu, conf, value); + return conf->feature->set(vcpu, conf, false, value); } =20 static int kvm_sbi_fwft_get(struct kvm_vcpu *vcpu, unsigned long feature, @@ -280,7 +310,7 @@ static int kvm_sbi_fwft_get(struct kvm_vcpu *vcpu, unsi= gned long feature, if (ret) return ret; =20 - return conf->feature->get(vcpu, conf, value); + return conf->feature->get(vcpu, conf, false, value); } =20 static int kvm_sbi_ext_fwft_handler(struct kvm_vcpu *vcpu, struct kvm_run = *run, @@ -354,6 +384,115 @@ static void kvm_sbi_ext_fwft_reset(struct kvm_vcpu *v= cpu) } } =20 +static unsigned long kvm_sbi_ext_fwft_get_reg_count(struct kvm_vcpu *vcpu) +{ + unsigned long max_reg_count =3D sizeof(struct kvm_riscv_sbi_fwft) / sizeo= f(unsigned long); + const struct kvm_sbi_fwft_feature *feature; + struct kvm_sbi_fwft_config *conf; + unsigned long reg, ret =3D 0; + + for (reg =3D 0; reg < max_reg_count; reg++) { + feature =3D kvm_sbi_fwft_regnum_to_feature(reg); + if (!feature) + continue; + + conf =3D kvm_sbi_fwft_get_config(vcpu, feature->id); + if (!conf || !conf->supported) + continue; + + ret++; + } + + return ret; +} + +static int kvm_sbi_ext_fwft_get_reg_id(struct kvm_vcpu *vcpu, int index, u= 64 *reg_id) +{ + int reg, max_reg_count =3D sizeof(struct kvm_riscv_sbi_fwft) / sizeof(uns= igned long); + const struct kvm_sbi_fwft_feature *feature; + struct kvm_sbi_fwft_config *conf; + int idx =3D 0; + + for (reg =3D 0; reg < max_reg_count; reg++) { + feature =3D kvm_sbi_fwft_regnum_to_feature(reg); + if (!feature) + continue; + + conf =3D kvm_sbi_fwft_get_config(vcpu, feature->id); + if (!conf || !conf->supported) + continue; + + if (index =3D=3D idx) { + *reg_id =3D KVM_REG_RISCV | + (IS_ENABLED(CONFIG_32BIT) ? + KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64) | + KVM_REG_RISCV_SBI_STATE | + KVM_REG_RISCV_SBI_FWFT | reg; + return 0; + } + + idx++; + } + + return -ENOENT; +} + +static int kvm_sbi_ext_fwft_get_reg(struct kvm_vcpu *vcpu, unsigned long r= eg_num, + unsigned long reg_size, void *reg_val) +{ + const struct kvm_sbi_fwft_feature *feature; + struct kvm_sbi_fwft_config *conf; + unsigned long *value; + int ret =3D 0; + + if (reg_size !=3D sizeof(unsigned long)) + return -EINVAL; + value =3D reg_val; + + feature =3D kvm_sbi_fwft_regnum_to_feature(reg_num); + if (!feature) + return -ENOENT; + + conf =3D kvm_sbi_fwft_get_config(vcpu, feature->id); + if (!conf || !conf->supported) + return -ENOENT; + + if (feature->flags_reg_num =3D=3D reg_num) + *value =3D conf->flags; + else + ret =3D conf->feature->get(vcpu, conf, true, value); + + return sbi_err_map_linux_errno(ret); +} + +static int kvm_sbi_ext_fwft_set_reg(struct kvm_vcpu *vcpu, unsigned long r= eg_num, + unsigned long reg_size, const void *reg_val) +{ + const struct kvm_sbi_fwft_feature *feature; + struct kvm_sbi_fwft_config *conf; + unsigned long value; + int ret =3D 0; + + if (reg_size !=3D sizeof(unsigned long)) + return -EINVAL; + value =3D *(const unsigned long *)reg_val; + + feature =3D kvm_sbi_fwft_regnum_to_feature(reg_num); + if (!feature) + return -ENOENT; + + conf =3D kvm_sbi_fwft_get_config(vcpu, feature->id); + if (!conf || !conf->supported) + return -ENOENT; + + if (feature->flags_reg_num =3D=3D reg_num) + conf->flags =3D value & SBI_FWFT_SET_FLAG_LOCK; + else + ret =3D conf->feature->set(vcpu, conf, true, value); + + return sbi_err_map_linux_errno(ret); +} + const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_fwft =3D { .extid_start =3D SBI_EXT_FWFT, .extid_end =3D SBI_EXT_FWFT, @@ -361,4 +500,10 @@ const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_fwft = =3D { .init =3D kvm_sbi_ext_fwft_init, .deinit =3D kvm_sbi_ext_fwft_deinit, .reset =3D kvm_sbi_ext_fwft_reset, + .have_state =3D true, + .state_reg_subtype =3D KVM_REG_RISCV_SBI_FWFT, + .get_state_reg_count =3D kvm_sbi_ext_fwft_get_reg_count, + .get_state_reg_id =3D kvm_sbi_ext_fwft_get_reg_id, + .get_state_reg =3D kvm_sbi_ext_fwft_get_reg, + .set_state_reg =3D kvm_sbi_ext_fwft_set_reg, }; --=20 2.43.0 From nobody Sat Oct 4 15:59:02 2025 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (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 9056A248869 for ; Thu, 14 Aug 2025 15:56:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186997; cv=none; b=LvFpX9EM0yaJ2odbtvXeyTeIAxrQurIE2jiuCPC1Cndug9T262TABfsTGCrUbwt5YcEp0mYsVFRTab+kdGcNhRwUHzBB3NQTl4RzPVtBLHn4PqHl+mgYvn19kx0VKoxmHwipKV6Z4I6fd8PioS+RsK+5baUMUeB9ZIkRL+xPHrI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755186997; c=relaxed/simple; bh=G9gBXgS5ZP2+2D3CVqP+3wrJpRXlPa7RbLzeqdLAE8E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Mg8OVf+YQhvXNYE4AKj+sI+9HQfCyc1inJPjiJiK6slvb1xVkPtwWGHNPjUeo2gGuCQTZE9jYYI7d2OUoJNUaiwflTzclcmGCj++PIibq92sUT86w2IPp6ZJfN4yBO77RUdDq+VkdhvveHUU7Opa+mmdJaHMdmv+IBo8iZv3GtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com; spf=pass smtp.mailfrom=ventanamicro.com; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b=pjBFEwC2; arc=none smtp.client-ip=209.85.215.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ventanamicro.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ventanamicro.com header.i=@ventanamicro.com header.b="pjBFEwC2" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-b47174c8e45so938821a12.2 for ; Thu, 14 Aug 2025 08:56:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1755186995; x=1755791795; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cSJAzpJrB/+0Vhq3Jx8mxwwAXiXUMS9lCBbypwhOCgE=; b=pjBFEwC2Xzb2hGf2VxS0T80g4QoDHHd9ZXXmjfPgYSNAQolkmzgp77YEcR3uoS6mUV q8hgKr1T4c0Rhu4bpW5prEK3iHhzLHpG9GtRkgWaet5HPdhVV6GrH78PSrbNdPwbPnJh 9+yjMMJWTbxVYQzHT2SQyll5H2UbPXtIfe5pR9aNS3zNxQ71M2jbFIITGzMzZKyj4T6h /idDtf734hsXxbIdiF/o+uFWutKSE5nsFuM3F/koTAPeU2eS5iLbtTLtdEw8FUqqlyB1 vBlbg45fkfY3BbA+VepInS9y9lQsUbEjXXNdDDvsOr9g78rnIlxnKnZCcCDp63Xm4zpK aFxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755186995; x=1755791795; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cSJAzpJrB/+0Vhq3Jx8mxwwAXiXUMS9lCBbypwhOCgE=; b=X9x5lam0tbjY49IN2jNaqQSi1NKFw5ipEWOgRQtGtqsRu9OeKssLn7YfOT9TWTX25s 96uFmUl9ScyfELGpCFdxwt5tWbm6WL3qd4ZrXXbvQHQ7ECCfN7aMG6qxOX2Td9Y8SQTo zdtAmWWqOPzL6QP7wvLZSRhO8eAU9VCfefVH/Hd9TkLorFBjqt8t0DxyKtxkof3ekjwg 5HAA0ZtoTHfVpeiJooWKCGW2u2gUz10yYyOhbYqy6Tt7FRT10m8OtuFTAGh/bMLiaFh2 KzToZrS4ZfieyWH1zzJiQUHSfpGfQsJ+rGluzv6Ayipj2XQUjFye6eQRykSjcnV9YcKe zQug== X-Forwarded-Encrypted: i=1; AJvYcCXGqYi76g/0Fl929EMDtvmD5KVGTHga1+frUo3RTO7D+xzzyjisXPHK1W0U8B4EpwSkILuQq9SCKLjv57E=@vger.kernel.org X-Gm-Message-State: AOJu0YxGGHBIx3jDAQyApoaivurDLNMiMw97mjFKyXBSMFBFnp9hrMb4 bRv+V/H1t1L6vXCCoEt0YB/tTf1DkwwFteh/qbwbKfas3uD12DEp5pvqrujyRQzaltc= X-Gm-Gg: ASbGncvu/kZnsFp8qC4i84UPaX1Ww49CYoZFYXPrhEm4oXi0gCh2+C/7cCOCNBH7ZET ULfcByHnhK7euEzD65sU0pNF4gv7Dfl58bUtxbbzGc8QmtXsGFkqpJe/UD/I/H6RrOprgpvXaH6 nbxaNe23WlycUhBMKaGtk/Jmf4oESPousYhte2Mu8/hFp4lzMuX6yaY+3CCXys+X6U4ilkk1J5W i3/FelXfsAGK0rwcunhISgHTs++U6zsW73336GaHAstlIsUaUDguVkMGUsoeCZ99ADUFeDHHzN7 /7PwU4bCRSvbXcp1ZrhVldU+hdsclkp2NHMwikyNTnH1bx3hTFMYu9zz64NprvRWQ/YT0i5Lroz EeUhTFb+e/UdfZSziWYDnQwtRgEWu3qIp8goAAl1zr9An0VRk89pjNYq9rrLFOw== X-Google-Smtp-Source: AGHT+IGJVdqHFLQAppNcJd7AUqhrBmK4Q+zaiql1Y8W6JMc1bdxvvOyGCokaiILV9/xyDSM5iDy5Dw== X-Received: by 2002:a17:903:984:b0:224:23be:c569 with SMTP id d9443c01a7336-2445853c0ecmr58111655ad.22.1755186994714; Thu, 14 Aug 2025 08:56:34 -0700 (PDT) Received: from anup-ubuntu-vm.localdomain ([103.97.166.196]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3233108e1d9sm2225500a91.29.2025.08.14.08.56.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Aug 2025 08:56:34 -0700 (PDT) From: Anup Patel To: Atish Patra Cc: Palmer Dabbelt , Paul Walmsley , Alexandre Ghiti , Andrew Jones , Anup Patel , Paolo Bonzini , Shuah Khan , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Anup Patel Subject: [PATCH 6/6] KVM: riscv: selftests: Add SBI FWFT to get-reg-list test Date: Thu, 14 Aug 2025 21:25:48 +0530 Message-ID: <20250814155548.457172-7-apatel@ventanamicro.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814155548.457172-1-apatel@ventanamicro.com> References: <20250814155548.457172-1-apatel@ventanamicro.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" KVM RISC-V now supports SBI FWFT, so add it to the get-reg-list test. Signed-off-by: Anup Patel --- .../selftests/kvm/riscv/get-reg-list.c | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tools/testing/selftests/kvm/riscv/get-reg-list.c b/tools/testi= ng/selftests/kvm/riscv/get-reg-list.c index a0b7dabb5040..1bc84f09b4ee 100644 --- a/tools/testing/selftests/kvm/riscv/get-reg-list.c +++ b/tools/testing/selftests/kvm/riscv/get-reg-list.c @@ -128,6 +128,7 @@ bool filter_reg(__u64 reg) case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT= _DBCN: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT= _SUSP: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT= _STA: + case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT= _FWFT: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT= _EXPERIMENTAL: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT= _VENDOR: return true; @@ -627,6 +628,7 @@ static const char *sbi_ext_single_id_to_str(__u64 reg_o= ff) KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_DBCN), KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_SUSP), KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_STA), + KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_FWFT), KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_EXPERIMENTAL), KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_VENDOR), }; @@ -683,6 +685,17 @@ static const char *sbi_sta_id_to_str(__u64 reg_off) return strdup_printf("KVM_REG_RISCV_SBI_STA | %lld /* UNKNOWN */", reg_of= f); } =20 +static const char *sbi_fwft_id_to_str(__u64 reg_off) +{ + switch (reg_off) { + case 0: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misal= igned_deleg.flags)"; + case 1: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misal= igned_deleg.value)"; + case 2: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(point= er_masking.flags)"; + case 3: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(point= er_masking.value)"; + } + return strdup_printf("KVM_REG_RISCV_SBI_STA | %lld /* UNKNOWN */", reg_of= f); +} + static const char *sbi_id_to_str(const char *prefix, __u64 id) { __u64 reg_off =3D id & ~(REG_MASK | KVM_REG_RISCV_SBI_STATE); @@ -695,6 +708,8 @@ static const char *sbi_id_to_str(const char *prefix, __= u64 id) switch (reg_subtype) { case KVM_REG_RISCV_SBI_STA: return sbi_sta_id_to_str(reg_off); + case KVM_REG_RISCV_SBI_FWFT: + return sbi_fwft_id_to_str(reg_off); } =20 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off); @@ -859,6 +874,14 @@ static __u64 sbi_sta_regs[] =3D { KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RI= SCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_hi), }; =20 +static __u64 sbi_fwft_regs[] =3D { + KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISC= V_SBI_SINGLE | KVM_RISCV_SBI_EXT_FWFT, + KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RI= SCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.flags), + KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RI= SCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.value), + KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RI= SCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.flags), + KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RI= SCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.value), +}; + static __u64 zicbom_regs[] =3D { KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV= _CONFIG_REG(zicbom_block_size), KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISC= V_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM, @@ -1010,6 +1033,9 @@ static __u64 vector_regs[] =3D { #define SUBLIST_SBI_STA \ {"sbi-sta", .feature_type =3D VCPU_FEATURE_SBI_EXT, .feature =3D KVM_RISC= V_SBI_EXT_STA, \ .regs =3D sbi_sta_regs, .regs_n =3D ARRAY_SIZE(sbi_sta_regs),} +#define SUBLIST_SBI_FWFT \ + {"sbi-fwft", .feature_type =3D VCPU_FEATURE_SBI_EXT, .feature =3D KVM_RIS= CV_SBI_EXT_FWFT, \ + .regs =3D sbi_fwft_regs, .regs_n =3D ARRAY_SIZE(sbi_fwft_regs),} #define SUBLIST_ZICBOM \ {"zicbom", .feature =3D KVM_RISCV_ISA_EXT_ZICBOM, .regs =3D zicbom_regs, = .regs_n =3D ARRAY_SIZE(zicbom_regs),} #define SUBLIST_ZICBOZ \ @@ -1092,6 +1118,7 @@ KVM_SBI_EXT_SUBLIST_CONFIG(sta, STA); KVM_SBI_EXT_SIMPLE_CONFIG(pmu, PMU); KVM_SBI_EXT_SIMPLE_CONFIG(dbcn, DBCN); KVM_SBI_EXT_SIMPLE_CONFIG(susp, SUSP); +KVM_SBI_EXT_SUBLIST_CONFIG(fwft, FWFT); =20 KVM_ISA_EXT_SUBLIST_CONFIG(aia, AIA); KVM_ISA_EXT_SUBLIST_CONFIG(fp_f, FP_F); @@ -1167,6 +1194,7 @@ struct vcpu_reg_list *vcpu_configs[] =3D { &config_sbi_pmu, &config_sbi_dbcn, &config_sbi_susp, + &config_sbi_fwft, &config_aia, &config_fp_f, &config_fp_d, --=20 2.43.0