__externC CYG_WORD32 cyg_hal_cpu_message_dsr(CYG_WORD32 vector, CYG_ADDRWORD data) { struct smp_msg_t *m = &smp_msg[HAL_SMP_CPU_THIS()]; CYG_WORD32 reschedule; #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE CYG_WORD32 timeslice; #endif cyg_drv_interrupt_mask(vector); HAL_SPINLOCK_SPIN(m->lock); reschedule = m->reschedule; #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE timeslice = m->timeslice; m->reschedule = m->timeslice = false; #else m->reschedule = false; #endif HAL_SPINLOCK_CLEAR(m->lock); cyg_drv_interrupt_unmask(vector); if (reschedule) { cyg_scheduler_set_need_reschedule(); } #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE if (timeslice) { cyg_scheduler_timeslice_cpu(); } #endif return 0; }
void _mcount(void) { int ints_enabled; HAL_SMP_CPU_TYPE this_cpu; HAL_DISABLE_INTERRUPTS(ints_enabled); // This cpu is now not going to run any other code. So, did it // already own the spinlock? this_cpu = HAL_SMP_CPU_THIS(); if (mcount_cpu != this_cpu) { // Nope, so this cannot be a nested call to mcount() HAL_SPINLOCK_SPIN(mcount_lock); // And no other cpu is executing inside mcount() either mcount_cpu = this_cpu; // A possibly-recursive call is now safe. __profile_mcount((CYG_ADDRWORD)__builtin_return_address(1), (CYG_ADDRWORD)__builtin_return_address(0)); // All done. mcount_cpu = HAL_SMP_CPU_NONE; HAL_SPINLOCK_CLEAR(mcount_lock); } HAL_RESTORE_INTERRUPTS(ints_enabled); }
void cyg_hal_report_exception_handler_returned(HAL_SavedRegisters *frame) { int old; HAL_DISABLE_INTERRUPTS(old); #ifdef CYGPKG_HAL_SMP_SUPPORT HAL_SMP_CPU_TYPE cpu; cpu = HAL_SMP_CPU_THIS(); diag_printf("CPU: %d Exception handler returned!\n", cpu); #else diag_printf("Exception handler returned!\n"); #endif dump_frame((unsigned char *)frame); HAL_RESTORE_INTERRUPTS(old); }
void cyg_hal_report_abort_data(HAL_SavedRegisters *frame) { #ifdef CYGPKG_HAL_SMP_SUPPORT HAL_SMP_CPU_TYPE cpu; cpu = HAL_SMP_CPU_THIS(); #endif int old; HAL_DISABLE_INTERRUPTS(old); #ifdef CYGPKG_HAL_SMP_SUPPORT diag_printf("[ABORT DATA] CPU: %d Frame:\n", cpu); #else diag_printf("[ABORT DATA] Frame:\n"); #endif dump_frame((unsigned char *)frame); HAL_RESTORE_INTERRUPTS(old); }
void cyg_hal_report_software_interrupt(HAL_SavedRegisters *frame) { #ifdef CYGPKG_HAL_SMP_SUPPORT HAL_SMP_CPU_TYPE cpu; cpu = HAL_SMP_CPU_THIS(); #endif int old; HAL_DISABLE_INTERRUPTS(old); #ifdef CYGPKG_HAL_SMP_SUPPORT diag_printf("[SOFTWARE INTERRUPT] CPU: %d Frame:\n", cpu); #else diag_printf("[SOFTWARE INTERRUPT] Frame:\n"); #endif dump_frame((unsigned char *)frame); HAL_RESTORE_INTERRUPTS(old); }
// Debug routines void cyg_hal_report_undefined_instruction(HAL_SavedRegisters *frame) { #ifdef CYGPKG_HAL_SMP_SUPPORT HAL_SMP_CPU_TYPE cpu; cpu = HAL_SMP_CPU_THIS(); #endif int old; HAL_DISABLE_INTERRUPTS(old); #ifdef CYGPKG_HAL_SMP_SUPPORT diag_printf("[UNDEFINED INSTRUCTION] CPU: %d Frame:\n", cpu); #else diag_printf("[UNDEFINED INSTRUCTION] Frame:\n"); #endif dump_frame((unsigned char *)frame); HAL_RESTORE_INTERRUPTS(old); }
void show_frame_out(HAL_SavedRegisters *frame) { #ifdef CYGPKG_HAL_SMP_SUPPORT HAL_SMP_CPU_TYPE cpu; cpu = HAL_SMP_CPU_THIS(); #endif int old; HAL_DISABLE_INTERRUPTS(old); #ifdef CYGPKG_HAL_SMP_SUPPORT diag_printf("[OUT] CPU: %d IRQ Frame:\n", cpu); #else diag_printf("[OUT] IRQ Frame:\n"); #endif dump_frame((unsigned char *)frame); HAL_RESTORE_INTERRUPTS(old); }
__externC CYG_WORD32 cyg_hal_cpu_message_isr(CYG_WORD32 vector, CYG_ADDRWORD data) { struct smp_msg_t *m; m = &smp_msg[HAL_SMP_CPU_THIS()]; cyg_drv_interrupt_mask(vector); HAL_SPINLOCK_SPIN( m->lock ); cyg_drv_interrupt_acknowledge(vector); CYG_WORD32 ret = 1; if (m->reschedule) m->reschedule_count++; if (m->timeslice) m->timeslice_count++; if (m->reschedule || m->timeslice) ret |= 2; /* Call DSR */ while (m->head != m->tail) { CYG_WORD32 msg = m->msgs[m->head]; switch (msg & HAL_SMP_MESSAGE_TYPE) { case HAL_SMP_MESSAGE_RESCHEDULE: ret |= 2; /* Call DSR */ break; case HAL_SMP_MESSAGE_MASK: case HAL_SMP_MESSAGE_UNMASK: case HAL_SMP_MESSAGE_REVECTOR: break; } /* Update the head pointer after handling the message, so that * the wait in cyg_hal_cpu_message() completes after the action * requested. */ m->head = (m->head + 1) & (SMP_MSGBUF_SIZE-1); } HAL_SPINLOCK_CLEAR(m->lock); cyg_drv_interrupt_unmask(vector); return ret; }
void dump_frame(unsigned char *frame) { #ifdef CYGPKG_HAL_SMP_SUPPORT HAL_SMP_CPU_TYPE cpu; cpu = HAL_SMP_CPU_THIS(); #endif HAL_SavedRegisters *rp = (HAL_SavedRegisters *)frame; int i; diag_dump_buf(frame, 128); #ifdef CYGPKG_HAL_SMP_SUPPORT diag_printf("Registers for CPU %d:\n", cpu); #else diag_printf("Registers:\n"); #endif 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); }