Skip to content

Commit e23844b

Browse files
committed
Merge tag 'kvmarm-fixes-7.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD
KVM/arm64 fixes for 7.1, take #3 - Fix ITS EventID sanitisation when restoring an interrupt translation table. - Fix PPI memory leak when failing to initialise a vcpu. - Correctly return an error when the validation of a hypervisor trace descriptor fails, and limit this validation to protected mode only.
2 parents 5200f5f + 1702da7 commit e23844b

3 files changed

Lines changed: 14 additions & 3 deletions

File tree

arch/arm64/kvm/arm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,8 +555,10 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
555555
kvm_destroy_mpidr_data(vcpu->kvm);
556556

557557
err = kvm_vgic_vcpu_init(vcpu);
558-
if (err)
558+
if (err) {
559+
kvm_vgic_vcpu_destroy(vcpu);
559560
return err;
561+
}
560562

561563
err = kvm_share_hyp(vcpu, vcpu + 1);
562564
if (err)

arch/arm64/kvm/hyp/nvhe/trace.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,16 @@ static int hyp_trace_buffer_load(struct hyp_trace_buffer *trace_buffer,
164164
return ret;
165165
}
166166

167-
static bool hyp_trace_desc_validate(struct hyp_trace_desc *desc, size_t desc_size)
167+
static bool hyp_trace_desc_is_valid(struct hyp_trace_desc *desc, size_t desc_size)
168168
{
169169
struct ring_buffer_desc *rb_desc;
170170
unsigned int cpu;
171171
size_t nr_bpages;
172172
void *desc_end;
173173

174+
if (!is_protected_kvm_enabled())
175+
return true;
176+
174177
/*
175178
* Both desc_size and bpages_backing_size are untrusted host-provided
176179
* values. We rely on __pkvm_host_donate_hyp() to enforce their validity.
@@ -212,8 +215,10 @@ int __tracing_load(unsigned long desc_hva, size_t desc_size)
212215
if (ret)
213216
return ret;
214217

215-
if (!hyp_trace_desc_validate(desc, desc_size))
218+
if (!hyp_trace_desc_is_valid(desc, desc_size)) {
219+
ret = -EINVAL;
216220
goto err_release_desc;
221+
}
217222

218223
hyp_spin_lock(&trace_buffer.lock);
219224

arch/arm64/kvm/vgic/vgic-its.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,10 @@ static int vgic_its_restore_dte(struct vgic_its *its, u32 id,
23072307
/* dte entry is valid */
23082308
offset = (entry & KVM_ITS_DTE_NEXT_MASK) >> KVM_ITS_DTE_NEXT_SHIFT;
23092309

2310+
/* Mimic the MAPD behaviour and reject invalid EID bits. */
2311+
if (num_eventid_bits > VITS_TYPER_IDBITS)
2312+
return -EINVAL;
2313+
23102314
if (!vgic_its_check_id(its, baser, id, NULL))
23112315
return -EINVAL;
23122316

0 commit comments

Comments
 (0)