/*
 *--------------------------------------------------------------------
 * Funktionen aus locore.S
 * Holger Lehmann
 * Krabat Projekt
 *--------------------------------------------------------------------
 */

#ifndef __LOCORE_H
#define __LOCORE_H

#include <cpu.h>

/**
  * Hält das System komplett an
  */
void halt(void) __attribute__ ((noreturn));

/**
  * Trägt den kompletten Prozeßkontext ein.
  * @param new_ctx Enthält einen gültigen neuen Kontext eines Task Kontroll Blocks.
  */
void context_intr_swap( context_t * new_ctx );

/**
  * Wechselt den kompletten Prozeßkontext.
  * @param old_ctx Erhält den alten Kontext in seinen Task Kontroll Block.
  * @param new_ctx Enthält einen gültigen neuen Kontext eines Task Kontroll Blocks.
  */
void context_swap( context_t * old_ctx , context_t * new_ctx );

/**
  * Setzt die Interruptmaske auf mask
  * @param mask Interruptmaske.
  */
void splx( unsigned short mask );

/**
  * Sperrt alle Interrupts
  * @return die alte Interruptmaske
  */
unsigned short splhi();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 7
  * @return die alte Interruptmaske
  */
unsigned short spl7();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 6
  * @return die alte Interruptmaske
  */
unsigned short spl6();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 5
  * @return die alte Interruptmaske
  */
unsigned short spl5();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 4
  * @return die alte Interruptmaske
  */
unsigned short spl4();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 3
  * @return die alte Interruptmaske
  */
unsigned short spl3();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 2
  * @return die alte Interruptmaske
  */
unsigned short spl2();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 1
  * @return die alte Interruptmaske
  */
unsigned short spl1();

/**
  * Sperrt alle Interrupts kleiner und gleich Interruplevel 0
  * @return die alte Interruptmaske
  */
unsigned short spl0();

/**
  * Trägt die vec_func in der Vektortabelle ein.
  * @param vec_no Nummer des Vektors, auf den die die vec_func ansprechen soll
  * @param vec_func Zeiger auf die aufzurufende Funktion, sobald ein entsprechender Interrupt oder Trap erfolgte
  */
void vec_set( unsigned long vec_no , void (*vec_func)(void) ) ;

#endif /* __LOCORE_H */
