Linux Audio

Check our new training course

Loading...
/*
 * Copyright (c) 2018 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ztest.h>

extern void test_nested_isr(void);
extern void test_prevent_interruption(void);

extern void z_irq_spurious(void *unused);

/* Simple whitebox test of dynamic interrupt handlers as implemented
 * by the GEN_SW_ISR feature.
 */
#if (defined(CONFIG_DYNAMIC_INTERRUPTS)		\
     && defined(CONFIG_GEN_SW_ISR_TABLE))
#define DYNTEST 1
#endif

#ifdef DYNTEST
static void dyn_isr(void *arg)
{
	ARG_UNUSED(arg);
}

extern struct _isr_table_entry __sw_isr_table _sw_isr_table[];

static void do_isr_dynamic(void)
{
	int i;
	void *argval;

	for (i = CONFIG_GEN_IRQ_START_VECTOR; i < CONFIG_NUM_IRQS; i++) {
		if (_sw_isr_table[i].isr == z_irq_spurious) {
			break;
		}
	}

	zassert_true(_sw_isr_table[i].isr == z_irq_spurious,
		     "could not find slot for dynamic isr");

	argval = &i;
	z_arch_irq_connect_dynamic(i, 0, dyn_isr, argval, 0);

	zassert_true(_sw_isr_table[i].isr == dyn_isr &&
		     _sw_isr_table[i].arg == argval,
		     "dynamic isr did not install successfully");
}
#endif /* DYNTEST */

void test_isr_dynamic(void)
{
#ifdef DYNTEST
	do_isr_dynamic();
#else
	ztest_test_skip();
#endif
}

void test_main(void)
{
	ztest_test_suite(interrupt_feature,
			ztest_unit_test(test_isr_dynamic),
			ztest_unit_test(test_nested_isr),
			ztest_unit_test(test_prevent_interruption)
			);
	ztest_run_test_suite(interrupt_feature);
}