@@ -130,15 +130,21 @@ uint32_t vmpu_sys_mux_handler(uint32_t lr, uint32_t msp)
130130 /* Determine the origin of the exception. */
131131 bool from_psp = EXC_FROM_PSP (lr );
132132 uint32_t sp = from_psp ? __get_PSP () : msp ;
133+
134+ /* Collect fault information that will be given to the halt handler in case of halt. */
135+ THaltInfo info , * halt_info = NULL ;
136+ if (debug_collect_halt_info (lr , sp , & info )) {
137+ halt_info = & info ;
138+ }
133139
134140 switch (ipsr ) {
135141 case NonMaskableInt_IRQn :
136- HALT_ERROR (NOT_IMPLEMENTED , "No NonMaskableInt IRQ handler registered." );
142+ HALT_ERROR_EXTENDED (NOT_IMPLEMENTED , halt_info , "No NonMaskableInt IRQ handler registered." );
137143 break ;
138144
139145 case HardFault_IRQn :
140146 DEBUG_FAULT (FAULT_HARD , lr , sp );
141- HALT_ERROR (FAULT_HARD , "Cannot recover from a hard fault." );
147+ HALT_ERROR_EXTENDED (FAULT_HARD , halt_info , "Cannot recover from a hard fault." );
142148 lr = debug_box_enter_from_priv (lr );
143149 break ;
144150
@@ -180,7 +186,7 @@ uint32_t vmpu_sys_mux_handler(uint32_t lr, uint32_t msp)
180186 /* If recovery was not successful, throw an error and halt. */
181187 DEBUG_FAULT (FAULT_MEMMANAGE , lr , sp );
182188 VMPU_SCB_MMFSR = fault_status ;
183- HALT_ERROR (PERMISSION_DENIED , "Access to restricted resource denied." );
189+ HALT_ERROR_EXTENDED (PERMISSION_DENIED , halt_info , "Access to restricted resource denied." );
184190 lr = debug_box_enter_from_priv (lr );
185191 break ;
186192
@@ -211,33 +217,33 @@ uint32_t vmpu_sys_mux_handler(uint32_t lr, uint32_t msp)
211217
212218 /* If recovery was not successful, throw an error and halt. */
213219 DEBUG_FAULT (FAULT_BUS , lr , sp );
214- HALT_ERROR (PERMISSION_DENIED , "Access to restricted resource denied." );
220+ HALT_ERROR_EXTENDED (PERMISSION_DENIED , halt_info , "Access to restricted resource denied." );
215221 break ;
216222
217223 case UsageFault_IRQn :
218224 DEBUG_FAULT (FAULT_USAGE , lr , sp );
219- HALT_ERROR (FAULT_USAGE , "Cannot recover from a usage fault." );
225+ HALT_ERROR_EXTENDED (FAULT_USAGE , halt_info , "Cannot recover from a usage fault." );
220226 break ;
221227
222228 case SVCall_IRQn :
223- HALT_ERROR (NOT_IMPLEMENTED , "No SVCall IRQ handler registered." );
229+ HALT_ERROR_EXTENDED (NOT_IMPLEMENTED , halt_info , "No SVCall IRQ handler registered." );
224230 break ;
225231
226232 case DebugMonitor_IRQn :
227233 DEBUG_FAULT (FAULT_DEBUG , lr , sp );
228- HALT_ERROR (FAULT_DEBUG , "Cannot recover from a DebugMonitor fault." );
234+ HALT_ERROR_EXTENDED (FAULT_DEBUG , halt_info , "Cannot recover from a DebugMonitor fault." );
229235 break ;
230236
231237 case PendSV_IRQn :
232- HALT_ERROR (NOT_IMPLEMENTED , "No PendSV IRQ handler registered." );
238+ HALT_ERROR_EXTENDED (NOT_IMPLEMENTED , halt_info , "No PendSV IRQ handler registered." );
233239 break ;
234240
235241 case SysTick_IRQn :
236- HALT_ERROR (NOT_IMPLEMENTED , "No SysTick IRQ handler registered." );
242+ HALT_ERROR_EXTENDED (NOT_IMPLEMENTED , halt_info , "No SysTick IRQ handler registered." );
237243 break ;
238244
239245 default :
240- HALT_ERROR (NOT_ALLOWED , "Active IRQn (%i) is not a system interrupt." , ipsr );
246+ HALT_ERROR_EXTENDED (NOT_ALLOWED , halt_info , "Active IRQn (%i) is not a system interrupt." , ipsr );
241247 break ;
242248 }
243249
0 commit comments