/**
 * @file offset.h
 * @brief Relative addresses of registers
 * 
 * Relative addresses of registers as they are stored on the stack. Add
 * these constants to the context top to address concrete register.
 *
 * This file is usable to include into the C source code as well as into
 * the assembler code.
 *
 * Note that registers K0, K1 and SP are not stored.
 * 
 */

/** 
 * @name General registers 
 * @{
 */
#define OFFSET_ZERO	0x00
#define	OFFSET_AT	0x04
#define OFFSET_V0	0x08
#define OFFSET_V1	0x0c
#define OFFSET_A0	0x10
#define OFFSET_A1	0x14
#define OFFSET_A2	0x18
#define OFFSET_A3	0x1c
#define OFFSET_T0	0x20
#define OFFSET_T1	0x24
#define OFFSET_T2	0x28
#define OFFSET_T3	0x2c
#define OFFSET_T4	0x30
#define OFFSET_T5	0x34
#define OFFSET_T6	0x38
#define OFFSET_T7	0x3c
#define OFFSET_S0	0x40
#define OFFSET_S1	0x44
#define OFFSET_S2	0x48
#define OFFSET_S3	0x4c
#define OFFSET_S4	0x50
#define OFFSET_S5	0x54
#define OFFSET_S6	0x58
#define OFFSET_S7	0x5c
#define OFFSET_T8	0x60
#define OFFSET_T9	0x64
#define OFFSET_K0	0x68
#define OFFSET_K1	0x6c
#define OFFSET_GP	0x70
#define OFFSET_FP	0x74
#define OFFSET_SP	0x78
#define OFFSET_RA	0x7c
/** @} */

/** 
 * @name Special registers
 * @{
 */
#define OFFSET_LO	0x80
#define OFFSET_HI	0x84
/** @} */

/** 
 * @name System registers
 * @{
 */
#define OFFSET_EPC	0x88
#define OFFSET_CAUSE	0x8c
#define OFFSET_BADVADDR	0x90
#define OFFSET_STATUS	0x94
/** @} */

/**
 * @brief Context frame size
 * Context frame size. The calculation is :
 * general registers - 32*4,
 * Lo and Hi - 2*4,
 * Status, BadVAddr and Cause - 3*4,
 * Return address - 1*4
 */
#define EX_STACK_FRAME (32*4 + 2*4 + 3*4 + 1*4)
