

/*! \file contextswitch.h
\brief Inclusion et choix de la commutation de contexte

 Ce fichier inclut les définitions des différentes interfaces de commutation de contexte. Il permet de choisir par le biais d'une définition de macro variable l'implantation à utiliser (voir le fichier  makefile  )
	- _SETJMP_LINUX_IA32_ pour une implantation sous Linux/IA32 avec setjmp/longjmp
	- _SETJMP_SOLARIS_SPARC32_ pour une implantation sous Solaris/Sparc32 avec setjmp/longjmp
	- _ARCH_IA32_ pour une implantation native sous Linux/IA32 

*/
#ifndef CONTEXTSWITCH_H
#define CONTEXTSWITCH_H                             

#if defined(_SETJMP_LINUX_IA32_)
#define _USE_SETJMP_LINUX_IA32_
#elif defined(_SETJMP_SOLARIS_SPARC32_)
#define _USE_SETJMP_SOLARIS_SPARC32_
#elif defined( _ARCH_IA32_)
#define _USE_ARCH_IA32_
#else 
#error " PAS DE GESTION DE FredContexte"
#endif 

#if defined(_USE_SETJMP_LINUX_IA32_)
#include<setjmp.h>
#define FredContext LinuxIA32FredContext
#define FredContextRestore(R) LinuxIA32FredContextRestore(R)
#define FredContextSwitch(O,N) LinuxIA32FredContextSwitch(O,N)
#define FredContextInit(CTX,STK,ENTRY) LinuxIA32FredContextInit(CTX,STK,ENTRY)
/*! \ingroup Gctxlinuxia32
\brief Contexte de sauvegarde : un jmp_buf de linux
*/
typedef jmp_buf LinuxIA32FredContext; 

extern void LinuxIA32FredContextRestore(LinuxIA32FredContext  restore);
extern void LinuxIA32FredContextSwitch( LinuxIA32FredContext old, FredContext  nw);
extern  void  LinuxIA32FredContextInit(LinuxIA32FredContext ctx , 
				char * SP , /* sommet de pile  */
				void  (*entry)() /* point de démarrage */
        );
#endif

#if defined(_USE_SETJMP_SOLARIS_SPARC32_)
#include<setjmp.h>
#define FredContext SolarisSparc32FredContext
#define FredContextRestore(R) SolarisSparc32FredContextRestore(R)
#define FredContextSwitch(O,N) SolarisSparc32FredContextSwitch(O,N)
#define FredContextInit(CTX,STK,ENTRY) SolarisSparc32FredContextInit(CTX,STK,ENTRY)
/*! \ingroup Gctxsolarissparc32
\brief Contexte de sauvegarde : un jmp_buf de solaris
*/
typedef jmp_buf SolarisSparc32FredContext; 

extern void SolarisSparc32FredContextRestore(SolarisSparc32FredContext  restore);
extern void SolarisSparc32FredContextSwitch( SolarisSparc32FredContext old, FredContext  nw);
extern  void  SolarisSparc32FredContextInit(SolarisSparc32FredContext ctx , 
				char * SP , /* sommet de pile  */
				void  (*entry)() /* point de démarrage */
        );
#endif

#if defined( _USE_ARCH_IA32_)
#define FredContext IA32FredContext
#define FredContextRestore(R) IA32FredContextRestore(R)
#define FredContextSwitch(O,N) IA32FredContextSwitch(O,N)
#define FredContextInit(CTX,STK,ENTRY) IA32FredContextInit(CTX,STK,ENTRY)
#define FredContext IA32FredContext
/*! \ingroup Gctxia32
\brief Contexte de sauvegarde : un pointeur de sommet de pile où on été empilés tous les autres registes
*/
typedef int IA32FredContext[1];
 
extern void IA32FredContextRestore(IA32FredContext  restore);
extern void IA32FredContextSwitch( IA32FredContext old, FredContext  nw);
extern  void  IA32FredContextInit(IA32FredContext ctx , 
				char * SP , /* sommet de pile  */
				void  (*entry)() /* point de démarrage */
        );
#endif 


                                                     
   






#endif

