qnxacc.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,824 行 · 第 1/4 页

C
1,824
字号
    }
    slib = GetSLibTable( FALSE );
    if( slib.offset == 0 && slib.segment == 0 ) {
        return( sizeof( *ret ) );
    }
    if( __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_REG_RD,
                          &save, sizeof( save ), 0, 0 ) != 0 ) {
        return( sizeof( *ret ) );
    }
    new = save;
    if( input ) {
        new.ax = 0;
        save_hdl = &ProcInfo.save_in;
    } else {
        new.ax = 1;
        save_hdl = &ProcInfo.save_out;
    }
    ret->err = 0;
    if( *save_hdl != -1 ) {
        __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_MEM_RD, &func,
            sizeof( func ), slib.offset+4*70, slib.segment );
        new.cs = func.segment & ~PRIV_MASK;
        new.cs |= save.cs & PRIV_MASK;
        new.ip = func.offset;
        new.dx = *save_hdl;
        __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_REG_WR, &new,
            sizeof( new ), 0, 0 );
        __qnx_debug_cont( ProcInfo.proc, ProcInfo.pid, 0 );
        Receive( 0, 0, 0 );
        *save_hdl = -1;
    }
    if( file_name[0] != '\0' ) {
        __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_MEM_RD, &func,
            sizeof( func ), slib.offset+4*69, slib.segment );
        new.cs = func.segment & ~PRIV_MASK;
        new.cs |= save.cs & PRIV_MASK;
        new.ip = func.offset;
        len = strlen( file_name ) + 1;
        new.sp -= STK_ALIGN( len, word );
        new.bx = new.sp;
        new.cx = new.ss;
        __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_MEM_WR, file_name,
            len, new.sp, new.ss );
        __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_REG_WR, &new,
            sizeof( new ), 0, 0 );
        __qnx_debug_cont( ProcInfo.proc, ProcInfo.pid, 0 );
        Receive( 0, 0, 0 );
        __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_REG_RD, &new,
            sizeof( new ), 0, 0 );
        if( (unsigned)new.ax == -1 ) ret->err = 1;
        *save_hdl = new.ax;
    }
    __qnx_debug_xfer( ProcInfo.proc, ProcInfo.pid, _DEBUG_REG_WR, &save,
            sizeof( save ), 0, 0 );
    return( sizeof( *ret ) );
}

unsigned ReqRedirect_stdin()
{
    if( ProcInfo.dbg32 ) {
        return( Redir32( TRUE ) );
    } else {
        return( Redir16( TRUE ) );
    }
}

unsigned ReqRedirect_stdout()
{
    if( ProcInfo.dbg32 ) {
        return( Redir32( FALSE ) );
    } else {
        return( Redir16( FALSE ) );
    }
}

unsigned ReqFile_string_to_fullpath()
{
    struct _psinfo     proc;
    pid_t              pid;
    nid_t              nid;
    bool               exe;
    int                len;
    char               *name;
    char               *fullname;
    file_string_to_fullpath_req *acc;
    file_string_to_fullpath_ret *ret;

/*     -- convert string in acc->name to full path (searchpath style)
 *        in acc->info (MAXIMUM len acc->info_len).
 */
    pid = 0;
    acc = GetInPtr( 0 );
    name = GetInPtr( sizeof( *acc ) );
    ret = GetOutPtr( 0 );
    fullname = GetOutPtr( sizeof( *ret ) );
    exe = ( acc->file_type == TF_TYPE_EXE ) ? TRUE : FALSE;
    if( exe ) {
        pid = RunningProc( &nid, name, &proc, &name );
    }
    if( pid != 0 ) {
        len = StrCopy( proc.un.proc.name, fullname ) - fullname;
    } else {
        len = FindFilePath( exe, name, fullname );
    }
    if( len == 0 ) {
        ret->err = ENOENT;      /* File not found */
    } else {
        ret->err = 0;
    }
    return( sizeof( *ret ) + len + 1 );
}

