⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 v850_ice.cxx

📁 开放源码实时操作系统源码.
💻 CXX
📖 第 1 页 / 共 2 页
字号:
}

static int
cyg_hal_plf_diag_ice_isr(void *__ch_data, int* __ctrlc, 
                         CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
{
    CYGARC_HAL_SAVE_GP();
    *__ctrlc = 0;
    CYGARC_HAL_RESTORE_GP();
    return 0;
}

__externC void
cyg_hal_plf_ice_diag_init()
{
    hal_virtual_comm_table_t* comm;
    int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);

    // Init channels
    ICE_SYSCALL_INFO_DIAGOUTPC     = (int)&hal_v850_ice_output_break;
    ICE_SYSCALL_INFO_DIAGOUTBUF    = (int)&v850ice_output_buf[0];
    ICE_SYSCALL_INFO_DIAGOUTBUFEND = (int)&v850ice_output_end;

    // Setup procs in the vector table

    // Set channel 1
    CYGACC_CALL_IF_SET_CONSOLE_COMM(1);
    comm = CYGACC_CALL_IF_CONSOLE_PROCS();
    CYGACC_COMM_IF_CH_DATA_SET(*comm, 0);
    CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_diag_ice_write);
    CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_diag_ice_read);
    CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_diag_ice_putc);
    CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_diag_ice_getc);
    CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_diag_ice_control);
    CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_diag_ice_isr);
    CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_diag_ice_getc_timeout);
    
    // Restore original console
    CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
}

#endif // ifdef CYGDBG_HAL_V85X_V850_ICE_DIAG


/* ----------------------------------------------------------------------- */
/* Support for debugging via ICE */

#define ICE_STACK_SIZE 1024/sizeof(int)
static int ice_stack[ICE_STACK_SIZE]; // ints so as to ensure alignment
static int ice_iobuf[128];

static void
hal_v85x_ice_syscall_end(void)
{
    for (;;);
}

