@@ -1412,26 +1412,146 @@ static bool access_arch_timer(struct kvm_vcpu *vcpu,
1412
1412
1413
1413
switch (reg ) {
1414
1414
case SYS_CNTP_TVAL_EL0 :
1415
+ if (is_hyp_ctxt (vcpu ) && vcpu_el2_e2h_is_set (vcpu ))
1416
+ tmr = TIMER_HPTIMER ;
1417
+ else
1418
+ tmr = TIMER_PTIMER ;
1419
+ treg = TIMER_REG_TVAL ;
1420
+ break ;
1421
+
1422
+ case SYS_CNTV_TVAL_EL0 :
1423
+ if (is_hyp_ctxt (vcpu ) && vcpu_el2_e2h_is_set (vcpu ))
1424
+ tmr = TIMER_HVTIMER ;
1425
+ else
1426
+ tmr = TIMER_VTIMER ;
1427
+ treg = TIMER_REG_TVAL ;
1428
+ break ;
1429
+
1415
1430
case SYS_AARCH32_CNTP_TVAL :
1431
+ case SYS_CNTP_TVAL_EL02 :
1416
1432
tmr = TIMER_PTIMER ;
1417
1433
treg = TIMER_REG_TVAL ;
1418
1434
break ;
1435
+
1436
+ case SYS_CNTV_TVAL_EL02 :
1437
+ tmr = TIMER_VTIMER ;
1438
+ treg = TIMER_REG_TVAL ;
1439
+ break ;
1440
+
1441
+ case SYS_CNTHP_TVAL_EL2 :
1442
+ tmr = TIMER_HPTIMER ;
1443
+ treg = TIMER_REG_TVAL ;
1444
+ break ;
1445
+
1446
+ case SYS_CNTHV_TVAL_EL2 :
1447
+ tmr = TIMER_HVTIMER ;
1448
+ treg = TIMER_REG_TVAL ;
1449
+ break ;
1450
+
1419
1451
case SYS_CNTP_CTL_EL0 :
1452
+ if (is_hyp_ctxt (vcpu ) && vcpu_el2_e2h_is_set (vcpu ))
1453
+ tmr = TIMER_HPTIMER ;
1454
+ else
1455
+ tmr = TIMER_PTIMER ;
1456
+ treg = TIMER_REG_CTL ;
1457
+ break ;
1458
+
1459
+ case SYS_CNTV_CTL_EL0 :
1460
+ if (is_hyp_ctxt (vcpu ) && vcpu_el2_e2h_is_set (vcpu ))
1461
+ tmr = TIMER_HVTIMER ;
1462
+ else
1463
+ tmr = TIMER_VTIMER ;
1464
+ treg = TIMER_REG_CTL ;
1465
+ break ;
1466
+
1420
1467
case SYS_AARCH32_CNTP_CTL :
1468
+ case SYS_CNTP_CTL_EL02 :
1421
1469
tmr = TIMER_PTIMER ;
1422
1470
treg = TIMER_REG_CTL ;
1423
1471
break ;
1472
+
1473
+ case SYS_CNTV_CTL_EL02 :
1474
+ tmr = TIMER_VTIMER ;
1475
+ treg = TIMER_REG_CTL ;
1476
+ break ;
1477
+
1478
+ case SYS_CNTHP_CTL_EL2 :
1479
+ tmr = TIMER_HPTIMER ;
1480
+ treg = TIMER_REG_CTL ;
1481
+ break ;
1482
+
1483
+ case SYS_CNTHV_CTL_EL2 :
1484
+ tmr = TIMER_HVTIMER ;
1485
+ treg = TIMER_REG_CTL ;
1486
+ break ;
1487
+
1424
1488
case SYS_CNTP_CVAL_EL0 :
1489
+ if (is_hyp_ctxt (vcpu ) && vcpu_el2_e2h_is_set (vcpu ))
1490
+ tmr = TIMER_HPTIMER ;
1491
+ else
1492
+ tmr = TIMER_PTIMER ;
1493
+ treg = TIMER_REG_CVAL ;
1494
+ break ;
1495
+
1496
+ case SYS_CNTV_CVAL_EL0 :
1497
+ if (is_hyp_ctxt (vcpu ) && vcpu_el2_e2h_is_set (vcpu ))
1498
+ tmr = TIMER_HVTIMER ;
1499
+ else
1500
+ tmr = TIMER_VTIMER ;
1501
+ treg = TIMER_REG_CVAL ;
1502
+ break ;
1503
+
1425
1504
case SYS_AARCH32_CNTP_CVAL :
1505
+ case SYS_CNTP_CVAL_EL02 :
1426
1506
tmr = TIMER_PTIMER ;
1427
1507
treg = TIMER_REG_CVAL ;
1428
1508
break ;
1509
+
1510
+ case SYS_CNTV_CVAL_EL02 :
1511
+ tmr = TIMER_VTIMER ;
1512
+ treg = TIMER_REG_CVAL ;
1513
+ break ;
1514
+
1515
+ case SYS_CNTHP_CVAL_EL2 :
1516
+ tmr = TIMER_HPTIMER ;
1517
+ treg = TIMER_REG_CVAL ;
1518
+ break ;
1519
+
1520
+ case SYS_CNTHV_CVAL_EL2 :
1521
+ tmr = TIMER_HVTIMER ;
1522
+ treg = TIMER_REG_CVAL ;
1523
+ break ;
1524
+
1429
1525
case SYS_CNTPCT_EL0 :
1430
1526
case SYS_CNTPCTSS_EL0 :
1527
+ if (is_hyp_ctxt (vcpu ))
1528
+ tmr = TIMER_HPTIMER ;
1529
+ else
1530
+ tmr = TIMER_PTIMER ;
1531
+ treg = TIMER_REG_CNT ;
1532
+ break ;
1533
+
1431
1534
case SYS_AARCH32_CNTPCT :
1535
+ case SYS_AARCH32_CNTPCTSS :
1432
1536
tmr = TIMER_PTIMER ;
1433
1537
treg = TIMER_REG_CNT ;
1434
1538
break ;
1539
+
1540
+ case SYS_CNTVCT_EL0 :
1541
+ case SYS_CNTVCTSS_EL0 :
1542
+ if (is_hyp_ctxt (vcpu ))
1543
+ tmr = TIMER_HVTIMER ;
1544
+ else
1545
+ tmr = TIMER_VTIMER ;
1546
+ treg = TIMER_REG_CNT ;
1547
+ break ;
1548
+
1549
+ case SYS_AARCH32_CNTVCT :
1550
+ case SYS_AARCH32_CNTVCTSS :
1551
+ tmr = TIMER_VTIMER ;
1552
+ treg = TIMER_REG_CNT ;
1553
+ break ;
1554
+
1435
1555
default :
1436
1556
print_sys_reg_msg (p , "%s" , "Unhandled trapped timer register" );
1437
1557
return undef_access (vcpu , p , r );
@@ -2901,11 +3021,17 @@ static const struct sys_reg_desc sys_reg_descs[] = {
2901
3021
AMU_AMEVTYPER1_EL0 (15 ),
2902
3022
2903
3023
{ SYS_DESC (SYS_CNTPCT_EL0 ), access_arch_timer },
3024
+ { SYS_DESC (SYS_CNTVCT_EL0 ), access_arch_timer },
2904
3025
{ SYS_DESC (SYS_CNTPCTSS_EL0 ), access_arch_timer },
3026
+ { SYS_DESC (SYS_CNTVCTSS_EL0 ), access_arch_timer },
2905
3027
{ SYS_DESC (SYS_CNTP_TVAL_EL0 ), access_arch_timer },
2906
3028
{ SYS_DESC (SYS_CNTP_CTL_EL0 ), access_arch_timer },
2907
3029
{ SYS_DESC (SYS_CNTP_CVAL_EL0 ), access_arch_timer },
2908
3030
3031
+ { SYS_DESC (SYS_CNTV_TVAL_EL0 ), access_arch_timer },
3032
+ { SYS_DESC (SYS_CNTV_CTL_EL0 ), access_arch_timer },
3033
+ { SYS_DESC (SYS_CNTV_CVAL_EL0 ), access_arch_timer },
3034
+
2909
3035
/* PMEVCNTRn_EL0 */
2910
3036
PMU_PMEVCNTR_EL0 (0 ),
2911
3037
PMU_PMEVCNTR_EL0 (1 ),
@@ -3057,9 +3183,24 @@ static const struct sys_reg_desc sys_reg_descs[] = {
3057
3183
3058
3184
EL2_REG_VNCR (CNTVOFF_EL2 , reset_val , 0 ),
3059
3185
EL2_REG (CNTHCTL_EL2 , access_rw , reset_val , 0 ),
3186
+ { SYS_DESC (SYS_CNTHP_TVAL_EL2 ), access_arch_timer },
3187
+ EL2_REG (CNTHP_CTL_EL2 , access_arch_timer , reset_val , 0 ),
3188
+ EL2_REG (CNTHP_CVAL_EL2 , access_arch_timer , reset_val , 0 ),
3189
+
3190
+ { SYS_DESC (SYS_CNTHV_TVAL_EL2 ), access_arch_timer },
3191
+ EL2_REG (CNTHV_CTL_EL2 , access_arch_timer , reset_val , 0 ),
3192
+ EL2_REG (CNTHV_CVAL_EL2 , access_arch_timer , reset_val , 0 ),
3060
3193
3061
3194
{ SYS_DESC (SYS_CNTKCTL_EL12 ), access_cntkctl_el12 },
3062
3195
3196
+ { SYS_DESC (SYS_CNTP_TVAL_EL02 ), access_arch_timer },
3197
+ { SYS_DESC (SYS_CNTP_CTL_EL02 ), access_arch_timer },
3198
+ { SYS_DESC (SYS_CNTP_CVAL_EL02 ), access_arch_timer },
3199
+
3200
+ { SYS_DESC (SYS_CNTV_TVAL_EL02 ), access_arch_timer },
3201
+ { SYS_DESC (SYS_CNTV_CTL_EL02 ), access_arch_timer },
3202
+ { SYS_DESC (SYS_CNTV_CVAL_EL02 ), access_arch_timer },
3203
+
3063
3204
EL2_REG (SP_EL2 , NULL , reset_unknown , 0 ),
3064
3205
};
3065
3206
@@ -3879,9 +4020,11 @@ static const struct sys_reg_desc cp15_64_regs[] = {
3879
4020
{ SYS_DESC (SYS_AARCH32_CNTPCT ), access_arch_timer },
3880
4021
{ Op1 ( 1 ), CRn ( 0 ), CRm ( 2 ), Op2 ( 0 ), access_vm_reg , NULL , TTBR1_EL1 },
3881
4022
{ Op1 ( 1 ), CRn ( 0 ), CRm (12 ), Op2 ( 0 ), access_gic_sgi }, /* ICC_ASGI1R */
4023
+ { SYS_DESC (SYS_AARCH32_CNTVCT ), access_arch_timer },
3882
4024
{ Op1 ( 2 ), CRn ( 0 ), CRm (12 ), Op2 ( 0 ), access_gic_sgi }, /* ICC_SGI0R */
3883
4025
{ SYS_DESC (SYS_AARCH32_CNTP_CVAL ), access_arch_timer },
3884
4026
{ SYS_DESC (SYS_AARCH32_CNTPCTSS ), access_arch_timer },
4027
+ { SYS_DESC (SYS_AARCH32_CNTVCTSS ), access_arch_timer },
3885
4028
};
3886
4029
3887
4030
static bool check_sysreg_table (const struct sys_reg_desc * table , unsigned int n ,
0 commit comments