summaryrefslogtreecommitdiff
path: root/nuttx/arch/mips/include/mips32
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/mips/include/mips32')
-rwxr-xr-xnuttx/arch/mips/include/mips32/cp0.h1
-rwxr-xr-xnuttx/arch/mips/include/mips32/irq.h249
-rwxr-xr-xnuttx/arch/mips/include/mips32/registers.h2
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