#include "fault_test.h"

static jmp_buf jmpbuf;

static void restore_exec_to_jmpbuf(void)
{
	longjmp(jmpbuf, 1);
}

static void fault_test_fault(struct ex_regs *regs)
{
	regs->rip = (unsigned long)&restore_exec_to_jmpbuf;
}

static bool fault_test(struct fault_test_arg *arg)
{
	volatile uint64_t val;
	bool raised_vector = false;
	test_fault_func func = (test_fault_func) arg->func;
	/* Init as success in case there isn't callback */
	bool callback_success = true;

	if (arg->usermode) {
		val = run_in_user((usermode_func) func, arg->fault_vector,
				arg->arg[0], arg->arg[1], arg->arg[2],
				arg->arg[3], &raised_vector);
	} else {
		handle_exception(arg->fault_vector, fault_test_fault);
		if (setjmp(jmpbuf) == 0)
			val = func(arg->arg[0], arg->arg[1], arg->arg[2],
					arg->arg[3]);
		else
			raised_vector = true;
	}

	if (!raised_vector) {
		arg->retval = val;
		if (arg->callback != NULL)
			callback_success = arg->callback(arg);
	}

	return arg->should_fault ?
		raised_vector : (!raised_vector && callback_success);
}

void test_run(struct fault_test *test)
{
	bool passed = fault_test(&(test->arg));

	report(passed, "%s", test->name);
}

