예제 #1
0
__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;
}
예제 #2
0
파일: hal_misc.c 프로젝트: EPiCS/reconos_v2
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);
}
예제 #3
0
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);
}
예제 #4
0
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);
}
예제 #5
0
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);
}
예제 #6
0
// 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);
}
예제 #7
0
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);
}
예제 #8
0
__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;
}
예제 #9
0
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);
}