/*
 * 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);
}
