xref: /qemu/tests/tcg/aarch64/system/vtimer.c (revision 379652e9)
18d37a142SPeter Maydell /*
28d37a142SPeter Maydell  * Simple Virtual Timer Test
38d37a142SPeter Maydell  *
48d37a142SPeter Maydell  * Copyright (c) 2020 Linaro Ltd
58d37a142SPeter Maydell  *
68d37a142SPeter Maydell  * SPDX-License-Identifier: GPL-2.0-or-later
78d37a142SPeter Maydell  */
88d37a142SPeter Maydell 
9*379652e9SIlya Leoshkevich #include <stdint.h>
108d37a142SPeter Maydell #include <minilib.h>
118d37a142SPeter Maydell 
128d37a142SPeter Maydell /* grabbed from Linux */
138d37a142SPeter Maydell #define __stringify_1(x...) #x
148d37a142SPeter Maydell #define __stringify(x...)   __stringify_1(x)
158d37a142SPeter Maydell 
168d37a142SPeter Maydell #define read_sysreg(r) ({                                           \
178d37a142SPeter Maydell             uint64_t __val;                                         \
188d37a142SPeter Maydell             asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \
198d37a142SPeter Maydell             __val;                                                  \
208d37a142SPeter Maydell })
218d37a142SPeter Maydell 
228d37a142SPeter Maydell #define write_sysreg(r, v) do {                     \
238d37a142SPeter Maydell         uint64_t __val = (uint64_t)(v);             \
248d37a142SPeter Maydell         asm volatile("msr " __stringify(r) ", %x0"  \
258d37a142SPeter Maydell                  : : "rZ" (__val));                 \
268d37a142SPeter Maydell } while (0)
278d37a142SPeter Maydell 
main(void)288d37a142SPeter Maydell int main(void)
298d37a142SPeter Maydell {
308d37a142SPeter Maydell     int i;
318d37a142SPeter Maydell 
328d37a142SPeter Maydell     ml_printf("VTimer Test\n");
338d37a142SPeter Maydell 
348d37a142SPeter Maydell     write_sysreg(cntvoff_el2, 1);
358d37a142SPeter Maydell     write_sysreg(cntv_cval_el0, -1);
368d37a142SPeter Maydell     write_sysreg(cntv_ctl_el0, 1);
378d37a142SPeter Maydell 
388d37a142SPeter Maydell     ml_printf("cntvoff_el2=%lx\n", read_sysreg(cntvoff_el2));
398d37a142SPeter Maydell     ml_printf("cntv_cval_el0=%lx\n", read_sysreg(cntv_cval_el0));
408d37a142SPeter Maydell     ml_printf("cntv_ctl_el0=%lx\n", read_sysreg(cntv_ctl_el0));
418d37a142SPeter Maydell 
428d37a142SPeter Maydell     /* Now read cval a few times */
438d37a142SPeter Maydell     for (i = 0; i < 10; i++) {
448d37a142SPeter Maydell         ml_printf("%d: cntv_cval_el0=%lx\n", i, read_sysreg(cntv_cval_el0));
458d37a142SPeter Maydell     }
468d37a142SPeter Maydell 
478d37a142SPeter Maydell     return 0;
488d37a142SPeter Maydell }
49