r_icu_feret.h 7.61 KB
Newer Older
时昊's avatar
时昊 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
/*===========================================================================*/
/* Module      = icu_feret.h                                                 */
/* Version     = V3.04                                                       */
/* History:                                                                  */
/*               V3.00 initial Version                                       */
/*               V3.01 changed register usage                                */
/*                     save FEIC and FEPSW                                   */
/*               V3.02 added support for no CALLT register save              */
/*               V3.03 added support for no RH850G3K without H/W FPU         */
/*               V3.04 fit to use along with cpu.h                           */
/*===========================================================================*/
/*                                  COPYRIGHT                                */
/*===========================================================================*/
/* Copyright (c) 2011 by Renesas Electronics Europe GmbH,                    */
/*               a company of the Renesas Electronics Corporation            */
/*===========================================================================*/
/* Purpose:      Definition of Fatal Exception Handler                       */
/*                                                                           */
/*===========================================================================*/
/*                                                                           */
/* Warranty Disclaimer                                                       */
/*                                                                           */
/* Because the Product(s) is licensed free of charge, there is no warranty   */
/* of any kind whatsoever and expressly disclaimed and excluded by Renesas,  */
/* either expressed or implied, including but not limited to those for       */
/* non-infringement of intellectual property, merchantability and/or         */
/* fitness for the particular purpose.                                       */
/* Renesas shall not have any obligation to maintain, service or provide bug */
/* fixes for the supplied Product(s) and/or the Application.                 */
/*                                                                           */
/* Each User is solely responsible for determining the appropriateness of    */
/* using the Product(s) and assumes all risks associated with its exercise   */
/* of rights under this Agreement, including, but not limited to the risks   */
/* and costs of program errors, compliance with applicable laws, damage to   */
/* or loss of data, programs or equipment, and unavailability or             */
/* interruption of operations.                                               */
/*                                                                           */
/* Limitation of Liability                                                   */
/*                                                                           */
/* In no event shall Renesas be liable to the User for any incidental,       */
/* consequential, indirect, or punitive damage (including but not limited    */
/* to lost profits) regardless of whether such liability is based on breach  */
/* of contract, tort, strict liability, breach of warranties, failure of     */
/* essential purpose or otherwise and even if advised of the possibility of  */
/* such damages. Renesas shall not be liable for any services or products    */
/* provided by third party vendors, developers or consultants identified or  */
/* referred to the User by Renesas in connection with the Product(s) and/or  */
/* the Application.                                                          */
/*                                                                           */
/*===========================================================================*/
/* Environment:                                                              */
/*              Device:         RH850G3M cores devices (with FPU)            */
/*                              RH850G3K cores (__HAS_FPU__ is undefined)    */
/*              IDE:            GHS Multi for V800                           */
/*===========================================================================*/
#if defined(__ghs__)
    #pragma ghs startnomisra
#endif

#ifndef __ICU_FERET_H__
    #define __ICU_FERET_H__

    #define __HAS_FPU__

asm void FETRAP_ENTRY(void)
{
    pushsp  lp-lp
    pushsp  r1-r2
    #if ( __V800_registermode == 32 )
    pushsp  r5-r31
    #endif
    #if ( __V800_registermode == 26 )
    pushsp  r5-r16              -- r17 to r22 are reserved for user
    pushsp  r23-r31
    #endif
    #if ( __V800_registermode == 22 )
    pushsp  r5-r14              -- r15 to r24 are reserved for user
    pushsp  r25-r31
    #endif
    pushsp  ep-ep
    stsr    14, r6,  0          -- FEIC
    stsr     3, r7,  0          -- FEPSW
    stsr     2, r8,  0          -- FEPC
    #ifndef __V800_ignore_callt_state_in_interrupts__
    stsr    17, r9,  0          -- CTPSW
    stsr    16, r10, 0          -- CTPC
        #ifdef __HAS_FPU__
    stsr     6, r11, 0          -- FPSR
    stsr     7, r12, 0          -- FPEPC
    pushsp  r6-r12              -- FPU and CALLT to save
        #else
    pushsp  r6-r10             -- CALLT to save
        #endif /* __HAS_FPU__ */

    #else /* do not save callt control registers */
        #ifdef __HAS_FPU__
                                                             stsr 6,
        r9, 0 --FPSR stsr 7, r10, 0 --FPEPC pushsp r6 - r10-- FPU reg to save
        #else
                                                                 pushsp           r6
                                                             - r8-- no FPU and no CALLT
        #endif /* __HAS_FPU__ */
    #endif
}

asm void FETRAP_LEAVE(void)
{
    #ifndef __V800_ignore_callt_state_in_interrupts__
        #ifdef __HAS_FPU__
    popsp   r6-r12
    ldsr    r12,  7, 0          -- FPEPC
    ldsr    r11,  6, 0          -- FPSR
    ldsr    r10, 16, 0          -- CTPC
    ldsr    r9,  17, 0          -- CTPSW
        #else
    popsp   r6-r10            
    ldsr    r10, 16, 0          -- CTPC
    ldsr    r9,  17, 0          -- CTPSW
        #endif /* __HAS_FPU__ */

    #else /* do not restore callt control registers */
        #ifdef __HAS_FPU__
    popsp r6 - r10 ldsr r10, 7, 0 --FPEPC ldsr r9, 6, 0 --FPSR
        #else
    popsp                                                                         r6 - r8
        #endif /* __HAS_FPU__ */
    #endif                        
    ldsr    r8,  2, 0           -- FEPC
    ldsr    r7,  3, 0           -- FEPSW
    ldsr    r6, 14, 0           -- FEIC
    popsp   ep-ep
    #if ( __V800_registermode == 32 )
    popsp   r5-r31
    #endif
    #if ( __V800_registermode == 26 )
    popsp   r23-r31            -- r17 to r22 are reserved for user
    popsp   r5-r16
    #endif
    #if ( __V800_registermode == 22 )
    popsp   r25-r31            -- r15 to r24 are reserved for user
    popsp   r5-r14
    #endif
    popsp   r1-r2
    popsp   lp-lp
    feret
}

    #define PRAGMA(x) _Pragma(#x)

    #define FETRAP_EXCEPTION(name, isr)           \
        __attribute__((noinline)) void isr(void); \
        PRAGMA(ghs noprologue)                    \
        void name(void)                           \
        {                                         \
            FETRAP_ENTRY( );                      \
            isr( );                               \
            FETRAP_LEAVE( );                      \
        }

    #if defined(__ghs__)
        #pragma ghs endnomisra
    #endif

#endif /* __ICU_FERET_H__ */