Exemplo n.º 1
0
static void 
gdb_cmd_write_mem(unsigned long addr, unsigned long length,
                  const char *buf, struct gdb_context *ctx)
{
    int x, r;
    unsigned char val;

    dbg_printk("Memory write starting at %lx, length %lx.\n", addr, length);

    for ( x = 0; x < length; x++, addr++, buf += 2 )
    {
        val = str2ulong(buf, sizeof(val));
        r = gdb_arch_copy_to_user((void*)addr, (void*)&val, 1);
        if ( r != 0 )
        {
            dbg_printk("Error writing to %lx.\n", addr);
            break;
        }
    }

    if (x == length)
        gdb_write_to_packet_str("OK", ctx);
    else
        gdb_write_to_packet_str("E11", ctx);

    dbg_printk("Write done.\n");

    gdb_send_packet(ctx);
}
Exemplo n.º 2
0
bool proc_dot(char* mnemonic, char** op, int opcnt, tState *state) {
	if ( strcasecmp(".long", mnemonic) == 0 ) {
		if ( opcnt != 1 ) {
			throw std::string("Operand count not match");
		}
		inst_t data = (inst_t)str2ulong(trim(op[0]));
		state->dest.push_back(data);
		return true;
		
	} else {
		//TODO 今のところlong以外は放置
		return true;
	}
}
Exemplo n.º 3
0
/* str2uchar - safely convert string to uint8
 *
 * @str: source string to convert from
 * @uchr_ptr: pointer where to store result
 *
 * returns zero on success
 * returns (-1) if one of args is NULL, (-2) or (-3) if conversion fails
 */
int str2uchar(const char * str, uint8_t * uchr_ptr)
{
	int rc = (-3);
	uint64_t arg_ulong = 0;
	if ( (rc = str2ulong(str, &arg_ulong)) != 0 ) {
		*uchr_ptr = 0;
		return rc;
	}

	if (arg_ulong > UINT8_MAX)
		return (-3);

	*uchr_ptr = (uint8_t)arg_ulong;
	return 0;
} /* str2uchar(...) */
Exemplo n.º 4
0
/* str2ushort - safely convert string to uint16_t
 *
 * @str: source string to convert from
 * @ushrt_ptr: pointer where to store result
 *
 * returns zero on success
 * returns (-1) if one of args is NULL, (-2) invalid input, (-3) for *flow
 */
int str2ushort(const char * str, uint16_t * ushrt_ptr)
{
	int rc = (-3);
	uint64_t arg_ulong = 0;
	if ( (rc = str2ulong(str, &arg_ulong)) != 0 ) {
		*ushrt_ptr = 0;
		return rc;
	}

	if (arg_ulong > UINT16_MAX)
		return (-3);

	*ushrt_ptr = (uint16_t)arg_ulong;
	return 0;
} /* str2ushort(...) */
Exemplo n.º 5
0
/* str2uint - safely convert string to uint32_t
 *
 * @str: source string to convert from
 * @uint_ptr: pointer where to store result
 *
 * returns zero on success
 * returns (-1) if one of args is NULL, (-2) invalid input, (-3) for *flow
 */
