summaryrefslogtreecommitdiff
path: root/ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimerSupport.S
blob: acf49c1eda0a2a2e5ffda3f32fd07092672c45e8 (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#------------------------------------------------------------------------------
#
# Copyright (c) 2011 - 2013, ARM Limited. All rights reserved.
# Copyright (c) 2016, Linaro Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
#------------------------------------------------------------------------------

#include <AsmMacroLib.h>

/* Special accessors for VHE */
#define cntp_tval_el02          s3_5_c14_c2_0
#define cntp_ctl_el02           s3_5_c14_c2_1
#define cntp_cval_el02          s3_5_c14_c2_2
#define cntv_tval_el02          s3_5_c14_c3_0
#define cntv_ctl_el02           s3_5_c14_c3_1
#define cntv_cval_el02          s3_5_c14_c3_2

#define RCNT(reg, sysreg)       rvhe reg, sysreg, sysreg ## 2
#define wCNT(sysreg, reg, tmp)  wvhe sysreg, reg, sysreg ## 2, tmp

        /* Read from 'altname' when running at EL2+VHE, or 'sysreg' otherwise */
        .macro  rvhe, reg, sysreg, altname
        mrs     \reg, CurrentEL
        tbz     \reg, #3, .L\@
        mrs     \reg, hcr_el2
        tbz     \reg, #34, .L\@   // TCR.E2H
        mrs     \reg, \altname
        ret
.L\@:   mrs     \reg, \sysreg
        ret
        .endm

        /* Write to 'altname' when running at EL2+VHE, or 'sysreg' otherwise */
        .macro  wvhe, sysreg, reg, altname, tmp
        mrs     \tmp, CurrentEL
        tbz     \tmp, #3, .L\@
        mrs     \tmp, hcr_el2
        tbz     \tmp, #34, .L\@   // TCR.E2H
        msr     \altname, \reg
        ret
.L\@:   msr     \sysreg, \reg
        ret
        .endm

ASM_FUNC(ArmReadCntFrq)
  mrs   x0, cntfrq_el0           // Read CNTFRQ
  ret


# NOTE - Can only write while at highest implemented EL level (EL3 on model). Else ReadOnly (EL2, EL1, EL0)
ASM_FUNC(ArmWriteCntFrq)
  msr   cntfrq_el0, x0           // Write to CNTFRQ
  ret


ASM_FUNC(ArmReadCntPct)
  mrs   x0, cntpct_el0           // Read CNTPCT (Physical counter register)
  ret


ASM_FUNC(ArmReadCntkCtl)
  mrs   x0, cntkctl_el1          // Read CNTK_CTL (Timer PL1 Control Register)
  ret


ASM_FUNC(ArmWriteCntkCtl)
  msr   cntkctl_el1, x0          // Write to CNTK_CTL (Timer PL1 Control Register)
  ret


ASM_FUNC(ArmReadCntpTval)
  RCNT  (x0, cntp_tval_el0)      // Read CNTP_TVAL (PL1 physical timer value register)


ASM_FUNC(ArmWriteCntpTval)
  wCNT  (cntp_tval_el0, x0, x1)  // Write to CNTP_TVAL (PL1 physical timer value register)


ASM_FUNC(ArmReadCntpCtl)
  RCNT  (x0, cntp_ctl_el0)       // Read CNTP_CTL (PL1 Physical Timer Control Register)


ASM_FUNC(ArmWriteCntpCtl)
  wCNT  (cntp_ctl_el0, x0, x1)   // Write to  CNTP_CTL (PL1 Physical Timer Control Register)


ASM_FUNC(ArmReadCntvTval)
  RCNT  (x0, cntv_tval_el0)      // Read CNTV_TVAL (Virtual Timer Value register)


ASM_FUNC(ArmWriteCntvTval)
  wCNT  (cntv_tval_el0, x0, x1) // Write to CNTV_TVAL (Virtual Timer Value register)


ASM_FUNC(ArmReadCntvCtl)
  RCNT  (x0, cntv_ctl_el0)       // Read CNTV_CTL (Virtual Timer Control Register)


ASM_FUNC(ArmWriteCntvCtl)
  wCNT  (cntv_ctl_el0, x0, x1)   // Write to CNTV_CTL (Virtual Timer Control Register)


ASM_FUNC(ArmReadCntvCt)
  mrs  x0, cntvct_el0            // Read CNTVCT  (Virtual Count Register)
  ret

ASM_FUNC(ArmReadCntpCval)
  RCNT  (x0, cntp_cval_el0)      // Read CNTP_CTVAL (Physical Timer Compare Value Register)


ASM_FUNC(ArmWriteCntpCval)
  wCNT  (cntp_cval_el0, x0, x1)  // Write to CNTP_CTVAL (Physical Timer Compare Value Register)


ASM_FUNC(ArmReadCntvCval)
  RCNT  (x0, cntv_cval_el0)      // Read CNTV_CTVAL (Virtual Timer Compare Value Register)


ASM_FUNC(ArmWriteCntvCval)
  wCNT  (cntv_cval_el0, x0, x1)  // write to  CNTV_CTVAL (Virtual Timer Compare Value Register)


ASM_FUNC(ArmReadCntvOff)
  mrs   x0, cntvoff_el2          // Read CNTVOFF (virtual Offset register)
  ret


ASM_FUNC(ArmWriteCntvOff)
  msr   cntvoff_el2, x0          // Write to CNTVOFF (Virtual Offset register)
  ret


ASM_FUNCTION_REMOVE_IF_UNREFERENCED