unsigned ReqGet_message_text()
{
    static const char *const ExceptionMsgs[] = {
        "",
        TRP_QNX_hangup,
        TRP_QNX_user_interrupt,
        TRP_QNX_quit,
        TRP_EXC_illegal_instruction,
        TRP_QNX_trap,
        //"I/O trap",
        TRP_QNX_abort,
        TRP_QNX_emt,
        TRP_QNX_floating_point_error,
        TRP_QNX_process_killed,
        TRP_QNX_bus_error,
        TRP_EXC_access_violation,
        TRP_QNX_sys,
        TRP_QNX_broken_pipe,
        TRP_QNX_alarm,
        TRP_QNX_process_termination,
        TRP_QNX_user_signal_1,
        TRP_QNX_user_signal_2,
        TRP_QNX_child_stopped,
        TRP_QNX_power_fail,
        TRP_QNX_winch,
        TRP_QNX_urgent,
        TRP_QNX_poll,
        TRP_QNX_process_stopped,
        "",
        TRP_QNX_process_continued,
        TRP_QNX_device_ready,
        "",
        ""
    };
    get_message_text_ret        *ret;
    char                        *err_txt;

    ret = GetOutPtr( 0 );
    err_txt = GetOutPtr( sizeof(*ret) );
    if( ProcInfo.fork ) {
        ProcInfo.fork = FALSE;
        strcpy( err_txt, TRP_QNX_PROC_FORK );
        ret->flags = MSG_NEWLINE | MSG_WARNING;
    } else {
        if( ProcInfo.sig == -1 ) {
            err_txt[0] = '\0';
        } else if( ProcInfo.sig > ( (sizeof(ExceptionMsgs) / sizeof(char *) - 1) ) ) {
            strcpy( err_txt, TRP_EXC_unknown );
        } else {
            strcpy( err_txt, ExceptionMsgs[ ProcInfo.sig ] );
        }
        ProcInfo.sig = -1;
        ret->flags = MSG_NEWLINE | MSG_ERROR;
    }
    return( sizeof( *ret ) + strlen( err_txt ) + 1 );
}

unsigned ReqAddr_info()
{
    addr_info_req       *acc;
    addr_info_ret       *ret;
    struct _seginfo     info;
    bool                is_32;

    acc = GetInPtr( 0 );
    is_32 = FALSE;
    if( ProcInfo.proc32 ) {
        qnx_segment_info( ProcInfo.proc, ProcInfo.pid, acc->in_addr.segment,
                        &info );
        if( info.flags & _PMF_DBBIT ) {
            is_32 = TRUE;
        }
    }
    ret = GetOutPtr( 0 );
    ret->is_32 = is_32;
    return( sizeof( *ret ) );
}

unsigned ReqMachine_data()
{
    machine_data_req    *acc;
    machine_data_ret    *ret;
    unsigned_8          *data;
    struct _seginfo     info;

    acc = GetInPtr( 0 );
    ret = GetOutPtr( 0 );
    data = GetOutPtr( sizeof( *ret ) );
    ret->cache_start = 0;
    ret->cache_end = ~(addr_off)0;
    *data = 0;
    if( ProcInfo.proc32 ) {
        qnx_segment_info( ProcInfo.proc, ProcInfo.pid, acc->addr.segment,
                        &info );
        if( info.flags & _PMF_DBBIT ) {
            *data |= X86AC_BIG;
        }
    }
    return( sizeof( *ret ) + sizeof( *data ) );
}

unsigned ReqGet_lib_name()
{
#if 0
    get_lib_name_req    *acc;
    get_lib_name_ret    *ret;
    char                *name;

    acc = GetInPtr(0);
    ret = GetOutPtr( 0 );
    name = GetOutPtr( sizeof( *ret ) );
    switch( acc->handle ) {
    case MH_NONE:
    case MH_DEBUGGEE:
        ret->handle = MH_SLIB;
        if( ProcInfo.dbg32 ) {
            strcpy( name, "/boot/sys/Slib32" );
        } else {
            strcpy( name, "/boot/sys/Slib16" );
        }
        break;
    case MH_SLIB:
        ret->handle = MH_PROC;
        if( ProcInfo.proc32 ) {
            strcpy( name, "/boot/sys/Proc32" );
        } else {
            strcpy( name, "/boot/sys/Proc16" );
        }
        break;
    default:
        ret->handle = MH_NONE;
        name[0] = '\0';
        break;
    }
#else
    get_lib_name_req    *acc;
    get_lib_name_ret    *ret;
    char                *name;
    char                *p;
    pid_t               pid, vid, proc;
    struct _psinfo      info;

    acc = GetInPtr(0);
    ret = GetOutPtr( 0 );
    name = GetOutPtr( sizeof( *ret ) );
    p = NULL;
    switch( acc->handle ) {
    case MH_NONE:
    case MH_DEBUGGEE:
        ret->handle = MH_SLIB;
        if( ProcInfo.dbg32 ) {
            if( ( pid = vid = qnx_name_locate(ProcInfo.nid, _SLIB_NAME, 0, 0 ) ) != -1 ) {
                qnx_psinfo( proc = PROC_PID, pid, &info, 0, 0 );
                if( info.flags & _PPF_VID ) {
                    pid = info.un.vproc.remote_pid;
                    proc = qnx_vc_attach( ProcInfo.nid, PROC_PID, 0, 0 );
                }
                if( proc != -1 ) {
                    if( qnx_psinfo( proc, pid, &info, 0, 0 ) == pid ) {;
                        p = info.un.proc.name;
                        qnx_vc_detach( proc );
                    }
                }
                qnx_vc_detach( vid );
            }
            if( p == NULL ) p = "sys/Slib32";
        } else {
            p = "sys/Slib16";
        }
        break;
    case MH_SLIB:
        ret->handle = MH_PROC;
        if( ( proc = qnx_vc_attach(ProcInfo.nid, PROC_PID, 0, 0 ) ) != -1 ) {
            qnx_psinfo( proc, PROC_PID, &info, 0, 0 );
            p = info.un.proc.name;
            qnx_vc_detach( proc );
        } else if( ProcInfo.proc32 ) {
            p = "sys/Proc32";
        } else {
            p = "sys/Proc16";
        }
    default:
        ret->handle = MH_NONE;
        break;
    }
    if( p == NULL ) {
        name[0] = '\0';
    } else if( p[0] == '/' ) {
        if( p[1] == '/' ) {
            for( p += 2; *p >= '0' && *p <= '9'; p++ );
        }
        strcpy( name, p );
    } else {
        strcpy( name, "/boot/" );
        strcat( name, p );
    }
#endif
    return( sizeof( *ret ) + 1 + strlen( name ) );
}

