# Blackfin testcase for aborting an excepting insn immediately
# mach: bfin
# sim: --environment operating

#include "test.h"
	.include "testutils.inc"

	# This test keeps P5 as the base of the EVT table

	.macro set_evt lvl:req, sym:req
	loadsym R1, \sym;
	[P5 + 4 * \lvl\()] = R1;
	.endm

	start

	# Set up exception handler
	imm32 P4, EVT3;
	loadsym R1, _evx;
	[P4] = R1;

	# Lower ourselves to userspace
	loadsym R1, _user;
	RETI = R1;
	RTI;

_user:
	imm32 R0, 0x12345678;
	R1 = R0;
	imm32 P0, 0xffffffff;
	P1 = P0;
_user_fail:
	# Sometimes this even causes immediate double faults when
	# exceptions are not exact since this may trigger multiple
	R0 = [P0++];

	JUMP fail_lvl;

_evx:
	# RETX should be pointing to the right place
	loadsym R6, _user_fail;
	R7 = RETX;
	CC = R6 == R7;
	IF !CC JUMP fail_lvl;

	# R0 and P0 should be unchanged
	CC = R1 == R0;
	IF !CC JUMP fail_lvl;
	CC = P1 == P0;
	IF !CC JUMP fail_lvl;

	dbg_pass
fail_lvl:
	dbg_fail