/*
 * \brief  Kernel backend for execution contexts in userland
 * \author Adrian-Ken Rueegsegger
 * \author Reto Buerki
 * \author Stefan Kalkowski
 * \date   2015-02-09
 */

/*
 * Copyright (C) 2015-2017 Genode Labs GmbH
 *
 * This file is part of the Genode OS framework, which is distributed
 * under the terms of the GNU Affero General Public License version 3.
 */

/* core includes */
#include <kernel/cpu.h>
#include <kernel/thread.h>

using namespace Kernel;

void Thread::exception(Cpu & cpu)
{
	using Genode::Cpu_state;

	switch (regs->trapno) {
	case Cpu_state::PAGE_FAULT:
		_mmu_exception();
		return;
	case Cpu_state::UNDEFINED_INSTRUCTION:
		Genode::raw(*this, ": undefined instruction at ip=", (void*)regs->ip);
		_die();
		return;
	case Cpu_state::SUPERVISOR_CALL:
		_call();
		return;
	}
	if (regs->trapno >= Cpu_state::INTERRUPTS_START &&
	    regs->trapno <= Cpu_state::INTERRUPTS_END) {
		_interrupt(cpu.id());
		return;
	}
	Genode::raw(*this, ": triggered unknown exception ", regs->trapno,
	            " with error code ", regs->errcode, " at ip=", (void*)regs->ip, " sp=", (void*)regs->sp);

	_die();
}
