Changeset ce60be1 in mainline
- Timestamp:
- 2012-11-29T12:45:53Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 69c1995, b26396e
- Parents:
- 123be4f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/fpu_context.c
r123be4f rce60be1 36 36 #include <fpu_context.h> 37 37 #include <arch.h> 38 #include <arch/types.h> 38 39 #include <cpu.h> 39 40 … … 44 45 #define FPSID_VARIANT(r) (((r) >> 4) 0xf) 45 46 #define FPSID_REVISION(r) (((r) >> 0) 0xf) 47 48 46 49 enum { 47 50 FPU_VFPv1 = 0x00, 48 51 FPU_VFPv2_COMMONv1 = 0x01, 49 52 FPU_VFPv3_COMMONv2 = 0x02, 50 FPU_VFPv3_NO_COMMON = 0x3, /* Does not support trap*/53 FPU_VFPv3_NO_COMMON = 0x3, /* Does not support fpu exc. traps */ 51 54 FPU_VFPv3_COMMONv3 = 0x4, 52 55 }; 53 56 54 57 enum { 55 FPEXC_E NABLED_FLAG = 0x40000000,56 FPEXC_E X_FLAG = 0x80000000,58 FPEXC_EX_FLAG = (1 << 31), 59 FPEXC_ENABLED_FLAG = (1 << 30), 57 60 }; 61 62 /** ARM Architecture Reference Manual ch. B4.1.58, p. B$-1551 */ 63 enum { 64 FPSCR_N_FLAG = (1 << 31), 65 FPSCR_Z_FLAG = (1 << 30), 66 FPSCR_C_FLAG = (1 << 29), 67 FPSCR_V_FLAG = (1 << 28), 68 FPSCR_QC_FLAG = (1 << 27), 69 FPSCR_AHP_FLAG = (1 << 26), 70 FPSCR_DN_FLAG = (1 << 25), 71 FPSCR_FZ_FLAG = (1 << 24), 72 FPSCR_ROUND_MODE_MASK = (0x3 << 22), 73 FPSCR_ROUND_TO_NEAREST = (0x0 << 22), 74 FPSCR_ROUND_TO_POS_INF = (0x1 << 22), 75 FPSCR_ROUND_TO_NEG_INF = (0x2 << 22), 76 FPSCR_ROUND_TO_ZERO = (0x3 << 22), 77 FPSCR_STRIDE_MASK = (0x3 << 20), 78 FPSCR_STRIDE_SHIFT = 20, 79 FPSCR_LEN_MASK = (0x7 << 16), 80 FPSCR_LEN_SHIFT = 16, 81 FPSCR_DENORMAL_EN_FLAG = (1 << 15), 82 FPSCR_INEXACT_EN_FLAG = (1 << 12), 83 FPSCR_UNDERFLOW_EN_FLAG = (1 << 11), 84 FPSCR_OVERFLOW_EN_FLAG = (1 << 10), 85 FPSCR_ZERO_DIV_EN_FLAG = (1 << 9), 86 FPSCR_INVALID_OP_EN_FLAG = (1 << 8), 87 FPSCR_DENORMAL_FLAG = (1 << 7), 88 FPSCR_INEXACT_FLAG = (1 << 4), 89 FPSCR_UNDERFLOW_FLAG = (1 << 3), 90 FPSCR_OVERLOW_FLAG = (1 << 2), 91 FPSCR_DIV_ZERO_FLAG = (1 << 1), 92 FPSCR_INVALID_OP_FLAG = (1 << 0), 93 94 FPSCR_EN_ALL = FPSCR_DENORMAL_EN_FLAG | FPSCR_INEXACT_EN_FLAG | FPSCR_UNDERFLOW_EN_FLAG | FPSCR_OVERFLOW_EN_FLAG | FPSCR_ZERO_DIV_EN_FLAG | FPSCR_INVALID_OP_EN_FLAG, 95 }; 96 97 static inline uint32_t fpscr_read() 98 { 99 uint32_t reg; 100 asm volatile ( 101 "vmrs %0, fpscr\n" 102 :"=r" (reg):: 103 ); 104 return reg; 105 } 106 107 static inline void fpscr_write(uint32_t val) 108 { 109 asm volatile ( 110 "vmsr fpscr, %0\n" 111 ::"r" (val): 112 ); 113 } 58 114 59 115 static inline uint32_t fpexc_read() … … 177 233 fpexc_write(0); 178 234 fpu_enable(); 235 /* Mask all exception traps, 236 * The bits are RAZ/WI on archs that don't support fpu exc traps. 237 */ 238 fpscr_write(fpscr_read() & ~FPSCR_EN_ALL); 179 239 } 180 240 … … 230 290 const uint32_t fpexc = fpexc_read(); 231 291 if (fpexc & FPEXC_ENABLED_FLAG) { 232 printf("FPU exception with FPU on\n"); 292 const uint32_t fpscr = fpscr_read(); 293 printf("FPU exception\n" 294 "\tFPEXC: %" PRIx32 " FPSCR: %" PRIx32 "\n", fpexc, fpscr); 233 295 return false; 234 296 }
Note:
See TracChangeset
for help on using the changeset viewer.