summaryrefslogtreecommitdiff
path: root/tools/proxyclient/experiments/timer_test.py
blob: b3422c9627e413c2af84a60838fdb43e2d877f43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python3
# SPDX-License-Identifier: MIT
import sys, pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))

from m1n1.setup import *

HV_VTMR_CTL = (3, 5, 15, 1, 3)
HV_VTMR_CTL_VMASK = (1 << 0)
HV_VTMR_CTL_PMASK = (1 << 1)

HV_VTMR_LIST = (3, 5, 15, 1, 2)

TGE = (1<<27)

u.msr(CNTHCTL_EL2, 3 << 10) # EL1PTEN | EL1PCTEN

def run_test(ctl, tval):
    u.inst(0xd5033fdf) # isb

    u.msr(ctl, 0)
    u.msr(tval, int(freq * 0.8))
    u.msr(ctl, 1)

    for i in range(6):
        p.nop()
        time.sleep(0.2)
        #u.inst(0xd5033fdf, call=p.el1_call)
        print("      . (ISR_EL1=%d) CTL=%x VTMR_LIST=%x" % (u.mrs(ISR_EL1), u.mrs(ctl), u.mrs(HV_VTMR_LIST)))

    u.msr(ctl, 0)

def test_hv_timers():
    u.msr(DAIF, 0x3c0)
    print("Testing HV timers...")
    print("  TGE = 1")

    u.msr(HCR_EL2, u.mrs(HCR_EL2) | TGE | (1 << 3) | (1 << 4))

    print("    P:")
    run_test(CNTP_CTL_EL0, CNTP_TVAL_EL0)
    print("    V:")
    run_test(CNTV_CTL_EL0, CNTV_TVAL_EL0)

def test_guest_timers():
    u.msr(DAIF, 0)
    print("Testing guest timers...")

    print("  TGE = 1, vGIC mode=0, timers unmasked")
    u.msr(HCR_EL2, (u.mrs(HCR_EL2) | TGE) | (1 << 3) | (1 << 4))
    u.msr(HACR_EL2, 0)
    u.msr(HV_VTMR_CTL, 3)

    print("    P:")
    #run_test(CNTP_CTL_EL02, CNTP_TVAL_EL02)
    print("    V:")
    #run_test(CNTV_CTL_EL02, CNTV_TVAL_EL02)

    print("  TGE = 1, vGIC mode=0, timers masked")
    u.msr(HV_VTMR_CTL, 0)

    print("    P:")
    run_test(CNTP_CTL_EL02, CNTP_TVAL_EL02)
    print("    V:")
    run_test(CNTV_CTL_EL02, CNTV_TVAL_EL02)

    print("  TGE = 0, vGIC mode=0, timers unmasked")
    u.msr(HCR_EL2, (u.mrs(HCR_EL2) & ~TGE) | (1 << 3) | (1 << 4))
    u.msr(HACR_EL2, 0)
    u.msr(HV_VTMR_CTL, 3)

    print("    P:")
    run_test(CNTP_CTL_EL02, CNTP_TVAL_EL02)
    print("    V:")
    run_test(CNTV_CTL_EL02, CNTV_TVAL_EL02)

    print("  TGE = 0, vGIC mode=0, timers masked")
    u.msr(HV_VTMR_CTL, 0)

    print("    P:")
    run_test(CNTP_CTL_EL02, CNTP_TVAL_EL02)
    print("    V:")
    run_test(CNTV_CTL_EL02, CNTV_TVAL_EL02)

    print("  TGE = 0, vGIC mode=1, timers unmasked")
    u.msr(HCR_EL2, (u.mrs(HCR_EL2) & ~TGE) | (1 << 3) | (1 << 4))
    u.msr(HACR_EL2, 1<<20)
    u.msr(HV_VTMR_CTL, 3)

    print("    P:")
    run_test(CNTP_CTL_EL02, CNTP_TVAL_EL02)
    print("    V:")
    run_test(CNTV_CTL_EL02, CNTV_TVAL_EL02)

    print("  TGE = 0, vGIC mode=1, timers masked")
    u.msr(HV_VTMR_CTL, 0)

    print("    P:")
    run_test(CNTP_CTL_EL02, CNTP_TVAL_EL02)
    print("    V:")
    run_test(CNTV_CTL_EL02, CNTV_TVAL_EL02)

    return

freq = u.mrs(CNTFRQ_EL0)
print("Timer freq: %d" % freq)

test_hv_timers()
test_guest_timers()