@@ -110,6 +110,7 @@ enum cgt_group_id {
110
110
CGT_HCR_TPU_TOCU ,
111
111
CGT_HCR_NV1_nNV2_ENSCXT ,
112
112
CGT_MDCR_TPM_TPMCR ,
113
+ CGT_MDCR_TPM_HPMN ,
113
114
CGT_MDCR_TDE_TDA ,
114
115
CGT_MDCR_TDE_TDOSA ,
115
116
CGT_MDCR_TDE_TDRA ,
@@ -126,6 +127,7 @@ enum cgt_group_id {
126
127
CGT_CNTHCTL_EL1PTEN ,
127
128
128
129
CGT_CPTR_TTA ,
130
+ CGT_MDCR_HPMN ,
129
131
130
132
/* Must be last */
131
133
__NR_CGT_GROUP_IDS__
@@ -441,6 +443,7 @@ static const enum cgt_group_id *coarse_control_combo[] = {
441
443
MCB (CGT_HCR_TPU_TOCU , CGT_HCR_TPU , CGT_HCR_TOCU ),
442
444
MCB (CGT_HCR_NV1_nNV2_ENSCXT , CGT_HCR_NV1_nNV2 , CGT_HCR_ENSCXT ),
443
445
MCB (CGT_MDCR_TPM_TPMCR , CGT_MDCR_TPM , CGT_MDCR_TPMCR ),
446
+ MCB (CGT_MDCR_TPM_HPMN , CGT_MDCR_TPM , CGT_MDCR_HPMN ),
444
447
MCB (CGT_MDCR_TDE_TDA , CGT_MDCR_TDE , CGT_MDCR_TDA ),
445
448
MCB (CGT_MDCR_TDE_TDOSA , CGT_MDCR_TDE , CGT_MDCR_TDOSA ),
446
449
MCB (CGT_MDCR_TDE_TDRA , CGT_MDCR_TDE , CGT_MDCR_TDRA ),
@@ -504,13 +507,42 @@ static enum trap_behaviour check_cptr_tta(struct kvm_vcpu *vcpu)
504
507
return BEHAVE_HANDLE_LOCALLY ;
505
508
}
506
509
510
+ static enum trap_behaviour check_mdcr_hpmn (struct kvm_vcpu * vcpu )
511
+ {
512
+ u32 sysreg = esr_sys64_to_sysreg (kvm_vcpu_get_esr (vcpu ));
513
+ unsigned int idx ;
514
+
515
+
516
+ switch (sysreg ) {
517
+ case SYS_PMEVTYPERn_EL0 (0 ) ... SYS_PMEVTYPERn_EL0 (30 ):
518
+ case SYS_PMEVCNTRn_EL0 (0 ) ... SYS_PMEVCNTRn_EL0 (30 ):
519
+ idx = (sys_reg_CRm (sysreg ) & 0x3 ) << 3 | sys_reg_Op2 (sysreg );
520
+ break ;
521
+ case SYS_PMXEVTYPER_EL0 :
522
+ case SYS_PMXEVCNTR_EL0 :
523
+ idx = SYS_FIELD_GET (PMSELR_EL0 , SEL ,
524
+ __vcpu_sys_reg (vcpu , PMSELR_EL0 ));
525
+ break ;
526
+ default :
527
+ /* Someone used this trap helper for something else... */
528
+ KVM_BUG_ON (1 , vcpu -> kvm );
529
+ return BEHAVE_HANDLE_LOCALLY ;
530
+ }
531
+
532
+ if (kvm_pmu_counter_is_hyp (vcpu , idx ))
533
+ return BEHAVE_FORWARD_RW | BEHAVE_FORWARD_IN_HOST_EL0 ;
534
+
535
+ return BEHAVE_HANDLE_LOCALLY ;
536
+ }
537
+
507
538
#define CCC (id , fn ) \
508
539
[id - __COMPLEX_CONDITIONS__] = fn
509
540
510
541
static const complex_condition_check ccc [] = {
511
542
CCC (CGT_CNTHCTL_EL1PCTEN , check_cnthctl_el1pcten ),
512
543
CCC (CGT_CNTHCTL_EL1PTEN , check_cnthctl_el1pten ),
513
544
CCC (CGT_CPTR_TTA , check_cptr_tta ),
545
+ CCC (CGT_MDCR_HPMN , check_mdcr_hpmn ),
514
546
};
515
547
516
548
/*
@@ -925,77 +957,77 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
925
957
SR_TRAP (SYS_PMOVSCLR_EL0 , CGT_MDCR_TPM ),
926
958
SR_TRAP (SYS_PMCEID0_EL0 , CGT_MDCR_TPM ),
927
959
SR_TRAP (SYS_PMCEID1_EL0 , CGT_MDCR_TPM ),
928
- SR_TRAP (SYS_PMXEVTYPER_EL0 , CGT_MDCR_TPM ),
960
+ SR_TRAP (SYS_PMXEVTYPER_EL0 , CGT_MDCR_TPM_HPMN ),
929
961
SR_TRAP (SYS_PMSWINC_EL0 , CGT_MDCR_TPM ),
930
962
SR_TRAP (SYS_PMSELR_EL0 , CGT_MDCR_TPM ),
931
- SR_TRAP (SYS_PMXEVCNTR_EL0 , CGT_MDCR_TPM ),
963
+ SR_TRAP (SYS_PMXEVCNTR_EL0 , CGT_MDCR_TPM_HPMN ),
932
964
SR_TRAP (SYS_PMCCNTR_EL0 , CGT_MDCR_TPM ),
933
965
SR_TRAP (SYS_PMUSERENR_EL0 , CGT_MDCR_TPM ),
934
966
SR_TRAP (SYS_PMINTENSET_EL1 , CGT_MDCR_TPM ),
935
967
SR_TRAP (SYS_PMINTENCLR_EL1 , CGT_MDCR_TPM ),
936
968
SR_TRAP (SYS_PMMIR_EL1 , CGT_MDCR_TPM ),
937
- SR_TRAP (SYS_PMEVCNTRn_EL0 (0 ), CGT_MDCR_TPM ),
938
- SR_TRAP (SYS_PMEVCNTRn_EL0 (1 ), CGT_MDCR_TPM ),
939
- SR_TRAP (SYS_PMEVCNTRn_EL0 (2 ), CGT_MDCR_TPM ),
940
- SR_TRAP (SYS_PMEVCNTRn_EL0 (3 ), CGT_MDCR_TPM ),
941
- SR_TRAP (SYS_PMEVCNTRn_EL0 (4 ), CGT_MDCR_TPM ),
942
- SR_TRAP (SYS_PMEVCNTRn_EL0 (5 ), CGT_MDCR_TPM ),
943
- SR_TRAP (SYS_PMEVCNTRn_EL0 (6 ), CGT_MDCR_TPM ),
944
- SR_TRAP (SYS_PMEVCNTRn_EL0 (7 ), CGT_MDCR_TPM ),
945
- SR_TRAP (SYS_PMEVCNTRn_EL0 (8 ), CGT_MDCR_TPM ),
946
- SR_TRAP (SYS_PMEVCNTRn_EL0 (9 ), CGT_MDCR_TPM ),
947
- SR_TRAP (SYS_PMEVCNTRn_EL0 (10 ), CGT_MDCR_TPM ),
948
- SR_TRAP (SYS_PMEVCNTRn_EL0 (11 ), CGT_MDCR_TPM ),
949
- SR_TRAP (SYS_PMEVCNTRn_EL0 (12 ), CGT_MDCR_TPM ),
950
- SR_TRAP (SYS_PMEVCNTRn_EL0 (13 ), CGT_MDCR_TPM ),
951
- SR_TRAP (SYS_PMEVCNTRn_EL0 (14 ), CGT_MDCR_TPM ),
952
- SR_TRAP (SYS_PMEVCNTRn_EL0 (15 ), CGT_MDCR_TPM ),
953
- SR_TRAP (SYS_PMEVCNTRn_EL0 (16 ), CGT_MDCR_TPM ),
954
- SR_TRAP (SYS_PMEVCNTRn_EL0 (17 ), CGT_MDCR_TPM ),
955
- SR_TRAP (SYS_PMEVCNTRn_EL0 (18 ), CGT_MDCR_TPM ),
956
- SR_TRAP (SYS_PMEVCNTRn_EL0 (19 ), CGT_MDCR_TPM ),
957
- SR_TRAP (SYS_PMEVCNTRn_EL0 (20 ), CGT_MDCR_TPM ),
958
- SR_TRAP (SYS_PMEVCNTRn_EL0 (21 ), CGT_MDCR_TPM ),
959
- SR_TRAP (SYS_PMEVCNTRn_EL0 (22 ), CGT_MDCR_TPM ),
960
- SR_TRAP (SYS_PMEVCNTRn_EL0 (23 ), CGT_MDCR_TPM ),
961
- SR_TRAP (SYS_PMEVCNTRn_EL0 (24 ), CGT_MDCR_TPM ),
962
- SR_TRAP (SYS_PMEVCNTRn_EL0 (25 ), CGT_MDCR_TPM ),
963
- SR_TRAP (SYS_PMEVCNTRn_EL0 (26 ), CGT_MDCR_TPM ),
964
- SR_TRAP (SYS_PMEVCNTRn_EL0 (27 ), CGT_MDCR_TPM ),
965
- SR_TRAP (SYS_PMEVCNTRn_EL0 (28 ), CGT_MDCR_TPM ),
966
- SR_TRAP (SYS_PMEVCNTRn_EL0 (29 ), CGT_MDCR_TPM ),
967
- SR_TRAP (SYS_PMEVCNTRn_EL0 (30 ), CGT_MDCR_TPM ),
968
- SR_TRAP (SYS_PMEVTYPERn_EL0 (0 ), CGT_MDCR_TPM ),
969
- SR_TRAP (SYS_PMEVTYPERn_EL0 (1 ), CGT_MDCR_TPM ),
970
- SR_TRAP (SYS_PMEVTYPERn_EL0 (2 ), CGT_MDCR_TPM ),
971
- SR_TRAP (SYS_PMEVTYPERn_EL0 (3 ), CGT_MDCR_TPM ),
972
- SR_TRAP (SYS_PMEVTYPERn_EL0 (4 ), CGT_MDCR_TPM ),
973
- SR_TRAP (SYS_PMEVTYPERn_EL0 (5 ), CGT_MDCR_TPM ),
974
- SR_TRAP (SYS_PMEVTYPERn_EL0 (6 ), CGT_MDCR_TPM ),
975
- SR_TRAP (SYS_PMEVTYPERn_EL0 (7 ), CGT_MDCR_TPM ),
976
- SR_TRAP (SYS_PMEVTYPERn_EL0 (8 ), CGT_MDCR_TPM ),
977
- SR_TRAP (SYS_PMEVTYPERn_EL0 (9 ), CGT_MDCR_TPM ),
978
- SR_TRAP (SYS_PMEVTYPERn_EL0 (10 ), CGT_MDCR_TPM ),
979
- SR_TRAP (SYS_PMEVTYPERn_EL0 (11 ), CGT_MDCR_TPM ),
980
- SR_TRAP (SYS_PMEVTYPERn_EL0 (12 ), CGT_MDCR_TPM ),
981
- SR_TRAP (SYS_PMEVTYPERn_EL0 (13 ), CGT_MDCR_TPM ),
982
- SR_TRAP (SYS_PMEVTYPERn_EL0 (14 ), CGT_MDCR_TPM ),
983
- SR_TRAP (SYS_PMEVTYPERn_EL0 (15 ), CGT_MDCR_TPM ),
984
- SR_TRAP (SYS_PMEVTYPERn_EL0 (16 ), CGT_MDCR_TPM ),
985
- SR_TRAP (SYS_PMEVTYPERn_EL0 (17 ), CGT_MDCR_TPM ),
986
- SR_TRAP (SYS_PMEVTYPERn_EL0 (18 ), CGT_MDCR_TPM ),
987
- SR_TRAP (SYS_PMEVTYPERn_EL0 (19 ), CGT_MDCR_TPM ),
988
- SR_TRAP (SYS_PMEVTYPERn_EL0 (20 ), CGT_MDCR_TPM ),
989
- SR_TRAP (SYS_PMEVTYPERn_EL0 (21 ), CGT_MDCR_TPM ),
990
- SR_TRAP (SYS_PMEVTYPERn_EL0 (22 ), CGT_MDCR_TPM ),
991
- SR_TRAP (SYS_PMEVTYPERn_EL0 (23 ), CGT_MDCR_TPM ),
992
- SR_TRAP (SYS_PMEVTYPERn_EL0 (24 ), CGT_MDCR_TPM ),
993
- SR_TRAP (SYS_PMEVTYPERn_EL0 (25 ), CGT_MDCR_TPM ),
994
- SR_TRAP (SYS_PMEVTYPERn_EL0 (26 ), CGT_MDCR_TPM ),
995
- SR_TRAP (SYS_PMEVTYPERn_EL0 (27 ), CGT_MDCR_TPM ),
996
- SR_TRAP (SYS_PMEVTYPERn_EL0 (28 ), CGT_MDCR_TPM ),
997
- SR_TRAP (SYS_PMEVTYPERn_EL0 (29 ), CGT_MDCR_TPM ),
998
- SR_TRAP (SYS_PMEVTYPERn_EL0 (30 ), CGT_MDCR_TPM ),
969
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (0 ), CGT_MDCR_TPM_HPMN ),
970
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (1 ), CGT_MDCR_TPM_HPMN ),
971
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (2 ), CGT_MDCR_TPM_HPMN ),
972
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (3 ), CGT_MDCR_TPM_HPMN ),
973
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (4 ), CGT_MDCR_TPM_HPMN ),
974
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (5 ), CGT_MDCR_TPM_HPMN ),
975
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (6 ), CGT_MDCR_TPM_HPMN ),
976
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (7 ), CGT_MDCR_TPM_HPMN ),
977
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (8 ), CGT_MDCR_TPM_HPMN ),
978
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (9 ), CGT_MDCR_TPM_HPMN ),
979
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (10 ), CGT_MDCR_TPM_HPMN ),
980
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (11 ), CGT_MDCR_TPM_HPMN ),
981
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (12 ), CGT_MDCR_TPM_HPMN ),
982
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (13 ), CGT_MDCR_TPM_HPMN ),
983
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (14 ), CGT_MDCR_TPM_HPMN ),
984
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (15 ), CGT_MDCR_TPM_HPMN ),
985
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (16 ), CGT_MDCR_TPM_HPMN ),
986
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (17 ), CGT_MDCR_TPM_HPMN ),
987
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (18 ), CGT_MDCR_TPM_HPMN ),
988
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (19 ), CGT_MDCR_TPM_HPMN ),
989
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (20 ), CGT_MDCR_TPM_HPMN ),
990
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (21 ), CGT_MDCR_TPM_HPMN ),
991
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (22 ), CGT_MDCR_TPM_HPMN ),
992
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (23 ), CGT_MDCR_TPM_HPMN ),
993
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (24 ), CGT_MDCR_TPM_HPMN ),
994
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (25 ), CGT_MDCR_TPM_HPMN ),
995
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (26 ), CGT_MDCR_TPM_HPMN ),
996
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (27 ), CGT_MDCR_TPM_HPMN ),
997
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (28 ), CGT_MDCR_TPM_HPMN ),
998
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (29 ), CGT_MDCR_TPM_HPMN ),
999
+ SR_TRAP (SYS_PMEVCNTRn_EL0 (30 ), CGT_MDCR_TPM_HPMN ),
1000
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (0 ), CGT_MDCR_TPM_HPMN ),
1001
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (1 ), CGT_MDCR_TPM_HPMN ),
1002
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (2 ), CGT_MDCR_TPM_HPMN ),
1003
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (3 ), CGT_MDCR_TPM_HPMN ),
1004
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (4 ), CGT_MDCR_TPM_HPMN ),
1005
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (5 ), CGT_MDCR_TPM_HPMN ),
1006
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (6 ), CGT_MDCR_TPM_HPMN ),
1007
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (7 ), CGT_MDCR_TPM_HPMN ),
1008
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (8 ), CGT_MDCR_TPM_HPMN ),
1009
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (9 ), CGT_MDCR_TPM_HPMN ),
1010
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (10 ), CGT_MDCR_TPM_HPMN ),
1011
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (11 ), CGT_MDCR_TPM_HPMN ),
1012
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (12 ), CGT_MDCR_TPM_HPMN ),
1013
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (13 ), CGT_MDCR_TPM_HPMN ),
1014
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (14 ), CGT_MDCR_TPM_HPMN ),
1015
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (15 ), CGT_MDCR_TPM_HPMN ),
1016
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (16 ), CGT_MDCR_TPM_HPMN ),
1017
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (17 ), CGT_MDCR_TPM_HPMN ),
1018
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (18 ), CGT_MDCR_TPM_HPMN ),
1019
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (19 ), CGT_MDCR_TPM_HPMN ),
1020
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (20 ), CGT_MDCR_TPM_HPMN ),
1021
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (21 ), CGT_MDCR_TPM_HPMN ),
1022
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (22 ), CGT_MDCR_TPM_HPMN ),
1023
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (23 ), CGT_MDCR_TPM_HPMN ),
1024
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (24 ), CGT_MDCR_TPM_HPMN ),
1025
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (25 ), CGT_MDCR_TPM_HPMN ),
1026
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (26 ), CGT_MDCR_TPM_HPMN ),
1027
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (27 ), CGT_MDCR_TPM_HPMN ),
1028
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (28 ), CGT_MDCR_TPM_HPMN ),
1029
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (29 ), CGT_MDCR_TPM_HPMN ),
1030
+ SR_TRAP (SYS_PMEVTYPERn_EL0 (30 ), CGT_MDCR_TPM_HPMN ),
999
1031
SR_TRAP (SYS_PMCCFILTR_EL0 , CGT_MDCR_TPM ),
1000
1032
SR_TRAP (SYS_MDCCSR_EL0 , CGT_MDCR_TDCC_TDE_TDA ),
1001
1033
SR_TRAP (SYS_MDCCINT_EL1 , CGT_MDCR_TDCC_TDE_TDA ),
0 commit comments