diff options
author | Eric Auger <eric.auger@redhat.com> | 2017-10-26 11:23:05 -0400 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2017-10-28 22:25:06 -0400 |
commit | c9b51bb60d944067f36f67750e19c18c3cc2697c (patch) | |
tree | 164fc47f98a9839d9d1a852c61337118f611d687 | |
parent | f31b98b57f72dcd458eb63f795f4efe272acc2e3 (diff) |
KVM: arm/arm64: vgic-its: Check CBASER/BASER validity before enabling the ITS
The spec says it is UNPREDICTABLE to enable the ITS
if any of the following conditions are true:
- GITS_CBASER.Valid == 0.
- GITS_BASER<n>.Valid == 0, for any GITS_BASER<n> register
where the Type field indicates Device.
- GITS_BASER<n>.Valid == 0, for any GITS_BASER<n> register
where the Type field indicates Interrupt Collection and
GITS_TYPER.HCC == 0.
In that case, let's keep the ITS disabled.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reported-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
-rw-r--r-- | virt/kvm/arm/vgic/vgic-its.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c index 6a715a6ec64e..e69ef7d27fde 100644 --- a/virt/kvm/arm/vgic/vgic-its.c +++ b/virt/kvm/arm/vgic/vgic-its.c | |||
@@ -1466,6 +1466,16 @@ static void vgic_mmio_write_its_ctlr(struct kvm *kvm, struct vgic_its *its, | |||
1466 | { | 1466 | { |
1467 | mutex_lock(&its->cmd_lock); | 1467 | mutex_lock(&its->cmd_lock); |
1468 | 1468 | ||
1469 | /* | ||
1470 | * It is UNPREDICTABLE to enable the ITS if any of the CBASER or | ||
1471 | * device/collection BASER are invalid | ||
1472 | */ | ||
1473 | if (!its->enabled && (val & GITS_CTLR_ENABLE) && | ||
1474 | (!(its->baser_device_table & GITS_BASER_VALID) || | ||
1475 | !(its->baser_coll_table & GITS_BASER_VALID) || | ||
1476 | !(its->cbaser & GITS_CBASER_VALID))) | ||
1477 | goto out; | ||
1478 | |||
1469 | its->enabled = !!(val & GITS_CTLR_ENABLE); | 1479 | its->enabled = !!(val & GITS_CTLR_ENABLE); |
1470 | 1480 | ||
1471 | /* | 1481 | /* |
@@ -1474,6 +1484,7 @@ static void vgic_mmio_write_its_ctlr(struct kvm *kvm, struct vgic_its *its, | |||
1474 | */ | 1484 | */ |
1475 | vgic_its_process_commands(kvm, its); | 1485 | vgic_its_process_commands(kvm, its); |
1476 | 1486 | ||
1487 | out: | ||
1477 | mutex_unlock(&its->cmd_lock); | 1488 | mutex_unlock(&its->cmd_lock); |
1478 | } | 1489 | } |
1479 | 1490 | ||