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