diff options
Diffstat (limited to 'virt/kvm/arm/vgic/vgic-mmio-v2.c')
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio-v2.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v2.c b/virt/kvm/arm/vgic/vgic-mmio-v2.c index a3ad7ff95c9b..0a4283ed9aa7 100644 --- a/virt/kvm/arm/vgic/vgic-mmio-v2.c +++ b/virt/kvm/arm/vgic/vgic-mmio-v2.c | |||
| @@ -229,7 +229,15 @@ static unsigned long vgic_mmio_read_vcpuif(struct kvm_vcpu *vcpu, | |||
| 229 | val = vmcr.ctlr; | 229 | val = vmcr.ctlr; |
| 230 | break; | 230 | break; |
| 231 | case GIC_CPU_PRIMASK: | 231 | case GIC_CPU_PRIMASK: |
| 232 | val = vmcr.pmr; | 232 | /* |
| 233 | * Our KVM_DEV_TYPE_ARM_VGIC_V2 device ABI exports the | ||
| 234 | * the PMR field as GICH_VMCR.VMPriMask rather than | ||
| 235 | * GICC_PMR.Priority, so we expose the upper five bits of | ||
| 236 | * priority mask to userspace using the lower bits in the | ||
| 237 | * unsigned long. | ||
| 238 | */ | ||
| 239 | val = (vmcr.pmr & GICV_PMR_PRIORITY_MASK) >> | ||
| 240 | GICV_PMR_PRIORITY_SHIFT; | ||
| 233 | break; | 241 | break; |
| 234 | case GIC_CPU_BINPOINT: | 242 | case GIC_CPU_BINPOINT: |
| 235 | val = vmcr.bpr; | 243 | val = vmcr.bpr; |
| @@ -262,7 +270,15 @@ static void vgic_mmio_write_vcpuif(struct kvm_vcpu *vcpu, | |||
| 262 | vmcr.ctlr = val; | 270 | vmcr.ctlr = val; |
| 263 | break; | 271 | break; |
| 264 | case GIC_CPU_PRIMASK: | 272 | case GIC_CPU_PRIMASK: |
| 265 | vmcr.pmr = val; | 273 | /* |
| 274 | * Our KVM_DEV_TYPE_ARM_VGIC_V2 device ABI exports the | ||
| 275 | * the PMR field as GICH_VMCR.VMPriMask rather than | ||
| 276 | * GICC_PMR.Priority, so we expose the upper five bits of | ||
| 277 | * priority mask to userspace using the lower bits in the | ||
| 278 | * unsigned long. | ||
| 279 | */ | ||
| 280 | vmcr.pmr = (val << GICV_PMR_PRIORITY_SHIFT) & | ||
| 281 | GICV_PMR_PRIORITY_MASK; | ||
| 266 | break; | 282 | break; |
| 267 | case GIC_CPU_BINPOINT: | 283 | case GIC_CPU_BINPOINT: |
| 268 | vmcr.bpr = val; | 284 | vmcr.bpr = val; |
