Merge pull request #6257 from SenRamakri/sen_FaultHandlerFixes

Fix for Crash dump formatting issues and adding more info to crash dump
pull/6311/head
Jimmy Brisson 2018-03-08 13:04:07 -06:00 committed by GitHub
commit f67fe4a7a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 17 deletions

View File

@ -144,13 +144,18 @@ Fault_Handler_Continue2
MRS R2,MSP ; Get MSP MRS R2,MSP ; Get MSP
STR R2,[R1] STR R2,[R1]
ADDS R1,#4 ADDS R1,#4
LDR R3,=mbed_fault_handler ; Load address of mbedFaultHandler MOV R2,LR ; Get current LR(EXC_RETURN)
STR R2,[R1]
ADDS R1,#4
MRS R2,CONTROL ; Get CONTROL Reg
STR R2,[R1]
LDR R3,=mbed_fault_handler ; Load address of mbedFaultHandler
MOV R0,R12 MOV R0,R12
LDR R1,=mbed_fault_context LDR R1,=mbed_fault_context
LDR R2,=osRtxInfo LDR R2,=osRtxInfo
BLX R3 BLX R3
#endif #endif
B . ; Just in case we come back here B . ; Just in case we come back here
ENDP ENDP
#endif #endif

View File

@ -176,7 +176,12 @@ Fault_Handler_Continue2:
MRS R2,MSP // Get MSP MRS R2,MSP // Get MSP
STR R2,[R1] STR R2,[R1]
ADDS R1,#4 ADDS R1,#4
LDR R3,=mbed_fault_handler // Load address of mbedFaultHandler MOV R2,LR // Get current LR(EXC_RETURN)
STR R2,[R1]
ADDS R1,#4
MRS R2,CONTROL // Get CONTROL Reg
STR R2,[R1]
LDR R3,=mbed_fault_handler // Load address of mbedFaultHandler
MOV R0,R12 MOV R0,R12
LDR R1,=mbed_fault_context LDR R1,=mbed_fault_context
LDR R2,=osRtxInfo LDR R2,=osRtxInfo

View File

@ -139,13 +139,18 @@ Fault_Handler_Continue2
MRS R2,MSP ; Get MSP MRS R2,MSP ; Get MSP
STR R2,[R1] STR R2,[R1]
ADDS R1,#4 ADDS R1,#4
LDR R3,=mbed_fault_handler ; Load address of mbedFaultHandler MOV R2,LR ; Get current LR(EXC_RETURN)
STR R2,[R1]
ADDS R1,#4
MRS R2,CONTROL ; Get CONTROL Reg
STR R2,[R1]
LDR R3,=mbed_fault_handler ; Load address of mbedFaultHandler
MOV R0,R12 MOV R0,R12
LDR R1,=mbed_fault_context LDR R1,=mbed_fault_context
LDR R2,=osRtxInfo LDR R2,=osRtxInfo
BLX R3 BLX R3
#endif #endif
B . ; Just in case we come back here B . ; Just in case we come back here
#endif ; #if (MBED_FAULT_HANDLER_SUPPORT == 1) #endif ; #if (MBED_FAULT_HANDLER_SUPPORT == 1)
END END

View File

@ -143,7 +143,27 @@ void print_context_info()
fault_print_str("\nBFAR : %",(uint32_t *)&SCB->BFAR); fault_print_str("\nBFAR : %",(uint32_t *)&SCB->BFAR);
} }
#endif #endif
//Print Mode
if(mbed_fault_context.EXC_RETURN & 0x8) {
fault_print_str("\nMode : Thread", NULL);
//Print Priv level in Thread mode - We capture CONTROL reg which reflects the privilege.
//Note that the CONTROL register captured still reflects the privilege status of the
//thread mode eventhough we are in Handler mode by the time we capture it.
if(mbed_fault_context.CONTROL & 0x1) {
fault_print_str("\nPriv : User", NULL);
} else {
fault_print_str("\nPriv : Privileged", NULL);
}
} else {
fault_print_str("\nMode : Handler", NULL);
fault_print_str("\nPriv : Privileged", NULL);
}
//Print Return Stack
if(mbed_fault_context.EXC_RETURN & 0x4) {
fault_print_str("\nStack: PSP", NULL);
} else {
fault_print_str("\nStack: MSP", NULL);
}
} }
/* Prints thread info from a list */ /* Prints thread info from a list */
@ -194,17 +214,13 @@ void fault_print_str(char *fmtstr, uint32_t *values)
char hex_str[9]={0}; char hex_str[9]={0};
while(fmtstr[i] != '\0') { while(fmtstr[i] != '\0') {
if(fmtstr[i] == '\n' || fmtstr[i] == '\r') { if(fmtstr[i]=='%') {
serial_putc(&stdio_uart, '\r'); hex_to_str(values[vidx++],hex_str);
} else { for(idx=7; idx>=0; idx--) {
if(fmtstr[i]=='%') { serial_putc(&stdio_uart, hex_str[idx]);
hex_to_str(values[vidx++],hex_str);
for(idx=7; idx>=0; idx--) {
serial_putc(&stdio_uart, hex_str[idx]);
}
} else {
serial_putc(&stdio_uart, fmtstr[i]);
} }
} else {
serial_putc(&stdio_uart, fmtstr[i]);
} }
i++; i++;
} }

View File

@ -37,6 +37,8 @@ typedef struct {
uint32_t xPSR; uint32_t xPSR;
uint32_t PSP; uint32_t PSP;
uint32_t MSP; uint32_t MSP;
uint32_t EXC_RETURN;
uint32_t CONTROL;
} mbed_fault_context_t; } mbed_fault_context_t;
//Fault type definitions //Fault type definitions