blob: 42f2f7796c7e4749473289280994b3bf7bf3aa3f (
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
|
/*
* Simple Virtual Timer Test
*
* Copyright (c) 2020 Linaro Ltd
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <inttypes.h>
#include <minilib.h>
/* grabbed from Linux */
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
#define read_sysreg(r) ({ \
uint64_t __val; \
asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \
__val; \
})
#define write_sysreg(r, v) do { \
uint64_t __val = (uint64_t)(v); \
asm volatile("msr " __stringify(r) ", %x0" \
: : "rZ" (__val)); \
} while (0)
int main(void)
{
int i;
ml_printf("VTimer Test\n");
write_sysreg(cntvoff_el2, 1);
write_sysreg(cntv_cval_el0, -1);
write_sysreg(cntv_ctl_el0, 1);
ml_printf("cntvoff_el2=%lx\n", read_sysreg(cntvoff_el2));
ml_printf("cntv_cval_el0=%lx\n", read_sysreg(cntv_cval_el0));
ml_printf("cntv_ctl_el0=%lx\n", read_sysreg(cntv_ctl_el0));
/* Now read cval a few times */
for (i = 0; i < 10; i++) {
ml_printf("%d: cntv_cval_el0=%lx\n", i, read_sysreg(cntv_cval_el0));
}
return 0;
}
|