/* * Test that thread suspending works when idling the system. * Note: This test non-deterministically fails. If you find only this test * try re-running the test suite. */ static int test_thread_suspend(env_t env) { helper_thread_t t1; volatile seL4_Word counter; ZF_LOGD("test_thread_suspend\n"); create_helper_thread(env, &t1); set_helper_priority(&t1, 100); start_helper(env, &t1, (helper_fn_t) counter_func, (seL4_Word) &counter, 0, 0, 0); timer_periodic(env->timer->timer, 10 * NS_IN_MS); timer_start(env->timer->timer); sel4_timer_handle_single_irq(env->timer); seL4_Word old_counter; /* Let the counter thread run. We might have a pending interrupt, so * wait twice. */ wait_for_timer_interrupt(env); wait_for_timer_interrupt(env); old_counter = counter; /* Let it run again. */ wait_for_timer_interrupt(env); /* Now, counter should have moved. */ test_check(counter != old_counter); old_counter = counter; /* Suspend the thread, and wait again. */ seL4_TCB_Suspend(t1.thread.tcb.cptr); wait_for_timer_interrupt(env); /* Counter should not have moved. */ test_check(counter == old_counter); old_counter = counter; /* Check once more for good measure. */ wait_for_timer_interrupt(env); /* Counter should not have moved. */ test_check(counter == old_counter); old_counter = counter; /* Resume the thread and check it does move. */ seL4_TCB_Resume(t1.thread.tcb.cptr); wait_for_timer_interrupt(env); test_check(counter != old_counter); /* Done. */ timer_stop(env->timer->timer); sel4_timer_handle_single_irq(env->timer); cleanup_helper(env, &t1); return sel4test_get_result(); }
int test_timer(driver_env_t env) { int error = ltimer_set_timeout(&env->timer.ltimer, 1 * NS_IN_S, TIMEOUT_PERIODIC); test_assert_fatal(!error); for (int i = 0; i < 3; i++) { wait_for_timer_interrupt(env); ZF_LOGV("Tick\n"); } error = ltimer_reset(&env->timer.ltimer); test_assert_fatal(!error); return sel4test_get_result(); }
static int test_interrupt(env_t env) { int error = timer_periodic(env->timer->timer, 10 * NS_IN_MS); timer_start(env->timer->timer); sel4_timer_handle_single_irq(env->timer); test_check(error == 0); for (int i = 0; i < 3; i++) { wait_for_timer_interrupt(env); } timer_stop(env->timer->timer); sel4_timer_handle_single_irq(env->timer); return sel4test_get_result(); }
int test_gettime_timeout(driver_env_t env) { int error = 0; uint64_t start, end; start = timestamp(env); error = ltimer_set_timeout(&env->timer.ltimer, 1 * NS_IN_MS, TIMEOUT_PERIODIC); test_assert_fatal(!error); for (int i = 0; i < 3; i++) { wait_for_timer_interrupt(env); ZF_LOGV("Tick\n"); } end = timestamp(env); test_gt(end, start); error = ltimer_reset(&env->timer.ltimer); test_assert_fatal(!error); return sel4test_get_result(); }