unsigned ReqThread_get_next()
{
    thread_get_next_req *req;
    thread_get_next_ret *ret;
    pid_t               pid;

    req = GetInPtr( 0 );
    ret = GetOutPtr( 0 );
    if( pid = next_thread( req->thread, THREAD_ALL ) ) {
        ret->thread = pid;
        ret->state = find_thread( pid )->frozen ? THREAD_FROZEN : THREAD_THAWED;
    } else {
        ret->thread = 0;
    }
    return( sizeof( *ret ) );
}

unsigned ReqThread_set()
{
    thread_set_req      *req;
    thread_set_ret      *ret;
    pid_t               pid;
    thread_info         *thread;

    req = GetInPtr( 0 );
    ret = GetOutPtr( 0 );
    if( pid = req->thread ) {
        if( ( thread = find_thread( pid ) ) && !thread->fork ) {
            ret->err = 0;
            ret->old_thread = ProcInfo.pid;
            ProcInfo.pid = pid;
        } else {
            ret->err = EINVAL;
            ret->old_thread = ProcInfo.pid;
        }
    } else {
        ret->err = 0;
        ret->old_thread = ProcInfo.pid;
    }
    return( sizeof( *ret ) );
}

unsigned ReqThread_freeze()
{
    thread_freeze_req   *req;
    thread_freeze_ret   *ret;
    thread_info         *thread;

    req = GetInPtr( 0 );
    ret = GetOutPtr( 0 );
    if( thread = find_thread( req->thread ) ) {
        thread->frozen = TRUE;
        ret->err = 0;
    } else {
        ret->err = EINVAL;
    }
    return( sizeof( *ret ) );
}

unsigned ReqThread_thaw()
{
    thread_thaw_req     *req;
    thread_thaw_ret     *ret;
    thread_info         *thread;

    req = GetInPtr( 0 );
    ret = GetOutPtr( 0 );
    if( thread = find_thread( req->thread ) ) {
        thread->frozen = FALSE;
        ret->err = 0;
    } else {
        ret->err = EINVAL;
    }
    return( sizeof( *ret ) );
}

unsigned ReqThread_get_extra()
{
    thread_get_extra_req    *req;
    char                    *ret;
    struct _psinfo          info;
    thread_info             *thread;

    req = GetInPtr( 0 );
    ret = GetOutPtr( 0 );
    ret[0] = '\0';
    if( req->thread ) {
        if( thread = find_thread( req->thread ) ) {
            if( thread->fork ) {
                strcpy( ret, "Forked Process" );
            } else {
                if( qnx_psinfo( ProcInfo.proc, req->thread, &info, 0, 0 ) == req->thread ) {
                    strcpy( ret, info.un.proc.name );
                }
            }
        }
    } else {
        strcpy( ret, "Thread Name" );
    }
    return( strlen( ret ) + 1 );
}

trap_version TRAPENTRY TrapInit( char *parm, char *err, bool remote )
{
    trap_version ver;

    parm=parm;
    ForceFpu32 = 0;
    if( parm != NULL ) {
        switch( *parm ) {
        case 'f':
            ForceFpu32 = -1;
            break;
        case 'F':
            ForceFpu32 = 1;
            break;
        }
    }
    remote = remote;
    ProcInfo.save_in = -1;
    ProcInfo.save_out = -1;
    ProcInfo.thread = NULL;
    ProcInfo.max_threads = 0;
    find_thread( 0 );   /* allocate initial thread array */
    err[0] = '\0'; /* all ok */
    StdPos.in  = lseek( 0, 0, SEEK_CUR );
    StdPos.out = lseek( 1, 0, SEEK_CUR );
    StdPos.err = lseek( 2, 0, SEEK_CUR );
    ver.major = TRAP_MAJOR_VERSION;
    ver.minor = TRAP_MINOR_VERSION;
    ver.remote = FALSE;
    //ver.is_32 = FALSE;
    OrigPGrp = getpgrp();
    MID = qnx_proxy_attach( 0, 0, 0, 0 );
    if( MID == 0 ) {
        strcpy( err, TRP_QNX_no_proxy );
    }
    return( ver );
}

void TRAPENTRY TrapFini()
{
}

⌨️ 快捷键说明

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