mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 19:13:47 +02:00
RISC-V: KVM: Introduce feature specific reset for SBI FWFT
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 <apatel@ventanamicro.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Nutty Liu <nutty.liu@hotmail.com> Link: https://lore.kernel.org/r/20250823155947.1354229-3-apatel@ventanamicro.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
parent
83df1d64d6
commit
a6250b18b5
|
|
@ -30,6 +30,13 @@ struct kvm_sbi_fwft_feature {
|
|||
*/
|
||||
bool (*supported)(struct kvm_vcpu *vcpu);
|
||||
|
||||
/**
|
||||
* @reset: Reset the feature value irrespective whether feature is supported 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();
|
||||
}
|
||||
|
||||
static void kvm_sbi_fwft_reset_misaligned_delegation(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_vcpu_config *cfg = &vcpu->arch.cfg;
|
||||
|
||||
cfg->hedeleg &= ~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_supported(struct kvm_vcpu *vcpu)
|
|||
return fwft->have_vs_pmlen_7 || fwft->have_vs_pmlen_16;
|
||||
}
|
||||
|
||||
static void kvm_sbi_fwft_reset_pointer_masking_pmlen(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
vcpu->arch.cfg.henvcfg &= ~ENVCFG_PMM;
|
||||
}
|
||||
|
||||
static long kvm_sbi_fwft_set_pointer_masking_pmlen(struct kvm_vcpu *vcpu,
|
||||
struct kvm_sbi_fwft_config *conf,
|
||||
unsigned long value)
|
||||
|
|
@ -189,6 +208,7 @@ static const struct kvm_sbi_fwft_feature features[] = {
|
|||
{
|
||||
.id = SBI_FWFT_MISALIGNED_EXC_DELEG,
|
||||
.supported = kvm_sbi_fwft_misaligned_delegation_supported,
|
||||
.reset = kvm_sbi_fwft_reset_misaligned_delegation,
|
||||
.set = kvm_sbi_fwft_set_misaligned_delegation,
|
||||
.get = kvm_sbi_fwft_get_misaligned_delegation,
|
||||
},
|
||||
|
|
@ -196,6 +216,7 @@ static const struct kvm_sbi_fwft_feature features[] = {
|
|||
{
|
||||
.id = SBI_FWFT_POINTER_MASKING_PMLEN,
|
||||
.supported = kvm_sbi_fwft_pointer_masking_pmlen_supported,
|
||||
.reset = kvm_sbi_fwft_reset_pointer_masking_pmlen,
|
||||
.set = kvm_sbi_fwft_set_pointer_masking_pmlen,
|
||||
.get = kvm_sbi_fwft_get_pointer_masking_pmlen,
|
||||
},
|
||||
|
|
@ -330,11 +351,16 @@ static void kvm_sbi_ext_fwft_deinit(struct kvm_vcpu *vcpu)
|
|||
|
||||
static void kvm_sbi_ext_fwft_reset(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
int i;
|
||||
struct kvm_sbi_fwft *fwft = vcpu_to_fwft(vcpu);
|
||||
const struct kvm_sbi_fwft_feature *feature;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(features); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(features); i++) {
|
||||
fwft->configs[i].flags = 0;
|
||||
feature = &features[i];
|
||||
if (feature->reset)
|
||||
feature->reset(vcpu);
|
||||
}
|
||||
}
|
||||
|
||||
const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_fwft = {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user