int str2uint(const char * str, uint32_t * uint_ptr)
{
	int rc = 0;
	uint64_t arg_ulong = 0;
	if ( (rc = str2ulong(str, &arg_ulong)) != 0) {
		*uint_ptr = 0;
		return rc;
	}

	if (arg_ulong > UINT32_MAX)
		return (-3);

	*uint_ptr = (uint32_t)arg_ulong;
	return 0;
} /* str2uint(...) */
Exemplo n.º 6
0
/* command dispatcher */
static int 
process_command(struct cpu_user_regs *regs, struct gdb_context *ctx)
{
    const char *ptr;
    unsigned long addr, length, val;
    int resume = 0;
    unsigned long type = GDB_CONTINUE;

    /* XXX check ctx->in_bytes >= 2 or similar. */

    gdb_start_packet(ctx);
    switch ( ctx->in_buf[0] )
    {
    case '?':    /* query signal number */
        gdb_cmd_signum(ctx);
        break;
    case 'H':    /* thread operations */
        gdb_send_reply("OK", ctx);
        break;
    case 'g': /* Read registers */
        gdb_arch_read_reg_array(regs, ctx);
        break;
    case 'G': /* Write registers */
        gdb_arch_write_reg_array(regs, ctx->in_buf + 1, ctx);
        break;
    case 'm': /* Read memory */
        addr = simple_strtoul(ctx->in_buf + 1, &ptr, 16);
        if ( (ptr == (ctx->in_buf + 1)) || (ptr[0] != ',') )
        {
            gdb_send_reply("E03", ctx);
            return 0;
        }
        length = simple_strtoul(ptr + 1, &ptr, 16);
        if ( ptr[0] != 0 )
        {
            gdb_send_reply("E04", ctx);
            return 0;
        }
        gdb_cmd_read_mem(addr, length, ctx);
        break;
    case 'M': /* Write memory */
        addr = simple_strtoul(ctx->in_buf + 1, &ptr, 16);
        if ( (ptr == (ctx->in_buf + 1)) || (ptr[0] != ',') )
        {
            gdb_send_reply("E03", ctx);
            return 0;
        }
        length = simple_strtoul(ptr + 1, &ptr, 16);
        if ( ptr[0] != ':')
        {
            gdb_send_reply("E04", ctx);
            return 0;
        }
        gdb_cmd_write_mem(addr, length, ptr + 1, ctx);
        break;
    case 'p': /* read register */
        addr = simple_strtoul(ctx->in_buf + 1, &ptr, 16);
        if ( ptr == (ctx->in_buf + 1) )
        {
            gdb_send_reply("E03", ctx);
            return 0;
        }
        if ( ptr[0] != 0 )
        {
            gdb_send_reply("E04", ctx);
            return 0;
        }
        gdb_arch_read_reg(addr, regs, ctx);
        break;
    case 'P': /* write register */
        addr = simple_strtoul(ctx->in_buf + 1, &ptr, 16);
        if ( ptr == (ctx->in_buf + 1) )
        {
            gdb_send_reply("E03", ctx);
            return 0;
        }
        if ( ptr[0] != '=' )
        {
            gdb_send_reply("E04", ctx);
            return 0;
        }
        ptr++;
        val = str2ulong(ptr, sizeof(unsigned long));
        gdb_arch_write_reg(addr, val, regs, ctx);
        break;
    case 'D':
    case 'k':
        gdbstub_detach(ctx);
        gdb_send_reply("OK", ctx);
        ctx->connected = 0;
        resume = 1;
        break;
    case 's': /* Single step */
        type = GDB_STEP;
    case 'c': /* Resume at current address */
        addr = ~((unsigned long)0);

        if ( ctx->in_buf[1] )
            addr = str2ulong(&ctx->in_buf[1], sizeof(unsigned long));
        gdbstub_attach(ctx);
        resume = 1;
        gdb_arch_resume(regs, addr, type, ctx);
        break;
    default:
        gdb_send_reply("", ctx);
        break;
    }
    return resume;
}
Exemplo n.º 7
0
std::set<long>* getProcessSocketInode(long pid) {
	std::set<long>* v = new std::set<long>();
	char temp[50];
	memset(temp, 0, 50);
	sprintf(temp, "%ld", pid);
	size_t dirlen = 10 + strlen(temp);
	char * dirname = (char *) malloc (dirlen * sizeof(char));
	snprintf(dirname, dirlen, "/proc/%s/fd", temp);

	int isExist = access(dirname, F_OK);
	if (isExist == -1) {
		free(dirname);
		printf("process do not exist, pid is : %d\n", pid);
		return NULL;
	}

	DIR * dir = opendir (dirname);

	dirent * entry;

	while ((entry = readdir(dir))) {
		if (entry->d_type != DT_LNK)
			continue;
		//std::cout << "Looking at: " << entry->d_name << std::endl;

		int fromlen = dirlen + strlen(entry->d_name) + 1;
		char * fromname = (char *) malloc (fromlen * sizeof(char));
		snprintf (fromname, fromlen, "%s/%s", dirname, entry->d_name);

		//std::cout << "Linking from: " << fromname << std::endl;

		int linklen = 80;
		char linkname [linklen];
		int usedlen = readlink(fromname, linkname, linklen-1);
		if (usedlen == -1)
		{
			free (fromname);
			continue;
		}
		
		linkname[usedlen] = '\0';
		//std::cout << "Linking to: " << linkname << std::endl;
		//get_info_by_linkname (pid, linkname);
		if (strncmp(linkname, "socket:[", 8) == 0) {
			
			char * ptr = linkname + 8;
			unsigned long inode = str2ulong(ptr);

			//char * progname = getprogname (temp);
			//free(progname);

			v->insert(inode);
		} else {
			//std::cout << "Linkname looked like: " << linkname << endl;
		}
		free (fromname);
	}
	closedir(dir);
	free(dirname);
	return v;

}
Exemplo n.º 8
0
void get_info_by_linkname (const char * pid, const char * linkname) {
	if (strncmp(linkname, "socket:[", 8) == 0) {
		setnode(str2ulong(linkname + 8), str2int(pid));
	}
}
Exemplo n.º 9
0
int main(int argc, char *argv[]) {
   u32t       flen;
   void     *fdata;
   str_list   *cfg;
   char     *value;
   // just exit ;)
   if (hlp_hosttype()==QSHT_EFI) return 3;
   // check "we are called" flag
   if (sto_dword(RUN_ONCE_KEY)) {
      printf("Second configuration check call is not required.\n");
      return 2;
   }
   // read cfg file, be quiet if failed
   fdata = hlp_freadfull("OS2LDR.CFG", &flen, 0);
   if (!fdata) return 1;

   cfg   = str_settext((char*)fdata, flen);
   hlp_memfree(fdata);
   // save non-zero value to flag "we are called at least once"
   sto_savedword(RUN_ONCE_KEY, 1);
   // process config keys
   value = str_findkey(cfg, "HIDEMEM", 0);
   if (value) shell_cmd("mem hide ", value);
   // limit can be already set by VMTRR or someone else, check this too
   value = str_findkey(cfg, "MEMLIMIT", 0);
   if (value) {
      u32t limit = str2ulong(value);
      if (limit) {
         u32t oldv = sto_dword(STOKEY_MEMLIM);
         if (!oldv || limit<oldv) sto_savedword(STOKEY_MEMLIM, limit);
      }
   }
   // bootos2.exe will use this key when found no LOGSIZE parameter
   value = str_findkey(cfg, "LOGSIZE", 0);
   if (value) {
      u32t logsize = str2ulong(value);
      if (logsize>=64) sto_savedword(STOKEY_LOGSIZE, logsize); else
         log_printf("aoscfg: logsize too small (%u)!\n", logsize);
   }
   // apply DBPORT & DBCARD only if NO port selected
   if (hlp_seroutinfo(0)==0) {
      value = str_findkey(cfg, "DBCARD", 0);
      if (value) shell_cmd("dbcard ", value); else {
         value = str_findkey(cfg, "DBPORT", 0);
         if (value) {
            u32t port = str2ulong(value);
            if (port) hlp_seroutset(port, 0);
         }
      }
   }
   // ramdisk creation (only if not exist one)
   value = str_findkey(cfg, "RAMDISKNAME", 0);
   if (value) setenv("VDISKNAME", value, 1);

   value = str_findkey(cfg, "RAMDISK", 0);
   if (value) {
      qs_vdisk  dsk = NEW(qs_vdisk);
      if (dsk) {
         u32t sectors;
         qserr    res = dsk->query(0, 0, &sectors, 0, 0);
         DELETE(dsk);
         if (!res) {
            log_printf("aoscfg: ramdisk already exists (%uMb)!\n", sectors>>11);
         } else {
            shell_cmd("ramdisk ", value);
         }
      } else