#endif
#include <cyg/infra/cyg_type.h>
-#include <cyg/infra/cyg_trac.h> // tracing macros
-#include <cyg/infra/cyg_ass.h> // assertion macros
+#include <cyg/infra/cyg_trac.h> // tracing macros
+#include <cyg/infra/cyg_ass.h> // assertion macros
-#include <cyg/hal/hal_arch.h> // HAL header
-#include <cyg/hal/hal_intr.h> // HAL header
+#include <cyg/hal/hal_arch.h> // HAL header
+#include <cyg/hal/hal_intr.h> // HAL header
#include <cyg/infra/diag.h>
/*------------------------------------------------------------------------*/
-/* First level C exception handler. */
+/* First level C exception handler. */
externC void __handle_exception (void);
static void
__take_over_debug_traps(void)
{
- hold_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH] = hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH];
- hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH] = vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH];
- hold_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA] = hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA];
- hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA] = vectors[CYGNUM_HAL_VECTOR_ABORT_DATA];
+ hold_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH] = hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH];
+ hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH] = vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH];
+ hold_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA] = hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA];
+ hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA] = vectors[CYGNUM_HAL_VECTOR_ABORT_DATA];
}
static void
__restore_debug_traps(void)
{
- hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH] = hold_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH];
- hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA] = hold_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA];
+ hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH] = hold_vectors[CYGNUM_HAL_VECTOR_ABORT_PREFETCH];
+ hardware_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA] = hold_vectors[CYGNUM_HAL_VECTOR_ABORT_DATA];
}
#endif // !CYGPKG_CYGMON
#endif
void
exception_handler(HAL_SavedRegisters *regs)
{
- // Special case handler for code which has chosen to take care
- // of data exceptions (i.e. code which expects them to happen)
- // This is common in discovery code, e.g. checking for a particular
- // device which may generate an exception when probing if the
- // device is not present
+ // Special case handler for code which has chosen to take care
+ // of data exceptions (i.e. code which expects them to happen)
+ // This is common in discovery code, e.g. checking for a particular
+ // device which may generate an exception when probing if the
+ // device is not present
#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
- if (__mem_fault_handler &&
- regs->vector == CYGNUM_HAL_EXCEPTION_DATA_ACCESS) {
- regs->pc = (unsigned long)__mem_fault_handler;
- return; // Caught an exception inside stubs
- }
+ if (__mem_fault_handler &&
+ regs->vector == CYGNUM_HAL_EXCEPTION_DATA_ACCESS) {
+ regs->pc = (unsigned long)__mem_fault_handler;
+ return; // Caught an exception inside stubs
+ }
#endif
#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) && !defined(CYGPKG_CYGMON)
- if (++exception_level == 1) __take_over_debug_traps();
+ if (++exception_level == 1) __take_over_debug_traps();
- _hal_registers = regs;
- __handle_exception();
+ _hal_registers = regs;
+ __handle_exception();
- if (--exception_level == 0) __restore_debug_traps();
+ if (--exception_level == 0) __restore_debug_traps();
#elif defined(CYGPKG_KERNEL_EXCEPTIONS)
- // We should decode the vector and pass a more appropriate
- // value as the second argument. For now we simply pass a
- // pointer to the saved registers. We should also divert
- // breakpoint and other debug vectors into the debug stubs.
+ // We should decode the vector and pass a more appropriate
+ // value as the second argument. For now we simply pass a
+ // pointer to the saved registers. We should also divert
+ // breakpoint and other debug vectors into the debug stubs.
- cyg_hal_deliver_exception( regs->vector, (CYG_ADDRWORD)regs );
+ cyg_hal_deliver_exception( regs->vector, (CYG_ADDRWORD)regs );
#else
- CYG_FAIL("Exception!!!");
-
-#endif
-
- return;
+ CYG_FAIL("Exception!!!");
+
+#endif
+
+ return;
}
void hal_spurious_IRQ(HAL_SavedRegisters *regs) CYGBLD_ATTRIB_WEAK;
hal_spurious_IRQ(HAL_SavedRegisters *regs)
{
#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
- exception_handler(regs);
+ exception_handler(regs);
#else
- CYG_FAIL("Spurious interrupt!!");
-#endif
+ CYG_FAIL("Spurious interrupt!!");
+#endif
}
/*------------------------------------------------------------------------*/
cyg_hal_invoke_constructors (void)
{
#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
- static pfunc *p = &__CTOR_END__[-1];
-
- cyg_hal_stop_constructors = 0;
- for (; p >= __CTOR_LIST__; p--) {
- (*p) ();
- if (cyg_hal_stop_constructors) {
- p--;
- break;
- }
- }
+ static pfunc *p = &__CTOR_END__[-1];
+
+ cyg_hal_stop_constructors = 0;
+ for (; p >= __CTOR_LIST__; p--) {
+ (*p) ();
+ if (cyg_hal_stop_constructors) {
+ p--;
+ break;
+ }
+ }
#else
- pfunc *p;
+ pfunc *p;
- for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)
- (*p) ();
+ for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)
+ (*p) ();
#endif
}
externC cyg_uint32
hal_arch_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
{
- CYG_TRACE1(true, "Interrupt: %d", vector);
+ CYG_TRACE1(true, "Interrupt: %d", vector);
- CYG_FAIL("Spurious Interrupt!!!");
- return 0;
+ CYG_FAIL("Spurious Interrupt!!!");
+ return 0;
}
/*-------------------------------------------------------------------------*/
void
breakpoint(void)
{
- HAL_BREAKPOINT(_breakinst);
+ HAL_BREAKPOINT(_breakinst);
}
unsigned long
__break_opcode (void)
{
- return HAL_BREAKINST;
+ return HAL_BREAKINST;
}
#endif
int
hal_lsbindex(int mask)
{
- int i;
- for (i = 0; i < 32; i++) {
- if (mask & (1<<i)) return (i);
- }
- return (-1);
+ int i;
+ for (i = 0; i < 32; i++) {
+ if (mask & (1<<i)) return (i);
+ }
+ return (-1);
}
int
hal_msbindex(int mask)
{
- int i;
- for (i = 31; i >= 0; i--) {
- if (mask & (1<<i)) return (i);
- }
- return (-1);
+ int i;
+ for (i = 31; i >= 0; i--) {
+ if (mask & (1<<i)) return (i);
+ }
+ return (-1);
}
#ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS
void
dump_frame(unsigned char *frame)
{
- HAL_SavedRegisters *rp = (HAL_SavedRegisters *)frame;
- int i;
- diag_dump_buf(frame, 128);
- diag_printf("Registers:\n");
- for (i = 0; i <= 10; i++) {
- if ((i == 0) || (i == 6)) diag_printf("R%d: ", i);
- diag_printf("%08X ", rp->d[i]);
- if ((i == 5) || (i == 10)) diag_printf("\n");
- }
- diag_printf("FP: %08X, SP: %08X, LR: %08X, PC: %08X, PSR: %08X\n",
- rp->fp, rp->sp, rp->lr, rp->pc, rp->cpsr);
+ HAL_SavedRegisters *rp = (HAL_SavedRegisters *)frame;
+ int i;
+ diag_dump_buf(frame, 128);
+ diag_printf("Registers:\n");
+ for (i = 0; i <= 10; i++) {
+ if ((i == 0) || (i == 6)) diag_printf("R%d: ", i);
+ diag_printf("%08X ", rp->d[i]);
+ if ((i == 5) || (i == 10)) diag_printf("\n");
+ }
+ diag_printf("FP: %08X, SP: %08X, LR: %08X, PC: %08X, PSR: %08X\n",
+ rp->fp, rp->sp, rp->lr, rp->pc, rp->cpsr);
}
#endif
void
show_frame_in(HAL_SavedRegisters *frame)
{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("[IN] IRQ Frame:\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("[IN] IRQ Frame:\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
void
show_frame_out(HAL_SavedRegisters *frame)
{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("[OUT] IRQ Frame:\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("[OUT] IRQ Frame:\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
#endif
// Debug routines
void cyg_hal_report_undefined_instruction(HAL_SavedRegisters *frame)
{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("[UNDEFINED INSTRUCTION] Frame:\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("[UNDEFINED INSTRUCTION] Frame:\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
void cyg_hal_report_software_interrupt(HAL_SavedRegisters *frame)
{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("[SOFTWARE INTERRUPT] Frame:\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("[SOFTWARE INTERRUPT] Frame:\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
void cyg_hal_report_abort_prefetch(HAL_SavedRegisters *frame)
{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("[ABORT PREFETCH] Frame:\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("[ABORT PREFETCH] Frame:\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
void cyg_hal_report_abort_data(HAL_SavedRegisters *frame)
{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("[ABORT DATA] Frame:\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("[ABORT DATA] Frame:\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
void cyg_hal_report_exception_handler_returned(HAL_SavedRegisters *frame)
-{
- int old;
- HAL_DISABLE_INTERRUPTS(old);
- diag_printf("Exception handler returned!\n");
- dump_frame((unsigned char *)frame);
- HAL_RESTORE_INTERRUPTS(old);
+{
+ int old;
+ HAL_DISABLE_INTERRUPTS(old);
+ diag_printf("Exception handler returned!\n");
+ dump_frame((unsigned char *)frame);
+ HAL_RESTORE_INTERRUPTS(old);
}
#endif