Changeset ce60be1 in mainline


Ignore:
Timestamp:
2012-11-29T12:45:53Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
69c1995, b26396e
Parents:
123be4f
Message:

arm32, fpu: Mask all traps during fpu initialization.

We do this on ia32 and amd64 too

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/fpu_context.c

    r123be4f rce60be1  
    3636#include <fpu_context.h>
    3737#include <arch.h>
     38#include <arch/types.h>
    3839#include <cpu.h>
    3940
     
    4445#define FPSID_VARIANT(r)   (((r) >> 4) 0xf)
    4546#define FPSID_REVISION(r)   (((r) >> 0) 0xf)
     47
     48
    4649enum {
    4750        FPU_VFPv1 = 0x00,
    4851        FPU_VFPv2_COMMONv1 = 0x01,
    4952        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 */
    5154        FPU_VFPv3_COMMONv3 = 0x4,
    5255};
    5356
    5457enum {
    55         FPEXC_ENABLED_FLAG = 0x40000000,
    56         FPEXC_EX_FLAG = 0x80000000,
     58        FPEXC_EX_FLAG = (1 << 31),
     59        FPEXC_ENABLED_FLAG = (1 << 30),
    5760};
     61
     62/** ARM Architecture Reference Manual ch. B4.1.58, p. B$-1551 */
     63enum {
     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
     97static 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
     107static inline void fpscr_write(uint32_t val)
     108{
     109        asm volatile (
     110                "vmsr fpscr, %0\n"
     111                ::"r" (val):
     112        );
     113}
    58114
    59115static inline uint32_t fpexc_read()
     
    177233        fpexc_write(0);
    178234        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);
    179239}
    180240
     
    230290        const uint32_t fpexc = fpexc_read();
    231291        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);
    233295                return false;
    234296        }
Note: See TracChangeset for help on using the changeset viewer.