Lines Matching refs:timer

3  * arch_timer_edge_cases.c - Tests the aarch64 timer IRQ functionality.
5 * The test validates some edge cases related to the arch-timer:
11 * - masking/unmasking using the timer control mask.
53 /* Virtual or physical timer and counter tests. */
54 enum arch_timer timer;
55 /* Delay used for most timer tests. */
61 /* Whether to test the physical timer. */
63 /* Whether to test the virtual timer. */
85 typedef void (*sleep_method_t)(enum arch_timer timer, uint64_t usec);
87 static void sleep_poll(enum arch_timer timer, uint64_t usec);
88 static void sleep_sched_poll(enum arch_timer timer, uint64_t usec);
89 static void sleep_in_userspace(enum arch_timer timer, uint64_t usec);
90 static void sleep_migrate(enum arch_timer timer, uint64_t usec);
140 static void set_counter(enum arch_timer timer, uint64_t counter)
142 GUEST_SYNC_ARGS(SET_COUNTER_VALUE, counter, timer, 0, 0);
148 enum arch_timer timer;
159 timer = PHYSICAL;
161 timer = VIRTUAL;
165 ctl = timer_get_ctl(timer);
166 cval = timer_get_cval(timer);
167 cnt = timer_get_cntct(timer);
172 /* Disable and mask the timer. */
173 timer_set_ctl(timer, CTL_IMASK);
181 static void set_cval_irq(enum arch_timer timer, uint64_t cval_cycles,
186 timer_set_cval(timer, cval_cycles);
187 timer_set_ctl(timer, ctl);
190 static void set_tval_irq(enum arch_timer timer, uint64_t tval_cycles,
195 timer_set_tval(timer, tval_cycles);
196 timer_set_ctl(timer, ctl);
199 static void set_xval_irq(enum arch_timer timer, uint64_t xval, uint32_t ctl,
204 set_cval_irq(timer, xval, ctl);
207 set_tval_irq(timer, xval, ctl);
210 GUEST_FAIL("Could not get timer %d", timer);
282 /* Whichever timer we are testing with, sleep with the other. */
294 static void sleep_poll(enum arch_timer timer, uint64_t usec)
296 guest_poll(timer, usec, NO_USERSPACE_CMD);
299 static void sleep_sched_poll(enum arch_timer timer, uint64_t usec)
301 guest_poll(timer, usec, USERSPACE_SCHED_YIELD);
304 static void sleep_migrate(enum arch_timer timer, uint64_t usec)
306 guest_poll(timer, usec, USERSPACE_MIGRATE_SELF);
309 static void sleep_in_userspace(enum arch_timer timer, uint64_t usec)
315 * Reset the timer state to some nice values like the counter not being close
318 static void reset_timer_state(enum arch_timer timer, uint64_t cnt)
320 set_counter(timer, cnt);
321 timer_set_ctl(timer, CTL_IMASK);
324 static void test_timer_xval(enum arch_timer timer, uint64_t xval,
331 reset_timer_state(timer, reset_cnt);
333 set_xval_irq(timer, xval, CTL_ENABLE, tv);
343 * The test_timer_* functions will program the timer, wait for it, and assert
351 static void test_timer_cval(enum arch_timer timer, uint64_t cval,
355 test_timer_xval(timer, cval, TIMER_CVAL, wm, reset_state, reset_cnt);
358 static void test_timer_tval(enum arch_timer timer, int32_t tval,
362 test_timer_xval(timer, (uint64_t) tval, TIMER_TVAL, wm, reset_state,
366 static void test_xval_check_no_irq(enum arch_timer timer, uint64_t xval,
372 set_xval_irq(timer, xval, CTL_ENABLE | CTL_IMASK, timer_view);
373 guest_sleep(timer, usec);
382 static void test_cval_no_irq(enum arch_timer timer, uint64_t cval,
385 test_xval_check_no_irq(timer, cval, usec, TIMER_CVAL, wm);
388 static void test_tval_no_irq(enum arch_timer timer, int32_t tval, uint64_t usec,
392 test_xval_check_no_irq(timer, (uint64_t) tval, usec, TIMER_TVAL, wm);
395 /* Test masking/unmasking a timer using the timer mask (not the IRQ mask). */
396 static void test_timer_control_mask_then_unmask(enum arch_timer timer)
398 reset_timer_state(timer, DEF_CNT);
399 set_tval_irq(timer, -1, CTL_ENABLE | CTL_IMASK);
401 /* Unmask the timer, and then get an IRQ. */
403 timer_set_ctl(timer, CTL_ENABLE);
411 /* Check that timer control masks actually mask a timer being fired. */
412 static void test_timer_control_masks(enum arch_timer timer)
414 reset_timer_state(timer, DEF_CNT);
418 set_tval_irq(timer, -1, CTL_ENABLE | CTL_IMASK);
421 sleep_poll(timer, TIMEOUT_NO_IRQ_US);
424 timer_set_ctl(timer, CTL_IMASK);
427 static void test_fire_a_timer_multiple_times(enum arch_timer timer,
433 reset_timer_state(timer, DEF_CNT);
435 set_tval_irq(timer, 0, CTL_ENABLE);
441 /* The IRQ handler masked and disabled the timer.
444 timer_set_ctl(timer, CTL_ENABLE);
452 static void test_timers_fired_multiple_times(enum arch_timer timer)
457 test_fire_a_timer_multiple_times(timer, irq_wait_method[i], 10);
461 * Set a timer for tval=delta_1_ms then reprogram it to
462 * tval=delta_2_ms. Check that we get the timer fired. There is no
465 static void test_reprogramming_timer(enum arch_timer timer, irq_wait_method_t wm,
469 reset_timer_state(timer, DEF_CNT);
471 /* Program the timer to DEF_CNT + delta_1_ms. */
472 set_tval_irq(timer, msec_to_cycles(delta_1_ms), CTL_ENABLE);
474 /* Reprogram the timer to DEF_CNT + delta_2_ms. */
475 timer_set_tval(timer, msec_to_cycles(delta_2_ms));
481 GUEST_ASSERT(timer_get_cntct(timer) >=
488 static void test_reprogram_timers(enum arch_timer timer)
498 test_reprogramming_timer(timer, irq_wait_method[i], 2 * base_wait,
500 test_reprogramming_timer(timer, irq_wait_method[i], base_wait,
505 static void test_basic_functionality(enum arch_timer timer)
514 test_timer_cval(timer, cval, wm, true, DEF_CNT);
515 test_timer_tval(timer, tval, wm, true, DEF_CNT);
520 * This test checks basic timer behavior without actually firing timers, things
523 static void timers_sanity_checks(enum arch_timer timer, bool use_sched)
525 reset_timer_state(timer, DEF_CNT);
530 timer_set_cval(timer,
531 timer_get_cntct(timer) -
535 GUEST_ASSERT(timer_get_tval(timer) < 0);
538 timer_set_tval(timer, -1);
541 GUEST_ASSERT(timer_get_cval(timer) < timer_get_cntct(timer));
546 timer_set_cval(timer,
547 timer_get_cntct(timer) + TVAL_MAX +
551 GUEST_ASSERT(timer_get_tval(timer) <= 0);
557 timer_set_cval(timer,
558 timer_get_cntct(timer) + 2ULL * TVAL_MAX +
562 GUEST_ASSERT(timer_get_tval(timer) <=
566 set_counter(timer, msec_to_cycles(1));
567 timer_set_tval(timer, -1 * msec_to_cycles(test_args.wait_ms));
570 GUEST_ASSERT(timer_get_cval(timer) >= (CVAL_MAX - msec_to_cycles(test_args.wait_ms)));
573 timer_set_tval(timer, 0);
574 sleep_poll(timer, 1);
575 GUEST_ASSERT(timer_get_tval(timer) < 0);
579 /* Mask and disable any pending timer. */
580 timer_set_ctl(timer, CTL_IMASK);
583 static void test_timers_sanity_checks(enum arch_timer timer)
585 timers_sanity_checks(timer, false);
587 timers_sanity_checks(timer, true);
590 static void test_set_cnt_after_tval_max(enum arch_timer timer, irq_wait_method_t wm)
593 reset_timer_state(timer, DEF_CNT);
595 set_cval_irq(timer,
599 set_counter(timer, TVAL_MAX);
609 static void test_timers_above_tval_max(enum arch_timer timer)
618 * wait_ms", and the timer would fire immediately. Test that it
622 reset_timer_state(timer, DEF_CNT);
623 cval = timer_get_cntct(timer) + TVAL_MAX +
625 test_cval_no_irq(timer, cval,
632 test_set_cnt_after_tval_max(timer, irq_wait_method[i]);
641 static void test_set_cnt_after_xval(enum arch_timer timer, uint64_t cnt_1,
647 set_counter(timer, cnt_1);
648 timer_set_ctl(timer, CTL_IMASK);
650 set_xval_irq(timer, xval, CTL_ENABLE, tv);
651 set_counter(timer, cnt_2);
664 static void test_set_cnt_after_xval_no_irq(enum arch_timer timer,
672 set_counter(timer, cnt_1);
673 timer_set_ctl(timer, CTL_IMASK);
675 set_xval_irq(timer, xval, CTL_ENABLE, tv);
676 set_counter(timer, cnt_2);
677 guest_sleep(timer, TIMEOUT_NO_IRQ_US);
684 timer_set_ctl(timer, CTL_IMASK);
687 static void test_set_cnt_after_tval(enum arch_timer timer, uint64_t cnt_1,
691 test_set_cnt_after_xval(timer, cnt_1, tval, cnt_2, wm, TIMER_TVAL);
694 static void test_set_cnt_after_cval(enum arch_timer timer, uint64_t cnt_1,
698 test_set_cnt_after_xval(timer, cnt_1, cval, cnt_2, wm, TIMER_CVAL);
701 static void test_set_cnt_after_tval_no_irq(enum arch_timer timer,
705 test_set_cnt_after_xval_no_irq(timer, cnt_1, tval, cnt_2, wm,
709 static void test_set_cnt_after_cval_no_irq(enum arch_timer timer,
713 test_set_cnt_after_xval_no_irq(timer, cnt_1, cval, cnt_2, wm,
717 /* Set a timer and then move the counter ahead of it. */
718 static void test_move_counters_ahead_of_timers(enum arch_timer timer)
726 test_set_cnt_after_cval(timer, 0, DEF_CNT, DEF_CNT + 1, wm);
727 test_set_cnt_after_cval(timer, CVAL_MAX, 1, 2, wm);
730 test_set_cnt_after_tval(timer, 0, -1, DEF_CNT + 1, wm);
731 test_set_cnt_after_tval(timer, 0, -1, TVAL_MAX, wm);
733 test_set_cnt_after_tval(timer, 0, tval, (uint64_t) tval + 1,
739 * Program a timer, mask it, and then change the tval or counter to cancel it.
742 static void test_move_counters_behind_timers(enum arch_timer timer)
749 test_set_cnt_after_cval_no_irq(timer, DEF_CNT, DEF_CNT - 1, 0,
751 test_set_cnt_after_tval_no_irq(timer, DEF_CNT, -1, 0, sm);
755 static void test_timers_in_the_past(enum arch_timer timer)
764 /* set a timer wait_ms the past. */
766 test_timer_cval(timer, cval, wm, true, DEF_CNT);
767 test_timer_tval(timer, tval, wm, true, DEF_CNT);
769 /* Set a timer to counter=0 (in the past) */
770 test_timer_cval(timer, 0, wm, true, DEF_CNT);
773 test_timer_tval(timer, 0, wm, true, DEF_CNT);
775 /* Set a timer to as far in the past as possible */
776 test_timer_tval(timer, TVAL_MIN, wm, true, DEF_CNT);
786 set_counter(timer, msec_to_cycles(test_args.wait_ms));
787 test_tval_no_irq(timer, tval, TIMEOUT_NO_IRQ_US, sm);
791 static void test_long_timer_delays(enum arch_timer timer)
800 test_timer_cval(timer, cval, wm, true, DEF_CNT);
801 test_timer_tval(timer, tval, wm, true, DEF_CNT);
805 static void guest_run_iteration(enum arch_timer timer)
807 test_basic_functionality(timer);
808 test_timers_sanity_checks(timer);
810 test_timers_above_tval_max(timer);
811 test_timers_in_the_past(timer);
813 test_move_counters_ahead_of_timers(timer);
814 test_move_counters_behind_timers(timer);
815 test_reprogram_timers(timer);
817 test_timers_fired_multiple_times(timer);
819 test_timer_control_mask_then_unmask(timer);
820 test_timer_control_masks(timer);
823 static void guest_code(enum arch_timer timer)
840 guest_run_iteration(timer);
843 test_long_timer_delays(timer);
866 enum arch_timer timer)
868 if (timer == PHYSICAL)
878 enum arch_timer timer = uc->args[3];
882 kvm_set_cntxct(vcpu, val, timer);
941 enum arch_timer timer)
951 vcpu_args_set(*vcpu, 1, timer);
979 pr_info("\t-p: Test physical timer (default: true)\n");
980 pr_info("\t-v: Test virtual timer (default: true)\n");