//------------------------------------------------------------------------------
//  TOPPERS/ASP Windows Debug Environment
//  Copyright (C) 2010-2011 Cores Co., Ltd. Japan
//------------------------------------------------------------------------------
// $Id: core_support.cpp 92 2011-08-07 05:57:30Z nagasima $
#include "StdAfx.h"
#include "prc_insn.h"
#include "WinKernel.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// 贋ＩＴＲＯＮカーネル
extern CKernel *g_Kernel;

volatile uint32_t psw;

uint32_t current_psw(void)
{
	return psw;
}

void set_psw(uint32_t psw)
{
	::psw = psw;
}

void disable_int(void)
{
	g_Kernel->LockCPU();
}

void enable_int(void)
{
	g_Kernel->UnlockCPU();
}

bool faultmask;

/*
 *  NMIを除くすべての割込みの禁止
 */
bool_t TOPPERS_disint(void)
{
	bool val = faultmask;

	if (!val) {
		g_Kernel->LockCPU();
		faultmask = true;
	}

	return val;
}

void TOPPERS_enaint(bool_t locked)
{
	if (!locked) {
		faultmask = false;
		g_Kernel->UnlockCPU();
	}
}

/*
 *  割込みハンドラの設定
 */
void x_define_inh(uint_t inhno, FP int_entry)
{
	g_Kernel->DefineInterruptHandler(inhno - 8, int_entry);
}

bool starting = true;

/*
 *  コンテキストの参照
 */
bool_t sense_context(void)
{
	return !g_Kernel->InTaskContext() && !starting;
}

/*
 *  CPU例外の発生した時のコンテキストの参照
 */
bool_t exc_sense_context(void)
{
	return !g_Kernel->InTaskContext() && !starting;
}

/*
 *  カーネル起動時タスクディスパッチャ
 */
void _start_dispatch(void)
{
	starting = false;
}

/*
 *  タスクディスパッチャ
 */
void dispatch(void)
{
	g_Kernel->Dispatch();
}

/*
 *  現在のコンテキストを捨ててディスパッチ
 */
void exit_and_dispatch(void)
{
	TCB *Task = get_tcb_self(TSK_SELF);
	t_unlock_cpu();
	g_Kernel->ReleaseCPUContext((CCPUContext *)Task->tskctxb.cpu_context);
}

/*
 *  カーネルの終了処理の呼出し
 *
 *  スタックを非タスクコンテキスト用に切り替え．
 *  
 */
void call_exit_kernel(void)
{
	g_Kernel->Terminate();
}

/*
 *  タスク起動処理
 *
 */ 
void start_r(void)
{
	lock_flag = false;
	psw = 0;
}

extern "C" void Throw()
{
	throw 1;
}
