Modified version of the mbed library for use with the Nucleo boards.

Dependents:   EEPROMWrite Full-Project

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Sep 25 13:30:09 2015 +0100
Revision:
626:ba773d547214
Parent:
482:d9a48e768ce0
Synchronized with git revision e8c24ba90dd5507bdb7c1b46dd3aba8cfabb762b

Full URL: https://github.com/mbedmicro/mbed/commit/e8c24ba90dd5507bdb7c1b46dd3aba8cfabb762b/

RZ_A1H - Modify to support NEON for RTOS.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 390:35c2c1cf29cd 1 /**************************************************************************//**
mbed_official 390:35c2c1cf29cd 2 * @file system_MBRZA1H.c
mbed_official 390:35c2c1cf29cd 3 * @brief CMSIS Device System Source File for
mbed_official 626:ba773d547214 4 * ARM Cortex-A9 Device Series
mbed_official 390:35c2c1cf29cd 5 * @version V1.00
mbed_official 626:ba773d547214 6 * @date 09 January 2015
mbed_official 390:35c2c1cf29cd 7 *
mbed_official 390:35c2c1cf29cd 8 * @note
mbed_official 390:35c2c1cf29cd 9 *
mbed_official 390:35c2c1cf29cd 10 ******************************************************************************/
mbed_official 626:ba773d547214 11 /* Copyright (c) 2011 - 2015 ARM LIMITED
mbed_official 390:35c2c1cf29cd 12
mbed_official 390:35c2c1cf29cd 13 All rights reserved.
mbed_official 390:35c2c1cf29cd 14 Redistribution and use in source and binary forms, with or without
mbed_official 390:35c2c1cf29cd 15 modification, are permitted provided that the following conditions are met:
mbed_official 390:35c2c1cf29cd 16 - Redistributions of source code must retain the above copyright
mbed_official 390:35c2c1cf29cd 17 notice, this list of conditions and the following disclaimer.
mbed_official 390:35c2c1cf29cd 18 - Redistributions in binary form must reproduce the above copyright
mbed_official 390:35c2c1cf29cd 19 notice, this list of conditions and the following disclaimer in the
mbed_official 390:35c2c1cf29cd 20 documentation and/or other materials provided with the distribution.
mbed_official 390:35c2c1cf29cd 21 - Neither the name of ARM nor the names of its contributors may be used
mbed_official 390:35c2c1cf29cd 22 to endorse or promote products derived from this software without
mbed_official 390:35c2c1cf29cd 23 specific prior written permission.
mbed_official 390:35c2c1cf29cd 24 *
mbed_official 390:35c2c1cf29cd 25 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 390:35c2c1cf29cd 26 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 390:35c2c1cf29cd 27 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
mbed_official 390:35c2c1cf29cd 28 ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
mbed_official 390:35c2c1cf29cd 29 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
mbed_official 390:35c2c1cf29cd 30 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
mbed_official 390:35c2c1cf29cd 31 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
mbed_official 390:35c2c1cf29cd 32 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
mbed_official 390:35c2c1cf29cd 33 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
mbed_official 390:35c2c1cf29cd 34 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 390:35c2c1cf29cd 35 POSSIBILITY OF SUCH DAMAGE.
mbed_official 390:35c2c1cf29cd 36 ---------------------------------------------------------------------------*/
mbed_official 390:35c2c1cf29cd 37
mbed_official 390:35c2c1cf29cd 38
mbed_official 390:35c2c1cf29cd 39 #include <stdint.h>
mbed_official 390:35c2c1cf29cd 40 #include "MBRZA1H.h"
mbed_official 390:35c2c1cf29cd 41 #include "RZ_A1_Init.h"
mbed_official 390:35c2c1cf29cd 42
mbed_official 390:35c2c1cf29cd 43
mbed_official 482:d9a48e768ce0 44 #if defined(__ARMCC_VERSION)
mbed_official 390:35c2c1cf29cd 45 extern void $Super$$main(void);
mbed_official 390:35c2c1cf29cd 46 __asm void FPUEnable(void);
mbed_official 482:d9a48e768ce0 47 #else
mbed_official 482:d9a48e768ce0 48 void FPUEnable(void);
mbed_official 482:d9a48e768ce0 49
mbed_official 482:d9a48e768ce0 50 #endif
mbed_official 390:35c2c1cf29cd 51
mbed_official 390:35c2c1cf29cd 52 uint32_t IRQNestLevel;
mbed_official 626:ba773d547214 53 unsigned char seen_id0_active = 0; // single byte to hold a flag used in the workaround for GIC errata 733075
mbed_official 390:35c2c1cf29cd 54
mbed_official 390:35c2c1cf29cd 55
mbed_official 390:35c2c1cf29cd 56 /**
mbed_official 390:35c2c1cf29cd 57 * Initialize the cache.
mbed_official 390:35c2c1cf29cd 58 *
mbed_official 390:35c2c1cf29cd 59 * @param none
mbed_official 390:35c2c1cf29cd 60 * @return none
mbed_official 390:35c2c1cf29cd 61 *
mbed_official 390:35c2c1cf29cd 62 * @brief Initialise caches. Requires PL1, so implemented as an SVC in case threads are USR mode.
mbed_official 390:35c2c1cf29cd 63 */
mbed_official 626:ba773d547214 64 #if defined(__ARMCC_VERSION)
mbed_official 390:35c2c1cf29cd 65 #pragma push
mbed_official 390:35c2c1cf29cd 66 #pragma arm
mbed_official 390:35c2c1cf29cd 67
mbed_official 390:35c2c1cf29cd 68 void InitMemorySubsystem(void) {
mbed_official 390:35c2c1cf29cd 69
mbed_official 390:35c2c1cf29cd 70 /* This SVC is specific for reset where data / tlb / btac may contain undefined data, therefore before
mbed_official 390:35c2c1cf29cd 71 * enabling the cache you must invalidate the instruction cache, the data cache, TLB, and BTAC.
mbed_official 390:35c2c1cf29cd 72 * You are not required to invalidate the main TLB, even though it is recommended for safety
mbed_official 390:35c2c1cf29cd 73 * reasons. This ensures compatibility with future revisions of the processor. */
mbed_official 390:35c2c1cf29cd 74
mbed_official 390:35c2c1cf29cd 75 unsigned int l2_id;
mbed_official 390:35c2c1cf29cd 76
mbed_official 390:35c2c1cf29cd 77 /* Invalidate undefined data */
mbed_official 390:35c2c1cf29cd 78 __ca9u_inv_tlb_all();
mbed_official 390:35c2c1cf29cd 79 __v7_inv_icache_all();
mbed_official 390:35c2c1cf29cd 80 __v7_inv_dcache_all();
mbed_official 390:35c2c1cf29cd 81 __v7_inv_btac();
mbed_official 390:35c2c1cf29cd 82
mbed_official 390:35c2c1cf29cd 83 /* Don't use this function during runtime since caches may contain valid data. For a correct cache maintenance you may need to execute a clean and
mbed_official 390:35c2c1cf29cd 84 * invalidate in order to flush the valid data to the next level cache.
mbed_official 390:35c2c1cf29cd 85 */
mbed_official 390:35c2c1cf29cd 86 __enable_mmu();
mbed_official 390:35c2c1cf29cd 87
mbed_official 390:35c2c1cf29cd 88 /* After MMU is enabled and data has been invalidated, enable caches and BTAC */
mbed_official 390:35c2c1cf29cd 89 __enable_caches();
mbed_official 390:35c2c1cf29cd 90 __enable_btac();
mbed_official 390:35c2c1cf29cd 91
mbed_official 390:35c2c1cf29cd 92 /* If present, you may also need to Invalidate and Enable L2 cache here */
mbed_official 390:35c2c1cf29cd 93 l2_id = PL310_GetID();
mbed_official 390:35c2c1cf29cd 94 if (l2_id)
mbed_official 390:35c2c1cf29cd 95 {
mbed_official 390:35c2c1cf29cd 96 PL310_InvAllByWay();
mbed_official 390:35c2c1cf29cd 97 PL310_Enable();
mbed_official 390:35c2c1cf29cd 98 }
mbed_official 390:35c2c1cf29cd 99 }
mbed_official 390:35c2c1cf29cd 100 #pragma pop
mbed_official 390:35c2c1cf29cd 101
mbed_official 482:d9a48e768ce0 102 #elif defined(__GNUC__)
mbed_official 482:d9a48e768ce0 103
mbed_official 482:d9a48e768ce0 104 void InitMemorySubsystem(void) {
mbed_official 482:d9a48e768ce0 105
mbed_official 482:d9a48e768ce0 106 /* This SVC is specific for reset where data / tlb / btac may contain undefined data, therefore before
mbed_official 482:d9a48e768ce0 107 * enabling the cache you must invalidate the instruction cache, the data cache, TLB, and BTAC.
mbed_official 482:d9a48e768ce0 108 * You are not required to invalidate the main TLB, even though it is recommended for safety
mbed_official 482:d9a48e768ce0 109 * reasons. This ensures compatibility with future revisions of the processor. */
mbed_official 482:d9a48e768ce0 110
mbed_official 482:d9a48e768ce0 111 unsigned int l2_id;
mbed_official 482:d9a48e768ce0 112
mbed_official 482:d9a48e768ce0 113 /* Invalidate undefined data */
mbed_official 482:d9a48e768ce0 114 __ca9u_inv_tlb_all();
mbed_official 482:d9a48e768ce0 115 __v7_inv_icache_all();
mbed_official 482:d9a48e768ce0 116 __v7_inv_dcache_all();
mbed_official 482:d9a48e768ce0 117 __v7_inv_btac();
mbed_official 482:d9a48e768ce0 118
mbed_official 482:d9a48e768ce0 119 /* Don't use this function during runtime since caches may contain valid data. For a correct cache maintenance you may need to execute a clean and
mbed_official 482:d9a48e768ce0 120 * invalidate in order to flush the valid data to the next level cache.
mbed_official 482:d9a48e768ce0 121 */
mbed_official 482:d9a48e768ce0 122 __enable_mmu();
mbed_official 482:d9a48e768ce0 123
mbed_official 482:d9a48e768ce0 124 /* After MMU is enabled and data has been invalidated, enable caches and BTAC */
mbed_official 482:d9a48e768ce0 125 __enable_caches();
mbed_official 482:d9a48e768ce0 126 __enable_btac();
mbed_official 482:d9a48e768ce0 127
mbed_official 482:d9a48e768ce0 128 /* If present, you may also need to Invalidate and Enable L2 cache here */
mbed_official 482:d9a48e768ce0 129 l2_id = PL310_GetID();
mbed_official 482:d9a48e768ce0 130 if (l2_id)
mbed_official 482:d9a48e768ce0 131 {
mbed_official 482:d9a48e768ce0 132 PL310_InvAllByWay();
mbed_official 482:d9a48e768ce0 133 PL310_Enable();
mbed_official 482:d9a48e768ce0 134 }
mbed_official 482:d9a48e768ce0 135 }
mbed_official 482:d9a48e768ce0 136 #else
mbed_official 482:d9a48e768ce0 137
mbed_official 482:d9a48e768ce0 138 #endif
mbed_official 482:d9a48e768ce0 139
mbed_official 482:d9a48e768ce0 140
mbed_official 390:35c2c1cf29cd 141 IRQHandler IRQTable[Renesas_RZ_A1_IRQ_MAX+1];
mbed_official 390:35c2c1cf29cd 142
mbed_official 390:35c2c1cf29cd 143 uint32_t IRQCount = sizeof IRQTable / 4;
mbed_official 390:35c2c1cf29cd 144
mbed_official 390:35c2c1cf29cd 145 uint32_t InterruptHandlerRegister (IRQn_Type irq, IRQHandler handler)
mbed_official 390:35c2c1cf29cd 146 {
mbed_official 390:35c2c1cf29cd 147 if (irq < IRQCount) {
mbed_official 390:35c2c1cf29cd 148 IRQTable[irq] = handler;
mbed_official 390:35c2c1cf29cd 149 return 0;
mbed_official 390:35c2c1cf29cd 150 }
mbed_official 390:35c2c1cf29cd 151 else {
mbed_official 390:35c2c1cf29cd 152 return 1;
mbed_official 390:35c2c1cf29cd 153 }
mbed_official 390:35c2c1cf29cd 154 }
mbed_official 390:35c2c1cf29cd 155
mbed_official 390:35c2c1cf29cd 156 uint32_t InterruptHandlerUnregister (IRQn_Type irq)
mbed_official 390:35c2c1cf29cd 157 {
mbed_official 390:35c2c1cf29cd 158 if (irq < IRQCount) {
mbed_official 390:35c2c1cf29cd 159 IRQTable[irq] = 0;
mbed_official 390:35c2c1cf29cd 160 return 0;
mbed_official 390:35c2c1cf29cd 161 }
mbed_official 390:35c2c1cf29cd 162 else {
mbed_official 390:35c2c1cf29cd 163 return 1;
mbed_official 390:35c2c1cf29cd 164 }
mbed_official 390:35c2c1cf29cd 165 }
mbed_official 390:35c2c1cf29cd 166
mbed_official 390:35c2c1cf29cd 167 /**
mbed_official 390:35c2c1cf29cd 168 * Initialize the system
mbed_official 390:35c2c1cf29cd 169 *
mbed_official 390:35c2c1cf29cd 170 * @param none
mbed_official 390:35c2c1cf29cd 171 * @return none
mbed_official 390:35c2c1cf29cd 172 *
mbed_official 390:35c2c1cf29cd 173 * @brief Setup the microcontroller system.
mbed_official 390:35c2c1cf29cd 174 * Initialize the System.
mbed_official 390:35c2c1cf29cd 175 */
mbed_official 390:35c2c1cf29cd 176 void SystemInit (void)
mbed_official 390:35c2c1cf29cd 177 {
mbed_official 390:35c2c1cf29cd 178 IRQNestLevel = 0;
mbed_official 390:35c2c1cf29cd 179 /* do not use global variables because this function is called before
mbed_official 390:35c2c1cf29cd 180 reaching pre-main. RW section maybe overwritten afterwards. */
mbed_official 390:35c2c1cf29cd 181 RZ_A1_InitClock();
mbed_official 390:35c2c1cf29cd 182 RZ_A1_InitBus();
mbed_official 390:35c2c1cf29cd 183
mbed_official 390:35c2c1cf29cd 184 //Configure GIC ICDICFR GIC_SetICDICFR()
mbed_official 390:35c2c1cf29cd 185 GIC_Enable();
mbed_official 390:35c2c1cf29cd 186 __enable_irq();
mbed_official 390:35c2c1cf29cd 187
mbed_official 390:35c2c1cf29cd 188 }
mbed_official 390:35c2c1cf29cd 189
mbed_official 390:35c2c1cf29cd 190
mbed_official 390:35c2c1cf29cd 191 //Fault Status Register (IFSR/DFSR) definitions
mbed_official 390:35c2c1cf29cd 192 #define FSR_ALIGNMENT_FAULT 0x01 //DFSR only. Fault on first lookup
mbed_official 626:ba773d547214 193 #define FSR_INSTRUCTION_CACHE_MAINTENANCE 0x04 //DFSR only - async/external
mbed_official 390:35c2c1cf29cd 194 #define FSR_SYNC_EXT_TTB_WALK_FIRST 0x0c //sync/external
mbed_official 390:35c2c1cf29cd 195 #define FSR_SYNC_EXT_TTB_WALK_SECOND 0x0e //sync/external
mbed_official 390:35c2c1cf29cd 196 #define FSR_SYNC_PARITY_TTB_WALK_FIRST 0x1c //sync/external
mbed_official 390:35c2c1cf29cd 197 #define FSR_SYNC_PARITY_TTB_WALK_SECOND 0x1e //sync/external
mbed_official 390:35c2c1cf29cd 198 #define FSR_TRANSLATION_FAULT_FIRST 0x05 //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 199 #define FSR_TRANSLATION_FAULT_SECOND 0x07 //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 200 #define FSR_ACCESS_FLAG_FAULT_FIRST 0x03 //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 201 #define FSR_ACCESS_FLAG_FAULT_SECOND 0x06 //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 202 #define FSR_DOMAIN_FAULT_FIRST 0x09 //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 203 #define FSR_DOMAIN_FAULT_SECOND 0x0b //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 204 #define FSR_PERMISION_FAULT_FIRST 0x0f //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 205 #define FSR_PERMISION_FAULT_SECOND 0x0d //MMU Fault - internal
mbed_official 390:35c2c1cf29cd 206 #define FSR_DEBUG_EVENT 0x02 //internal
mbed_official 390:35c2c1cf29cd 207 #define FSR_SYNC_EXT_ABORT 0x08 //sync/external
mbed_official 390:35c2c1cf29cd 208 #define FSR_TLB_CONFLICT_ABORT 0x10 //sync/external
mbed_official 390:35c2c1cf29cd 209 #define FSR_LOCKDOWN 0x14 //internal
mbed_official 390:35c2c1cf29cd 210 #define FSR_COPROCESSOR_ABORT 0x1a //internal
mbed_official 390:35c2c1cf29cd 211 #define FSR_SYNC_PARITY_ERROR 0x19 //sync/external
mbed_official 390:35c2c1cf29cd 212 #define FSR_ASYNC_EXTERNAL_ABORT 0x16 //DFSR only - async/external
mbed_official 390:35c2c1cf29cd 213 #define FSR_ASYNC_PARITY_ERROR 0x18 //DFSR only - async/external
mbed_official 390:35c2c1cf29cd 214
mbed_official 390:35c2c1cf29cd 215 void CDAbtHandler(uint32_t DFSR, uint32_t DFAR, uint32_t LR) {
mbed_official 390:35c2c1cf29cd 216 uint32_t FS = (DFSR & (1 << 10)) >> 6 | (DFSR & 0x0f); //Store Fault Status
mbed_official 390:35c2c1cf29cd 217
mbed_official 390:35c2c1cf29cd 218 switch(FS) {
mbed_official 390:35c2c1cf29cd 219 //Synchronous parity errors - retry
mbed_official 390:35c2c1cf29cd 220 case FSR_SYNC_PARITY_ERROR:
mbed_official 390:35c2c1cf29cd 221 case FSR_SYNC_PARITY_TTB_WALK_FIRST:
mbed_official 390:35c2c1cf29cd 222 case FSR_SYNC_PARITY_TTB_WALK_SECOND:
mbed_official 390:35c2c1cf29cd 223 return;
mbed_official 390:35c2c1cf29cd 224
mbed_official 390:35c2c1cf29cd 225 //Your code here. Value in DFAR is invalid for some fault statuses.
mbed_official 390:35c2c1cf29cd 226 case FSR_ALIGNMENT_FAULT:
mbed_official 626:ba773d547214 227 case FSR_INSTRUCTION_CACHE_MAINTENANCE:
mbed_official 390:35c2c1cf29cd 228 case FSR_SYNC_EXT_TTB_WALK_FIRST:
mbed_official 390:35c2c1cf29cd 229 case FSR_SYNC_EXT_TTB_WALK_SECOND:
mbed_official 390:35c2c1cf29cd 230 case FSR_TRANSLATION_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 231 case FSR_TRANSLATION_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 232 case FSR_ACCESS_FLAG_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 233 case FSR_ACCESS_FLAG_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 234 case FSR_DOMAIN_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 235 case FSR_DOMAIN_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 236 case FSR_PERMISION_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 237 case FSR_PERMISION_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 238 case FSR_DEBUG_EVENT:
mbed_official 390:35c2c1cf29cd 239 case FSR_SYNC_EXT_ABORT:
mbed_official 390:35c2c1cf29cd 240 case FSR_TLB_CONFLICT_ABORT:
mbed_official 390:35c2c1cf29cd 241 case FSR_LOCKDOWN:
mbed_official 390:35c2c1cf29cd 242 case FSR_COPROCESSOR_ABORT:
mbed_official 390:35c2c1cf29cd 243 case FSR_ASYNC_EXTERNAL_ABORT: //DFAR invalid
mbed_official 390:35c2c1cf29cd 244 case FSR_ASYNC_PARITY_ERROR: //DFAR invalid
mbed_official 390:35c2c1cf29cd 245 default:
mbed_official 390:35c2c1cf29cd 246 while(1);
mbed_official 390:35c2c1cf29cd 247 }
mbed_official 390:35c2c1cf29cd 248 }
mbed_official 390:35c2c1cf29cd 249
mbed_official 390:35c2c1cf29cd 250 void CPAbtHandler(uint32_t IFSR, uint32_t IFAR, uint32_t LR) {
mbed_official 390:35c2c1cf29cd 251 uint32_t FS = (IFSR & (1 << 10)) >> 6 | (IFSR & 0x0f); //Store Fault Status
mbed_official 390:35c2c1cf29cd 252
mbed_official 390:35c2c1cf29cd 253 switch(FS) {
mbed_official 390:35c2c1cf29cd 254 //Synchronous parity errors - retry
mbed_official 390:35c2c1cf29cd 255 case FSR_SYNC_PARITY_ERROR:
mbed_official 390:35c2c1cf29cd 256 case FSR_SYNC_PARITY_TTB_WALK_FIRST:
mbed_official 390:35c2c1cf29cd 257 case FSR_SYNC_PARITY_TTB_WALK_SECOND:
mbed_official 390:35c2c1cf29cd 258 return;
mbed_official 390:35c2c1cf29cd 259
mbed_official 390:35c2c1cf29cd 260 //Your code here. Value in IFAR is invalid for some fault statuses.
mbed_official 390:35c2c1cf29cd 261 case FSR_SYNC_EXT_TTB_WALK_FIRST:
mbed_official 390:35c2c1cf29cd 262 case FSR_SYNC_EXT_TTB_WALK_SECOND:
mbed_official 390:35c2c1cf29cd 263 case FSR_TRANSLATION_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 264 case FSR_TRANSLATION_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 265 case FSR_ACCESS_FLAG_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 266 case FSR_ACCESS_FLAG_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 267 case FSR_DOMAIN_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 268 case FSR_DOMAIN_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 269 case FSR_PERMISION_FAULT_FIRST:
mbed_official 390:35c2c1cf29cd 270 case FSR_PERMISION_FAULT_SECOND:
mbed_official 390:35c2c1cf29cd 271 case FSR_DEBUG_EVENT: //IFAR invalid
mbed_official 390:35c2c1cf29cd 272 case FSR_SYNC_EXT_ABORT:
mbed_official 390:35c2c1cf29cd 273 case FSR_TLB_CONFLICT_ABORT:
mbed_official 390:35c2c1cf29cd 274 case FSR_LOCKDOWN:
mbed_official 390:35c2c1cf29cd 275 case FSR_COPROCESSOR_ABORT:
mbed_official 390:35c2c1cf29cd 276 default:
mbed_official 390:35c2c1cf29cd 277 while(1);
mbed_official 390:35c2c1cf29cd 278 }
mbed_official 390:35c2c1cf29cd 279 }
mbed_official 390:35c2c1cf29cd 280
mbed_official 390:35c2c1cf29cd 281 //returns amount to decrement lr by
mbed_official 626:ba773d547214 282 //this will be 0 when we have emulated the instruction and want to execute the next instruction
mbed_official 626:ba773d547214 283 //this will be 2 when we have performed some maintenance and want to retry the instruction in Thumb (state == 2)
mbed_official 626:ba773d547214 284 //this will be 4 when we have performed some maintenance and want to retry the instruction in ARM (state == 4)
mbed_official 390:35c2c1cf29cd 285 uint32_t CUndefHandler(uint32_t opcode, uint32_t state, uint32_t LR) {
mbed_official 482:d9a48e768ce0 286 const unsigned int THUMB = 2;
mbed_official 482:d9a48e768ce0 287 const unsigned int ARM = 4;
mbed_official 390:35c2c1cf29cd 288 //Lazy VFP/NEON initialisation and switching
mbed_official 626:ba773d547214 289
mbed_official 626:ba773d547214 290 // (ARM ARM section A7.5) VFP data processing instruction?
mbed_official 626:ba773d547214 291 // (ARM ARM section A7.6) VFP/NEON register load/store instruction?
mbed_official 626:ba773d547214 292 // (ARM ARM section A7.8) VFP/NEON register data transfer instruction?
mbed_official 626:ba773d547214 293 // (ARM ARM section A7.9) VFP/NEON 64-bit register data transfer instruction?
mbed_official 626:ba773d547214 294 if ((state == ARM && ((opcode & 0x0C000000) >> 26 == 0x03)) ||
mbed_official 626:ba773d547214 295 (state == THUMB && ((opcode & 0xEC000000) >> 26 == 0x3B))) {
mbed_official 626:ba773d547214 296 if (((opcode & 0x00000E00) >> 9) == 5) {
mbed_official 390:35c2c1cf29cd 297 FPUEnable();
mbed_official 390:35c2c1cf29cd 298 return state;
mbed_official 390:35c2c1cf29cd 299 }
mbed_official 390:35c2c1cf29cd 300 }
mbed_official 390:35c2c1cf29cd 301
mbed_official 626:ba773d547214 302 // (ARM ARM section A7.4) NEON data processing instruction?
mbed_official 626:ba773d547214 303 if ((state == ARM && ((opcode & 0xFE000000) >> 24 == 0xF2)) ||
mbed_official 626:ba773d547214 304 (state == THUMB && ((opcode & 0xEF000000) >> 24 == 0xEF)) ||
mbed_official 626:ba773d547214 305 // (ARM ARM section A7.7) NEON load/store instruction?
mbed_official 626:ba773d547214 306 (state == ARM && ((opcode >> 24) == 0xF4)) ||
mbed_official 626:ba773d547214 307 (state == THUMB && ((opcode >> 24) == 0xF9))) {
mbed_official 626:ba773d547214 308 FPUEnable();
mbed_official 626:ba773d547214 309 return state;
mbed_official 626:ba773d547214 310 }
mbed_official 626:ba773d547214 311
mbed_official 390:35c2c1cf29cd 312 //Add code here for other Undef cases
mbed_official 390:35c2c1cf29cd 313 while(1);
mbed_official 390:35c2c1cf29cd 314 }
mbed_official 390:35c2c1cf29cd 315
mbed_official 482:d9a48e768ce0 316 #if defined(__ARMCC_VERSION)
mbed_official 390:35c2c1cf29cd 317 #pragma push
mbed_official 390:35c2c1cf29cd 318 #pragma arm
mbed_official 390:35c2c1cf29cd 319 //Critical section, called from undef handler, so systick is disabled
mbed_official 390:35c2c1cf29cd 320 __asm void FPUEnable(void) {
mbed_official 390:35c2c1cf29cd 321 ARM
mbed_official 390:35c2c1cf29cd 322
mbed_official 626:ba773d547214 323 //Permit access to VFP/NEON, registers by modifying CPACR
mbed_official 390:35c2c1cf29cd 324 MRC p15,0,R1,c1,c0,2
mbed_official 390:35c2c1cf29cd 325 ORR R1,R1,#0x00F00000
mbed_official 390:35c2c1cf29cd 326 MCR p15,0,R1,c1,c0,2
mbed_official 390:35c2c1cf29cd 327
mbed_official 626:ba773d547214 328 //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted
mbed_official 626:ba773d547214 329 ISB
mbed_official 626:ba773d547214 330
mbed_official 626:ba773d547214 331 //Enable VFP/NEON
mbed_official 390:35c2c1cf29cd 332 VMRS R1,FPEXC
mbed_official 390:35c2c1cf29cd 333 ORR R1,R1,#0x40000000
mbed_official 390:35c2c1cf29cd 334 VMSR FPEXC,R1
mbed_official 390:35c2c1cf29cd 335
mbed_official 626:ba773d547214 336 //Initialise VFP/NEON registers to 0
mbed_official 390:35c2c1cf29cd 337 MOV R2,#0
mbed_official 626:ba773d547214 338 //Initialise D16 registers to 0
mbed_official 390:35c2c1cf29cd 339 VMOV D0, R2,R2
mbed_official 390:35c2c1cf29cd 340 VMOV D1, R2,R2
mbed_official 390:35c2c1cf29cd 341 VMOV D2, R2,R2
mbed_official 390:35c2c1cf29cd 342 VMOV D3, R2,R2
mbed_official 390:35c2c1cf29cd 343 VMOV D4, R2,R2
mbed_official 390:35c2c1cf29cd 344 VMOV D5, R2,R2
mbed_official 390:35c2c1cf29cd 345 VMOV D6, R2,R2
mbed_official 390:35c2c1cf29cd 346 VMOV D7, R2,R2
mbed_official 390:35c2c1cf29cd 347 VMOV D8, R2,R2
mbed_official 390:35c2c1cf29cd 348 VMOV D9, R2,R2
mbed_official 390:35c2c1cf29cd 349 VMOV D10,R2,R2
mbed_official 390:35c2c1cf29cd 350 VMOV D11,R2,R2
mbed_official 390:35c2c1cf29cd 351 VMOV D12,R2,R2
mbed_official 390:35c2c1cf29cd 352 VMOV D13,R2,R2
mbed_official 390:35c2c1cf29cd 353 VMOV D14,R2,R2
mbed_official 390:35c2c1cf29cd 354 VMOV D15,R2,R2
mbed_official 626:ba773d547214 355 //Initialise D32 registers to 0
mbed_official 626:ba773d547214 356 VMOV D16,R2,R2
mbed_official 626:ba773d547214 357 VMOV D17,R2,R2
mbed_official 626:ba773d547214 358 VMOV D18,R2,R2
mbed_official 626:ba773d547214 359 VMOV D19,R2,R2
mbed_official 626:ba773d547214 360 VMOV D20,R2,R2
mbed_official 626:ba773d547214 361 VMOV D21,R2,R2
mbed_official 626:ba773d547214 362 VMOV D22,R2,R2
mbed_official 626:ba773d547214 363 VMOV D23,R2,R2
mbed_official 626:ba773d547214 364 VMOV D24,R2,R2
mbed_official 626:ba773d547214 365 VMOV D25,R2,R2
mbed_official 626:ba773d547214 366 VMOV D26,R2,R2
mbed_official 626:ba773d547214 367 VMOV D27,R2,R2
mbed_official 626:ba773d547214 368 VMOV D28,R2,R2
mbed_official 626:ba773d547214 369 VMOV D29,R2,R2
mbed_official 626:ba773d547214 370 VMOV D30,R2,R2
mbed_official 626:ba773d547214 371 VMOV D31,R2,R2
mbed_official 390:35c2c1cf29cd 372 //Initialise FPSCR to a known state
mbed_official 390:35c2c1cf29cd 373 VMRS R2,FPSCR
mbed_official 390:35c2c1cf29cd 374 LDR R3,=0x00086060 //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero.
mbed_official 390:35c2c1cf29cd 375 AND R2,R2,R3
mbed_official 390:35c2c1cf29cd 376 VMSR FPSCR,R2
mbed_official 390:35c2c1cf29cd 377
mbed_official 390:35c2c1cf29cd 378 BX LR
mbed_official 390:35c2c1cf29cd 379 }
mbed_official 390:35c2c1cf29cd 380 #pragma pop
mbed_official 482:d9a48e768ce0 381
mbed_official 482:d9a48e768ce0 382 #elif defined(__GNUC__)
mbed_official 626:ba773d547214 383 void FPUEnable(void) {
mbed_official 626:ba773d547214 384 __asm__ (
mbed_official 626:ba773d547214 385 ".ARM;"
mbed_official 626:ba773d547214 386
mbed_official 626:ba773d547214 387 //Permit access to VFP/NEON, registers by modifying CPACR
mbed_official 626:ba773d547214 388 "MRC p15,0,R1,c1,c0,2;"
mbed_official 626:ba773d547214 389 "ORR R1,R1,#0x00F00000;"
mbed_official 626:ba773d547214 390 "MCR p15,0,R1,c1,c0,2;"
mbed_official 626:ba773d547214 391
mbed_official 626:ba773d547214 392 //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted
mbed_official 626:ba773d547214 393 "ISB;"
mbed_official 626:ba773d547214 394
mbed_official 626:ba773d547214 395 //Enable VFP/NEON
mbed_official 626:ba773d547214 396 "VMRS R1,FPEXC;"
mbed_official 626:ba773d547214 397 "ORR R1,R1,#0x40000000;"
mbed_official 626:ba773d547214 398 "VMSR FPEXC,R1;"
mbed_official 626:ba773d547214 399
mbed_official 626:ba773d547214 400 //Initialise VFP/NEON registers to 0
mbed_official 626:ba773d547214 401 "MOV R2,#0;"
mbed_official 626:ba773d547214 402 //Initialise D16 registers to 0
mbed_official 626:ba773d547214 403 "VMOV D0, R2,R2;"
mbed_official 626:ba773d547214 404 "VMOV D1, R2,R2;"
mbed_official 626:ba773d547214 405 "VMOV D2, R2,R2;"
mbed_official 626:ba773d547214 406 "VMOV D3, R2,R2;"
mbed_official 626:ba773d547214 407 "VMOV D4, R2,R2;"
mbed_official 626:ba773d547214 408 "VMOV D5, R2,R2;"
mbed_official 626:ba773d547214 409 "VMOV D6, R2,R2;"
mbed_official 626:ba773d547214 410 "VMOV D7, R2,R2;"
mbed_official 626:ba773d547214 411 "VMOV D8, R2,R2;"
mbed_official 626:ba773d547214 412 "VMOV D9, R2,R2;"
mbed_official 626:ba773d547214 413 "VMOV D10,R2,R2;"
mbed_official 626:ba773d547214 414 "VMOV D11,R2,R2;"
mbed_official 626:ba773d547214 415 "VMOV D12,R2,R2;"
mbed_official 626:ba773d547214 416 "VMOV D13,R2,R2;"
mbed_official 626:ba773d547214 417 "VMOV D14,R2,R2;"
mbed_official 626:ba773d547214 418 "VMOV D15,R2,R2;"
mbed_official 626:ba773d547214 419 //Initialise D32 registers to 0
mbed_official 626:ba773d547214 420 "VMOV D16,R2,R2;"
mbed_official 626:ba773d547214 421 "VMOV D17,R2,R2;"
mbed_official 626:ba773d547214 422 "VMOV D18,R2,R2;"
mbed_official 626:ba773d547214 423 "VMOV D19,R2,R2;"
mbed_official 626:ba773d547214 424 "VMOV D20,R2,R2;"
mbed_official 626:ba773d547214 425 "VMOV D21,R2,R2;"
mbed_official 626:ba773d547214 426 "VMOV D22,R2,R2;"
mbed_official 626:ba773d547214 427 "VMOV D23,R2,R2;"
mbed_official 626:ba773d547214 428 "VMOV D24,R2,R2;"
mbed_official 626:ba773d547214 429 "VMOV D25,R2,R2;"
mbed_official 626:ba773d547214 430 "VMOV D26,R2,R2;"
mbed_official 626:ba773d547214 431 "VMOV D27,R2,R2;"
mbed_official 626:ba773d547214 432 "VMOV D28,R2,R2;"
mbed_official 626:ba773d547214 433 "VMOV D29,R2,R2;"
mbed_official 626:ba773d547214 434 "VMOV D30,R2,R2;"
mbed_official 626:ba773d547214 435 "VMOV D31,R2,R2;"
mbed_official 626:ba773d547214 436
mbed_official 626:ba773d547214 437 //Initialise FPSCR to a known state
mbed_official 626:ba773d547214 438 "VMRS R2,FPSCR;"
mbed_official 626:ba773d547214 439 "LDR R3,=0x00086060;" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero.
mbed_official 626:ba773d547214 440 "AND R2,R2,R3;"
mbed_official 626:ba773d547214 441 "VMSR FPSCR,R2;"
mbed_official 626:ba773d547214 442
mbed_official 626:ba773d547214 443 //"BX LR;"
mbed_official 626:ba773d547214 444 :
mbed_official 626:ba773d547214 445 :
mbed_official 626:ba773d547214 446 :"r1", "r2", "r3");
mbed_official 626:ba773d547214 447 return;
mbed_official 482:d9a48e768ce0 448 }
mbed_official 482:d9a48e768ce0 449 #else
mbed_official 482:d9a48e768ce0 450 #endif
mbed_official 482:d9a48e768ce0 451