diff options
Diffstat (limited to 'nuttx/arch/mips/include/mips32')
-rwxr-xr-x | nuttx/arch/mips/include/mips32/cp0.h | 1 | ||||
-rwxr-xr-x | nuttx/arch/mips/include/mips32/irq.h | 249 | ||||
-rwxr-xr-x | nuttx/arch/mips/include/mips32/registers.h | 2 |
3 files changed, 249 insertions, 3 deletions
diff --git a/nuttx/arch/mips/include/mips32/cp0.h b/nuttx/arch/mips/include/mips32/cp0.h index 54b0a7b8e..b0832f207 100755 --- a/nuttx/arch/mips/include/mips32/cp0.h +++ b/nuttx/arch/mips/include/mips32/cp0.h @@ -225,6 +225,7 @@ # define CP0_STATUS_IM6 (0x40 << CP0_STATUS_IM_SHIFT)
# define CP0_STATUS_IM_TIMER (0x80 << CP0_STATUS_IM_SHIFT) /* IM7 = Hardware/Timer/Perf interrupts */
# define CP0_STATUS_IM7 (0x80 << CP0_STATUS_IM_SHIFT)
+# define CP0_STATUS_IM_ALL (0xff << CP0_STATUS_IM_SHIFT)
#define CP0_STATUS_IMPL_SHIFT (16) /* Bits 16-17: Implementation dependent */
#define CP0_STATUS_IMPL_MASK (3 << CP0_STATUS_IMPL_SHIFT)
#define CP0_STATUS_NMI (1 << 19) /* Bit 19: Reset exception due to an NMI */
diff --git a/nuttx/arch/mips/include/mips32/irq.h b/nuttx/arch/mips/include/mips32/irq.h index 1dea3c795..8d1e2a036 100755 --- a/nuttx/arch/mips/include/mips32/irq.h +++ b/nuttx/arch/mips/include/mips32/irq.h @@ -44,15 +44,260 @@ * Included Files ****************************************************************************/ +#include <nuttx/config.h> #include <arch/types.h> /**************************************************************************** * Definitions ****************************************************************************/ +/* Configuration ************************************************************/ +/* The global pointer (GP) does not need to be saved in the "normal," flat + * NuttX build. However, it would be necessary to save the GP if this is + * a KERNEL build or if NXFLAT is supported. + */ + +#undef MIPS32_SAVE_GP +#if defined(CONFIG_NUTTX_KERNEL) || defined(CONFIG_NXFLAT) +# define MIPS32_SAVE_GP 1 +#endif + +/* Register save state structure ********************************************/ +/* Co processor registers */ + +#define REG_MFLO_NDX 0 +#define REG_MFHI_NDX 1 +#define REG_EPC_NDX 2 + +/* General pupose registers */ +/* $0: Zero register does not need to be saved */ +/* $1: at_reg, assembler temporary */ + +#define REG_R1_NDX 3 + +/* $2-$3 = v0-v1: Return value registers */ + +#define REG_R2_NDX 4 +#define REG_R3_NDX 5 + +/* $4-$7 = a0-a3: Argument registers */ + +#define REG_R4_NDX 6 +#define REG_R5_NDX 7 +#define REG_R6_NDX 8 +#define REG_R7_NDX 9 + +/* $8-$15 = t0-t7: Volatile registers */ + +#define REG_R8_NDX 10 +#define REG_R9_NDX 11 +#define REG_R10_NDX 12 +#define REG_R11_NDX 13 +#define REG_R12_NDX 14 +#define REG_R13_NDX 15 +#define REG_R14_NDX 16 +#define REG_R15_NDX 17 + +/* $16-$23 = s0-s7: Static registers */ + +#define REG_R16_NDX 18 +#define REG_R17_NDX 19 +#define REG_R18_NDX 20 +#define REG_R19_NDX 21 +#define REG_R20_NDX 22 +#define REG_R21_NDX 23 +#define REG_R22_NDX 24 +#define REG_R23_NDX 25 + +/* $24-25 = t8-t9: More Volatile registers */ + +#define REG_R24_NDX 26 +#define REG_R25_NDX 27 + +/* $26-$27 = ko-k1: Reserved for use in exeption handers. These do not need + * to be saved. + */ + +/* $28 = gp: Only needs to be saved under conditions where there are + * multiple, per-thread values for the GP. + */ + +#ifdef MIPS32_SAVE_GP + +# define REG_R28_NDX 28 + +/* $29 = sp: The value of the stack pointer on return from the exception */ + +# define REG_R29_NDX 29 + +/* $30 = either s8 or fp: Depends if a frame pointer is used or not */ + +# define REG_R30_NDX 30 + +/* $31 = ra: Return address */ + +# define REG_R31_NDX 31 +# define XCPTCONTEXT_REGS 32 +#else + +/* $29 = sp: The value of the stack pointer on return from the exception */ + +# define REG_R29_NDX 28 + +/* $30 = either s8 or fp: Depends if a frame pointer is used or not */ + +# define REG_R30_NDX 29 + +/* $31 = ra: Return address */ + +# define REG_R31_NDX 30 +# define XCPTCONTEXT_REGS 31 +#endif +#define XCPTCONTEXT_SIZE (4 * XCPTCONTEXT_REGS) + +/* In assembly language, values have to be referenced as byte address + * offsets. But in C, it is more convenient to reference registers as + * register save table offsets. + */ + +#ifdef __ASSEMBLY__ +# define REG_MFLO (4*REG_MFLO_NDX) +# define REG_MFHI (4*REG_MFHI_NDX) +# define REG_EPC (4*REG_EPC_NDX) +# define REG_R1 (4*REG_R1_NDX) +# define REG_R2 (4*REG_R2_NDX) +# define REG_R3 (4*REG_R3_NDX) +# define REG_R4 (4*REG_R4_NDX) +# define REG_R5 (4*REG_R5_NDX) +# define REG_R6 (4*REG_R6_NDX) +# define REG_R7 (4*REG_R7_NDX) +# define REG_R8 (4*REG_R8_NDX) +# define REG_R9 (4*REG_R9_NDX) +# define REG_R10 (4*REG_R10_NDX) +# define REG_R11 (4*REG_R11_NDX) +# define REG_R12 (4*REG_R12_NDX) +# define REG_R13 (4*REG_R13_NDX) +# define REG_R14 (4*REG_R14_NDX) +# define REG_R15 (4*REG_R15_NDX) +# define REG_R16 (4*REG_R16_NDX) +# define REG_R17 (4*REG_R17_NDX) +# define REG_R18 (4*REG_R18_NDX) +# define REG_R19 (4*REG_R19_NDX) +# define REG_R20 (4*REG_R20_NDX) +# define REG_R21 (4*REG_R21_NDX) +# define REG_R22 (4*REG_R22_NDX) +# define REG_R23 (4*REG_R23_NDX) +# define REG_R24 (4*REG_R24_NDX) +# define REG_R25 (4*REG_R25_NDX) +# ifdef MIPS32_SAVE_GP +# define REG_R28 (4*REG_R28_NDX) +# endif +# define REG_R29 (4*REG_R29_NDX) +# define REG_R30 (4*REG_R30_NDX) +# define REG_R31 (4*REG_R31_NDX) +#else +# define REG_MFLO REG_MFLO_NDX +# define REG_MFHI REG_MFHI_NDX +# define REG_EPC REG_EPC_NDX +# define REG_R1 REG_R1_NDX +# define REG_R2 REG_R2_NDX +# define REG_R3 REG_R3_NDX +# define REG_R4 REG_R4_NDX +# define REG_R5 REG_R5_NDX +# define REG_R6 REG_R6_NDX +# define REG_R7 REG_R7_NDX +# define REG_R8 REG_R8_NDX +# define REG_R9 REG_R9_NDX +# define REG_R10 REG_R10_NDX +# define REG_R11 REG_R11_NDX +# define REG_R12 REG_R12_NDX +# define REG_R13 REG_R13_NDX +# define REG_R14 REG_R14_NDX +# define REG_R15 REG_R15_NDX +# define REG_R16 REG_R16_NDX +# define REG_R17 REG_R17_NDX +# define REG_R18 REG_R18_NDX +# define REG_R19 REG_R19_NDX +# define REG_R20 REG_R20_NDX +# define REG_R21 REG_R21_NDX +# define REG_R22 REG_R22_NDX +# define REG_R23 REG_R23_NDX +# define REG_R24 REG_R24_NDX +# define REG_R25 REG_R25_NDX +# ifdef MIPS32_SAVE_GP +# define REG_R28 REG_R28_NDX +# endif +# define REG_R29 REG_R29_NDX +# define REG_R30 REG_R30_NDX +# define REG_R31 REG_R31_NDX +#endif + +/* Now define more user friendly alternative name that can be used either + * in assembly or C contexts. + */ + +/* $1: at_reg, assembler temporary */ + +#define REG_AT REG_R1 + +/* $2-$3 = v0-v1: Return value registers */ + +#define REG_V0 REG_R2 +#define REG_V1 REG_R3 + +/* $4-$7 = a0-a3: Argument registers */ + +#define REG_A0 REG_R4 +#define REG_A1 REG_R5 +#define REG_A2 REG_R6 +#define REG_A3 REG_R7 + +/* $8-$15 = t0-t7: Volatile registers */ + +#define REG_T0 REG_R8 +#define REG_T1 REG_R9 +#define REG_T2 REG_R10 +#define REG_T3 REG_R11 +#define REG_T4 REG_R12 +#define REG_T5 REG_R13 +#define REG_T6 REG_R14 +#define REG_T7 REG_R15 + +/* $16-$23 = s0-s7: Static registers */ + +#define REG_S0 REG_R16 +#define REG_S1 REG_R17 +#define REG_S2 REG_R18 +#define REG_S3 REG_R19 +#define REG_S4 REG_R20 +#define REG_S5 REG_R21 +#define REG_S6 REG_R22 +#define REG_S7 REG_R23 + +/* $24-25 = t8-t9: More Volatile registers */ + +#define REG_T8 REG_R24 +#define REG_T9 REG_R25 + +/* $28 = gp: Only needs to be saved under conditions where there are + * multiple, per-thread values for the GP. + */ + +#ifdef MIPS32_SAVE_GP +# define REG_GP REG_R28 +#endif + +/* $29 = sp: The value of the stack pointer on return from the exception */ + +#define REG_SP REG_R29 + +/* $30 = either s8 or fp: Depends if a frame pointer is used or not */ + +#define REG_S8 REG_R30 +#define REG_FP REG_R30 -/* Lots of missing logic here */ +/* $31 = ra: Return address */ -#define XCPTCONTEXT_REGS 1 +#define REG_RA REG_R31 /**************************************************************************** * Public Types diff --git a/nuttx/arch/mips/include/mips32/registers.h b/nuttx/arch/mips/include/mips32/registers.h index 37f404cf8..997bc51d6 100755 --- a/nuttx/arch/mips/include/mips32/registers.h +++ b/nuttx/arch/mips/include/mips32/registers.h @@ -62,7 +62,7 @@ #define v0 $2 #define v1 $3 -/* Argument registers: First few parameters for a function */ +/* Argument registers: First four parameters to a function */ #define a0 $4 #define a1 $5 |