mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2006-2018 ARM Limited
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 5 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 6 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 7 *
AnnaBridge 189:f392fc9709a3 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 13 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 14 * limitations under the License.
AnnaBridge 189:f392fc9709a3 15 */
AnnaBridge 189:f392fc9709a3 16
AnnaBridge 189:f392fc9709a3 17 #ifndef __STDC_FORMAT_MACROS
AnnaBridge 189:f392fc9709a3 18 #define __STDC_FORMAT_MACROS
AnnaBridge 189:f392fc9709a3 19 #endif
AnnaBridge 189:f392fc9709a3 20 #include <inttypes.h>
AnnaBridge 189:f392fc9709a3 21 #include <string.h>
AnnaBridge 189:f392fc9709a3 22
AnnaBridge 189:f392fc9709a3 23 #include "device.h"
AnnaBridge 189:f392fc9709a3 24 #include "mbed_error.h"
AnnaBridge 189:f392fc9709a3 25 #include "mbed_interface.h"
AnnaBridge 189:f392fc9709a3 26 #include "mbed_crash_data_offsets.h"
AnnaBridge 189:f392fc9709a3 27
AnnaBridge 189:f392fc9709a3 28 #ifndef MBED_FAULT_HANDLER_DISABLED
AnnaBridge 189:f392fc9709a3 29 #include "mbed_fault_handler.h"
AnnaBridge 189:f392fc9709a3 30
AnnaBridge 189:f392fc9709a3 31 //Functions Prototypes
AnnaBridge 189:f392fc9709a3 32 void print_context_info(void);
AnnaBridge 189:f392fc9709a3 33
AnnaBridge 189:f392fc9709a3 34 #if MBED_CONF_PLATFORM_CRASH_CAPTURE_ENABLED
AnnaBridge 189:f392fc9709a3 35 //Global for populating the context in exception handler
AnnaBridge 189:f392fc9709a3 36 mbed_fault_context_t *const mbed_fault_context=(mbed_fault_context_t *)(FAULT_CONTEXT_LOCATION);
AnnaBridge 189:f392fc9709a3 37 #else
AnnaBridge 189:f392fc9709a3 38 mbed_fault_context_t fault_context;
AnnaBridge 189:f392fc9709a3 39 mbed_fault_context_t *const mbed_fault_context=(mbed_fault_context_t *)&fault_context;
AnnaBridge 189:f392fc9709a3 40 #endif
AnnaBridge 189:f392fc9709a3 41
AnnaBridge 189:f392fc9709a3 42 //This is a handler function called from Fault handler to print the error information out.
AnnaBridge 189:f392fc9709a3 43 //This runs in fault context and uses special functions(defined in mbed_rtx_fault_handler.c) to print the information without using C-lib support.
AnnaBridge 189:f392fc9709a3 44 void mbed_fault_handler (uint32_t fault_type, void *mbed_fault_context_in)
AnnaBridge 189:f392fc9709a3 45 {
AnnaBridge 189:f392fc9709a3 46 mbed_error_status_t faultStatus = MBED_SUCCESS;
AnnaBridge 189:f392fc9709a3 47
AnnaBridge 189:f392fc9709a3 48 mbed_error_printf("\n++ MbedOS Fault Handler ++\n\nFaultType: ");
AnnaBridge 189:f392fc9709a3 49
AnnaBridge 189:f392fc9709a3 50 switch( fault_type ) {
AnnaBridge 189:f392fc9709a3 51 case MEMMANAGE_FAULT_EXCEPTION:
AnnaBridge 189:f392fc9709a3 52 mbed_error_printf("MemManageFault");
AnnaBridge 189:f392fc9709a3 53 faultStatus = MBED_ERROR_MEMMANAGE_EXCEPTION;
AnnaBridge 189:f392fc9709a3 54 break;
AnnaBridge 189:f392fc9709a3 55
AnnaBridge 189:f392fc9709a3 56 case BUS_FAULT_EXCEPTION:
AnnaBridge 189:f392fc9709a3 57 mbed_error_printf("BusFault");
AnnaBridge 189:f392fc9709a3 58 faultStatus = MBED_ERROR_BUSFAULT_EXCEPTION;
AnnaBridge 189:f392fc9709a3 59 break;
AnnaBridge 189:f392fc9709a3 60
AnnaBridge 189:f392fc9709a3 61 case USAGE_FAULT_EXCEPTION:
AnnaBridge 189:f392fc9709a3 62 mbed_error_printf("UsageFault");
AnnaBridge 189:f392fc9709a3 63 faultStatus = MBED_ERROR_USAGEFAULT_EXCEPTION;
AnnaBridge 189:f392fc9709a3 64 break;
AnnaBridge 189:f392fc9709a3 65
AnnaBridge 189:f392fc9709a3 66 //There is no way we can hit this code without getting an exception, so we have the default treated like hardfault
AnnaBridge 189:f392fc9709a3 67 case HARD_FAULT_EXCEPTION:
AnnaBridge 189:f392fc9709a3 68 default:
AnnaBridge 189:f392fc9709a3 69 mbed_error_printf("HardFault");
AnnaBridge 189:f392fc9709a3 70 faultStatus = MBED_ERROR_HARDFAULT_EXCEPTION;
AnnaBridge 189:f392fc9709a3 71 break;
AnnaBridge 189:f392fc9709a3 72 }
AnnaBridge 189:f392fc9709a3 73 mbed_error_printf("\n\nContext:");
AnnaBridge 189:f392fc9709a3 74 print_context_info();
AnnaBridge 189:f392fc9709a3 75
AnnaBridge 189:f392fc9709a3 76 mbed_error_printf("\n\n-- MbedOS Fault Handler --\n\n");
AnnaBridge 189:f392fc9709a3 77
AnnaBridge 189:f392fc9709a3 78 //Now call mbed_error, to log the error and halt the system
AnnaBridge 189:f392fc9709a3 79 mbed_error( faultStatus, "Fault exception", mbed_fault_context->PC_reg, NULL, 0 );
AnnaBridge 189:f392fc9709a3 80
AnnaBridge 189:f392fc9709a3 81 }
AnnaBridge 189:f392fc9709a3 82
AnnaBridge 189:f392fc9709a3 83 MBED_NOINLINE void print_context_info(void)
AnnaBridge 189:f392fc9709a3 84 {
AnnaBridge 189:f392fc9709a3 85 //Context Regs
AnnaBridge 189:f392fc9709a3 86 for(int i=0;i<13;i++) {
AnnaBridge 189:f392fc9709a3 87 mbed_error_printf("\nR%-4d: %08" PRIX32, i, ((uint32_t *)(mbed_fault_context))[i]);
AnnaBridge 189:f392fc9709a3 88 }
AnnaBridge 189:f392fc9709a3 89
AnnaBridge 189:f392fc9709a3 90 mbed_error_printf("\nSP : %08" PRIX32
AnnaBridge 189:f392fc9709a3 91 "\nLR : %08" PRIX32
AnnaBridge 189:f392fc9709a3 92 "\nPC : %08" PRIX32
AnnaBridge 189:f392fc9709a3 93 "\nxPSR : %08" PRIX32
AnnaBridge 189:f392fc9709a3 94 "\nPSP : %08" PRIX32
AnnaBridge 189:f392fc9709a3 95 "\nMSP : %08" PRIX32, mbed_fault_context->SP_reg, mbed_fault_context->LR_reg, mbed_fault_context->PC_reg,
AnnaBridge 189:f392fc9709a3 96 mbed_fault_context->xPSR, mbed_fault_context->PSP, mbed_fault_context->MSP );
AnnaBridge 189:f392fc9709a3 97
AnnaBridge 189:f392fc9709a3 98 //Capture CPUID to get core/cpu info
AnnaBridge 189:f392fc9709a3 99 mbed_error_printf("\nCPUID: %08" PRIX32, SCB->CPUID);
AnnaBridge 189:f392fc9709a3 100
AnnaBridge 189:f392fc9709a3 101 #if !defined(TARGET_M0) && !defined(TARGET_M0P)
AnnaBridge 189:f392fc9709a3 102 //Capture fault information registers to infer the cause of exception
AnnaBridge 189:f392fc9709a3 103 mbed_error_printf("\nHFSR : %08" PRIX32
AnnaBridge 189:f392fc9709a3 104 "\nMMFSR: %08" PRIX32
AnnaBridge 189:f392fc9709a3 105 "\nBFSR : %08" PRIX32
AnnaBridge 189:f392fc9709a3 106 "\nUFSR : %08" PRIX32
AnnaBridge 189:f392fc9709a3 107 "\nDFSR : %08" PRIX32
AnnaBridge 189:f392fc9709a3 108 "\nAFSR : %08" PRIX32 ////Split/Capture CFSR into MMFSR, BFSR, UFSR
AnnaBridge 189:f392fc9709a3 109 ,SCB->HFSR, (0xFF & SCB->CFSR), ((0xFF00 & SCB->CFSR) >> 8), ((0xFFFF0000 & SCB->CFSR) >> 16), SCB->DFSR, SCB->AFSR );
AnnaBridge 189:f392fc9709a3 110
AnnaBridge 189:f392fc9709a3 111 //Print MMFAR only if its valid as indicated by MMFSR
AnnaBridge 189:f392fc9709a3 112 if ((0xFF & SCB->CFSR) & 0x80) {
AnnaBridge 189:f392fc9709a3 113 mbed_error_printf("\nMMFAR: %08" PRIX32, SCB->MMFAR);
AnnaBridge 189:f392fc9709a3 114 }
AnnaBridge 189:f392fc9709a3 115 //Print BFAR only if its valid as indicated by BFSR
AnnaBridge 189:f392fc9709a3 116 if (((0xFF00 & SCB->CFSR) >> 8) & 0x80) {
AnnaBridge 189:f392fc9709a3 117 mbed_error_printf("\nBFAR : %08" PRIX32, SCB->BFAR);
AnnaBridge 189:f392fc9709a3 118 }
AnnaBridge 189:f392fc9709a3 119 #endif
AnnaBridge 189:f392fc9709a3 120
AnnaBridge 189:f392fc9709a3 121 //Print Mode
AnnaBridge 189:f392fc9709a3 122 if (mbed_fault_context->EXC_RETURN & 0x8) {
AnnaBridge 189:f392fc9709a3 123 mbed_error_printf("\nMode : Thread");
AnnaBridge 189:f392fc9709a3 124 //Print Priv level in Thread mode - We capture CONTROL reg which reflects the privilege.
AnnaBridge 189:f392fc9709a3 125 //Note that the CONTROL register captured still reflects the privilege status of the
AnnaBridge 189:f392fc9709a3 126 //thread mode eventhough we are in Handler mode by the time we capture it.
AnnaBridge 189:f392fc9709a3 127 if(mbed_fault_context->CONTROL & 0x1) {
AnnaBridge 189:f392fc9709a3 128 mbed_error_printf("\nPriv : User");
AnnaBridge 189:f392fc9709a3 129 } else {
AnnaBridge 189:f392fc9709a3 130 mbed_error_printf("\nPriv : Privileged");
AnnaBridge 189:f392fc9709a3 131 }
AnnaBridge 189:f392fc9709a3 132 } else {
AnnaBridge 189:f392fc9709a3 133 mbed_error_printf("\nMode : Handler");
AnnaBridge 189:f392fc9709a3 134 mbed_error_printf("\nPriv : Privileged");
AnnaBridge 189:f392fc9709a3 135 }
AnnaBridge 189:f392fc9709a3 136 //Print Return Stack
AnnaBridge 189:f392fc9709a3 137 if (mbed_fault_context->EXC_RETURN & 0x4) {
AnnaBridge 189:f392fc9709a3 138 mbed_error_printf("\nStack: PSP");
AnnaBridge 189:f392fc9709a3 139 } else {
AnnaBridge 189:f392fc9709a3 140 mbed_error_printf("\nStack: MSP");
AnnaBridge 189:f392fc9709a3 141 }
AnnaBridge 189:f392fc9709a3 142 }
AnnaBridge 189:f392fc9709a3 143
AnnaBridge 189:f392fc9709a3 144 mbed_error_status_t mbed_get_reboot_fault_context (mbed_fault_context_t *fault_context)
AnnaBridge 189:f392fc9709a3 145 {
AnnaBridge 189:f392fc9709a3 146 mbed_error_status_t status = MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_ITEM_NOT_FOUND);
AnnaBridge 189:f392fc9709a3 147 #if MBED_CONF_PLATFORM_CRASH_CAPTURE_ENABLED
AnnaBridge 189:f392fc9709a3 148 if(fault_context == NULL)
AnnaBridge 189:f392fc9709a3 149 return MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_INVALID_ARGUMENT);
AnnaBridge 189:f392fc9709a3 150 memcpy(fault_context, mbed_fault_context, sizeof(mbed_fault_context_t));
AnnaBridge 189:f392fc9709a3 151 status = MBED_SUCCESS;
AnnaBridge 189:f392fc9709a3 152 #endif
AnnaBridge 189:f392fc9709a3 153 return status;
AnnaBridge 189:f392fc9709a3 154 }
AnnaBridge 189:f392fc9709a3 155
AnnaBridge 189:f392fc9709a3 156 #endif //MBED_FAULT_HANDLER_SUPPORT