/*
 *	ucontext.h
 *
 *	ユーザーコンテキスト(System V互換)
 *
 *	* Sun May 17 15:20:04 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __UCONTEXT_H__
#define __UCONTEXT_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
//stack_tは本来signal.hで定義すべきだが、P/ECEにはsignal.hが無いので、ucontext.hに含めて定義する事にした。
typedef struct {
	void*			ss_sp;			//+ 0, 4 スタックのベースアドレス
     //	int			ss_flags;		//       フラグ
	size_t			ss_size;		//+ 4, 4 スタックのバイト数
} stack_t;						//= 8
/*--------------------------------------------------------------------------*/
typedef struct mcontext {
	int			r0;			//+ 0, 4 %r0
	int			r1;			//+ 4, 4 %r1
	int			r2;			//+ 8, 4 %r2
	int			r3;			//+12, 4 %r3
	void*			sp;			//+16, 4 %sp
	void*			pc;			//+20, 4 %pc
} mcontext_t;						//=24
/*--------------------------------------------------------------------------*/
typedef struct ucontext {
	struct ucontext*	uc_link;		//+ 0, 4 現在のコンテキストが終了したとき、続いて切り替わるコンテキストへのポインタ(現在のコンテキストがmakecontext()で生成されたものの場合)
     //	sigset_t		uc_sigmask;		//       このコンテキストでブロックされているシグナル群
	stack_t			uc_stack;		//+ 4, 8 このコンテキストが用いているスタック
	mcontext_t		uc_mcontext;		//+12,24 保存されているコンテキストのマシン特有の表現形式
} ucontext_t;						//=36
/****************************************************************************
 *	
 ****************************************************************************/
int getcontext(ucontext_t* ucp);
int setcontext(const ucontext_t* ucp);
void makecontext(ucontext_t* ucp, void (*func)(), int argc, ...);
int swapcontext(ucontext_t* oucp, const ucontext_t* ucp);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__UCONTEXT_H__