static void
hal_v85x_ice_syscall(void)
{
    int code, len;
    code = ice_iobuf[0];
    len = ice_iobuf[1];
    switch (code) {
    case V850ICE_SYSCALL_GET_THREADNEXT:
        {
            int ret;
            threadref currthread, nextthread;
            int thread_id;

            /* Unmarshall thread ref */
            my_memcpy( &currthread, &ice_iobuf[2], 8 );
#if ICEDEBUG
            diag_printf("*NEXTTHREAD* currthread=%08x,%08x\n",
                        *(int *)&currthread[0],
                        *(int *)(((char *)&currthread[0])+4));
#endif
            // null threadref?
            if ((ice_iobuf[2] == 0) &&
                (ice_iobuf[3] == 0)) {
#if ICEDEBUG
                diag_printf("null threadref\n");
#endif
                ret = dbg_threadlist( 1, NULL, &nextthread );
            } else {
#if ICEDEBUG
                diag_printf("non-null threadref\n");
#endif
                ret = dbg_threadlist( 0, &currthread, &nextthread );
            }
#if ICEDEBUG
            diag_printf("*NEXTTHREAD* nextthread=%08x,%08x\n",
                        *(int *)&nextthread[0],
                        *(int *)(((char *)&nextthread[0])+4));
#endif
            if (ret) { // if valid thread found
                thread_id = dbg_thread_id( &nextthread );
                /* Returns 0 on error */
                if (thread_id != 0) {
                    ice_iobuf[1] = thread_id;
                    my_memcpy( &ice_iobuf[2], nextthread, 8 );
                    
                    // set return data size to 12
                    ice_iobuf[0] = 12;
#if ICEDEBUG
                    {
                        int i;
                        for (i=0; i<3; i++)
                            diag_printf("%x, ", ice_iobuf[i]);
                        diag_printf("\n");
                    }
#endif
                } else {
                    ret = 0;
                }
            } 
            if (!ret) {
                // set to null
                my_memset( &ice_iobuf[1], 0, 12 );
            }
        }
        break;
    case V850ICE_SYSCALL_GET_THREADREGS:
        {
            int ret;
            threadref thread;

            /* Unmarshall thread ref */
            my_memcpy( &thread, &ice_iobuf[2], 8 );
#if ICEDEBUG
            diag_printf("*GTHREADREGS* thread=%08x,%08x\n", *(int *)&thread[0],
                        *(int *)(((char *)&thread[0])+4));
#endif
            ret = dbg_getthreadreg( &thread, NUMREGS, &ice_iobuf[1]);
            if (ret)
                ice_iobuf[0] = NUMREGS * 4;
            else
                ice_iobuf[0] = 0;
                                    
        }
        break;
    case V850ICE_SYSCALL_SET_THREADREGS:
        {
            int ret;
            threadref thread;

            /* Unmarshall thread ref */
            my_memcpy( &thread, &ice_iobuf[2], 8 );
#if ICEDEBUG
            diag_printf("*STHREADREGS* thread=%08x,%08x\n", *(int *)&thread[0],
                        *(int *)(((char *)&thread[0])+4));
#endif
            ret = dbg_setthreadreg( &thread, NUMREGS, &ice_iobuf[4]);
            if (ret)
                ice_iobuf[0] = 1;
            else
                ice_iobuf[0] = 0;
        }
        break;
    case V850ICE_SYSCALL_GET_CURRTHREAD:
        {
            int ret, thread_id;
            threadref thread;

            ret = dbg_currthread( &thread );
#if ICEDEBUG
            diag_printf("*CURRTHREAD* thread=%08x,%08x\n", *(int *)&thread[0],
                        *(int *)(((char *)&thread[0])+4));
#endif
            
            if (ret) {
                thread_id = dbg_thread_id( &thread );
                /* Returns 0 on error */
                if (thread_id != 0) {
                    ice_iobuf[1] = thread_id;
                    my_memcpy( &ice_iobuf[2], thread, 8 );
                }
                else {
                    ret = 0;
                }
            }
            if (ret)
                ice_iobuf[0] = 12;
            else
                ice_iobuf[0] = 0;
        } 
        break;
    case V850ICE_SYSCALL_GET_THREADINFO:
        {
            int ret;
            threadref thread;
            struct cygmon_thread_debug_info info;
            char *s=(char *)&ice_iobuf[1], *p;

            /* Unmarshall thread ref */
            my_memcpy( &thread, &ice_iobuf[2], 8 );
#if ICEDEBUG
            diag_printf("*INFO* thread=%08x,%08x\n", *(int *)&thread[0],
                        *(int *)(((char *)&thread[0])+4));
#endif

            ret = dbg_threadinfo( &thread, &info );
            if (ret) {
                if (info.thread_display) {
                    my_memcpy (s, "State: ", 7);
                    s += 7;
                    p = info.thread_display;
                    while (*p) {
                        *s++ = *p++;
                    }
                }

                if (info.unique_thread_name && info.unique_thread_name[0]) {
                    my_memcpy (s, ", Name: ", 8);
                    s += 8;
                    p = info.unique_thread_name;
                    while (*p) {
                        *s++ = *p++;
                    }
                }

                if (info.more_display) {
                    my_memcpy (s, ", ", 2);
                    s += 2;
                    p = info.more_display;
                    while (*p) {
                        *s++ = *p++;
                    }
                }

            }
            *s++ = '\0';
            if (ret)
                ice_iobuf[0] = s - (char *)&ice_iobuf[1];
            else
                ice_iobuf[0] = 0;
        }
        break;
    case V850ICE_SYSCALL_CONSOLE_INPUT:
        {
#ifdef CYGDBG_HAL_V85X_V850_ICE_DIAG    
            int len = ice_iobuf[0];
            int i;

            for (i=1; i <= len; i++) {
                if (false == cyg_hal_plf_diag_ice_receive_char(ice_iobuf[i]))
                    break;
            }
            ice_iobuf[0] = i-1;
#else
            ice_iobuf[0] = 0;
#endif
        }
        break;
    default:
        // set return data size to 0
        ice_iobuf[0] = 0;
        break;
    }
    hal_v85x_ice_syscall_end();
}

class Cyg_dummy_ice_syscall_init_class {
public:
    Cyg_dummy_ice_syscall_init_class() {

        const int valid_string = 0x45434956; // "VICE"

        ICE_SYSCALL_INFO_STARTPC = (int)&hal_v85x_ice_syscall;
        ICE_SYSCALL_INFO_ENDPC = (int)&hal_v85x_ice_syscall_end;
        // top of stack, less 4 ints for parameter flushback area as per ABI
        ICE_SYSCALL_INFO_STACK = (int)&ice_stack[ICE_STACK_SIZE-4];
        ICE_SYSCALL_INFO_IOBUF = (int)&ice_iobuf[0];

        HAL_REORDER_BARRIER();

        // Leave validation string to last
        ICE_SYSCALL_INFO_VALIDATOR = valid_string;
    }
};

static Cyg_dummy_ice_syscall_init_class dummy_syscall_class;

#endif // ifdef CYGDBG_HAL_V850_ICE

// EOF v850_ice.cxx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -