@@ -273,6 +273,23 @@ static unsigned long vgic_mmio_read_v3r_typer(struct kvm_vcpu *vcpu,
273
273
return extract_bytes (value , addr & 7 , len );
274
274
}
275
275
276
+ static unsigned long vgic_uaccess_read_v3r_typer (struct kvm_vcpu * vcpu ,
277
+ gpa_t addr , unsigned int len )
278
+ {
279
+ unsigned long mpidr = kvm_vcpu_get_mpidr_aff (vcpu );
280
+ int target_vcpu_id = vcpu -> vcpu_id ;
281
+ u64 value ;
282
+
283
+ value = (u64 )(mpidr & GENMASK (23 , 0 )) << 32 ;
284
+ value |= ((target_vcpu_id & 0xffff ) << 8 );
285
+
286
+ if (vgic_has_its (vcpu -> kvm ))
287
+ value |= GICR_TYPER_PLPIS ;
288
+
289
+ /* reporting of the Last bit is not supported for userspace */
290
+ return extract_bytes (value , addr & 7 , len );
291
+ }
292
+
276
293
static unsigned long vgic_mmio_read_v3r_iidr (struct kvm_vcpu * vcpu ,
277
294
gpa_t addr , unsigned int len )
278
295
{
@@ -593,8 +610,9 @@ static const struct vgic_register_region vgic_v3_rd_registers[] = {
593
610
REGISTER_DESC_WITH_LENGTH (GICR_IIDR ,
594
611
vgic_mmio_read_v3r_iidr , vgic_mmio_write_wi , 4 ,
595
612
VGIC_ACCESS_32bit ),
596
- REGISTER_DESC_WITH_LENGTH (GICR_TYPER ,
597
- vgic_mmio_read_v3r_typer , vgic_mmio_write_wi , 8 ,
613
+ REGISTER_DESC_WITH_LENGTH_UACCESS (GICR_TYPER ,
614
+ vgic_mmio_read_v3r_typer , vgic_mmio_write_wi ,
615
+ vgic_uaccess_read_v3r_typer , vgic_mmio_uaccess_write_wi , 8 ,
598
616
VGIC_ACCESS_64bit | VGIC_ACCESS_32bit ),
599
617
REGISTER_DESC_WITH_LENGTH (GICR_WAKER ,
600
618
vgic_mmio_read_raz , vgic_mmio_write_wi , 4 ,
0 commit comments