📄 linuxcore.c
字号:
r->fs = regs.fs;
r->gs = regs.gs;
}
}
}
static void ReadFPU( struct x86_fpu *r )
{
memset( r, 0, sizeof( *r ) );
if( core_info.loaded ) {
#if 0
memcpy( r, core_info.hdr.x87, sizeof( core_info.hdr.x87 ) );
if( !core_info.fpu32 ) FPUExpand( r );
#endif
}
}
unsigned ReqRead_cpu( void )
{
ReadCPU( GetOutPtr( 0 ) );
return( sizeof( struct x86_cpu ) );
}
unsigned ReqRead_fpu( void )
{
ReadFPU( GetOutPtr( 0 ) );
return( sizeof( struct x86_fpu ) );
}
unsigned ReqRead_regs( void )
{
mad_registers *mr;
mr = GetOutPtr( 0 );
ReadCPU( &mr->x86.cpu );
ReadFPU( &mr->x86.fpu );
return( sizeof( mr->x86 ) );
}
unsigned ReqWrite_cpu( void )
{
return( 0 );
}
unsigned ReqWrite_fpu( void )
{
return( 0 );
}
unsigned ReqWrite_regs( void )
{
return( 0 );
}
static int load_core_header( const char *core_name )
{
int fd;
int result;
result = FALSE;
if( core_info.e_hdr == NULL ) {
core_info.e_hdr = malloc( sizeof( *core_info.e_hdr ) );
if( core_info.e_hdr == NULL )
return( result );
}
fd = open( core_name, O_RDONLY );
if( fd < 0 )
return( result );
core_info.fd = fd;
if( !elf_read_hdr( fd, core_info.e_hdr ) ) {
close( fd );
} else {
if( elf_read_phdr( fd, core_info.e_hdr, &core_info.e_phdr ) ) {
result = TRUE;
}
}
return( result );
}
unsigned ReqProg_load( void )
{
prog_load_req *acc;
prog_load_ret *ret;
char *argv;
core_info.dbg32 = FALSE;
core_info.mapping_shared = FALSE;
acc = GetInPtr( 0 );
ret = GetOutPtr( 0 );
argv = GetInPtr( sizeof( *acc ) );
ret->mod_handle = MH_DEBUGGEE;
if( argv[0] == '\0' ) {
ret->task_id = 0;
ret->err = ENOENT;
return( sizeof( *ret ) );
}
core_info.err_no = 0;
load_core_header( argv );
ret->flags = LD_FLAG_IS_STARTED | LD_FLAG_IS_PROT | LD_FLAG_IS_32;
ret->task_id = 123; //core_info.hdr.psdata.pid;
ret->err = core_info.err_no;
if( core_info.err_no == 0 ) {
core_info.loaded = TRUE;
} else {
close( core_info.fd );
core_info.fd = NO_FILE;
}
return( sizeof( *ret ) );
}
unsigned ReqProg_kill( void )
{
prog_kill_ret *ret;
if( core_info.loaded ) {
core_info.loaded = FALSE;
close( core_info.fd );
core_info.fd = NO_FILE;
}
core_info.mapping_shared = FALSE;
ret = GetOutPtr( 0 );
ret->err = 0;
return( sizeof( *ret ) );
}
unsigned ReqSet_break( void )
{
set_break_ret *ret;
ret = GetOutPtr( 0 );
ret->old = 0;
return( sizeof( *ret ) );
}
unsigned ReqClear_break( void )
{
return( 0 );
}
unsigned ReqSet_watch( void )
{
set_watch_ret *ret;
ret = GetOutPtr( 0 );
ret->err = 0;
ret->multiplier = USING_DEBUG_REG | 1;
return( sizeof( *ret ) );
}
unsigned ReqClear_watch( void )
{
return( 0 );
}
unsigned ReqProg_go( void )
{
prog_go_ret *ret;
ret = GetOutPtr( 0 );
ret->conditions = COND_TERMINATE;
return( sizeof( *ret ) );
}
unsigned ReqProg_step( void )
{
return( ReqProg_go() );
}
unsigned ReqGet_message_text( void )
{
get_message_text_ret *ret;
char *err_txt;
ret = GetOutPtr( 0 );
err_txt = GetOutPtr( sizeof(*ret) );
err_txt[0] = '\0';
ret->flags = MSG_NEWLINE | MSG_ERROR;
return( sizeof( *ret ) + 1 );
}
unsigned ReqRedirect_stdin( void )
{
redirect_stdin_ret *ret;
ret = GetOutPtr( 0 );
ret->err = 0;
return( sizeof( *ret ) );
}
unsigned ReqRedirect_stdout( void )
{
return( ReqRedirect_stdin() );
}
unsigned ReqFile_string_to_fullpath( void )
{
unsigned_16 len;
char *name;
char *fullname;
unsigned save_handle;
file_string_to_fullpath_req *acc;
file_string_to_fullpath_ret *ret;
acc = GetInPtr( 0 );
name = GetInPtr( sizeof( *acc ) );
ret = GetOutPtr( 0 );
fullname = GetOutPtr( sizeof( *ret ) );
fullname[0] = '\0';
len = 0;
if( acc->file_type != TF_TYPE_EXE ) {
len = FindFilePath( FALSE, name, fullname );
} else if( core_info.mapping_shared ) {
len = FindFilePath( TRUE, name, fullname );
} else {
save_handle = core_info.fd;
if( load_core_header( name ) ) {
// TODO: this should figure out the name of the executable
// that caused the core dump.
name = "cdump";
strcpy( fullname, name );
len = strlen( fullname );
#if 0
struct stat chk;
name = "/foo/bar"; //core_info.hdr.psdata.un.proc.name;
if( stat( name, &chk ) != 0 ) {
/* try it without the node number */
name += 2;
while( *name != '/' ) ++name;
if( stat( name, &chk ) != 0 ) {
chk.st_mtime = 0;
}
}
if( core_info.ignore_timestamp || chk.st_mtime == core_info.hdr.cmdtime ) {
len = StrCopy( name, fullname ) - fullname;
}
#endif
close( core_info.fd );
}
core_info.fd = save_handle;
}
if( len == 0 ) {
ret->err = ENOENT; /* File not found */
} else {
ret->err = 0;
}
return( sizeof( *ret ) + len + 1 );
}
unsigned ReqAddr_info( void )
{
addr_info_req *acc;
addr_info_ret *ret;
acc = GetInPtr( 0 );
ret = GetOutPtr( 0 );
ret->is_32 = TRUE;
return( sizeof( *ret ) );
}
unsigned ReqMachine_data( void )
{
machine_data_req *acc;
machine_data_ret *ret;
unsigned_8 *data;
acc = GetInPtr( 0 );
ret = GetOutPtr( 0 );
data = GetOutPtr( sizeof( *ret ) );
ret->cache_start = 0;
ret->cache_end = ~(addr_off)0;
*data = X86AC_BIG;
return( sizeof( *ret ) + sizeof( *data ) );
}
unsigned ReqGet_lib_name( void )
{
get_lib_name_req *acc;
get_lib_name_ret *ret;
char *name;
// TODO: we could probably figure out what shared libs were loaded
acc = GetInPtr(0);
ret = GetOutPtr( 0 );
name = GetOutPtr( sizeof( *ret ) );
switch( acc->handle ) {
case MH_NONE:
case MH_DEBUGGEE:
ret->handle = MH_SLIB;
strcpy( name, "/boot/sys/Slib32" );
break;
case MH_SLIB:
ret->handle = MH_PROC;
strcpy( name, "/boot/sys/Proc32" );
break;
default:
ret->handle = MH_NONE;
name[0] = '\0';
break;
}
return( sizeof( *ret ) + 1 + strlen( name ) );
}
#if 0
unsigned ReqThread_get_next( void )
{
thread_get_next_req *req;
thread_get_next_ret *ret;
req = GetInPtr( 0 );
ret = GetOutPtr( 0 );
if( req->thread == 0 ) {
ret->thread = core_info.hdr.psdata.pid;
ret->state = THREAD_THAWED;
} else {
ret->thread = 0;
}
return( sizeof( *ret ) );
}
unsigned ReqThread_set( void )
{
thread_set_ret *ret;
ret = GetOutPtr( 0 );
ret->err = 0;
ret->old_thread = core_info.hdr.psdata.pid;
return( sizeof( *ret ) );
}
unsigned ReqThread_freeze( void )
{
thread_freeze_ret *ret;
ret = GetOutPtr( 0 );
ret->err = 0;
return( sizeof( *ret ) );
}
unsigned ReqThread_thaw( void )
{
thread_thaw_ret *ret;
ret = GetOutPtr( 0 );
ret->err = 0;
return( sizeof( *ret ) );
}
unsigned ReqThread_get_extra( void )
{
char *ret;
ret = GetOutPtr( 0 );
ret[0] = '\0';
return( strlen( ret ) + 1 );
}
#endif
trap_version TRAPENTRY TrapInit( char *parm, char *err, bool remote )
{
trap_version ver;
remote = remote;
core_info.fd = NO_FILE;
if( parm != NULL ) {
while( *parm != '\0' ) {
switch( *parm ) {
case 'I':
case 'i':
core_info.ignore_timestamp = TRUE;
break;
}
++parm;
}
}
err[0] = '\0'; /* all ok */
ver.major = TRAP_MAJOR_VERSION;
ver.minor = TRAP_MINOR_VERSION;
ver.remote = FALSE;
return( ver );
}
void TRAPENTRY TrapFini( void )
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -