Esempio n. 1
0
void BX_CPU_C::debug_disasm_instruction(bx_address offset)
{
#if BX_DEBUGGER
  bx_dbg_disassemble_current(BX_CPU_ID, 1); // only one cpu, print time stamp
#else
  bx_phy_address phy_addr;
  Bit8u  instr_buf[16];
  char   char_buf[512];
  size_t i=0;

  static char letters[] = "0123456789ABCDEF";
  static disassembler bx_disassemble;
  unsigned remainsInPage = 0x1000 - PAGE_OFFSET(offset);

  bx_bool valid = dbg_xlate_linear2phy(BX_CPU_THIS_PTR get_laddr(BX_SEG_REG_CS, offset), &phy_addr);
  if (valid) {
    BX_MEM(0)->dbg_fetch_mem(BX_CPU_THIS, phy_addr, 16, instr_buf);
    unsigned isize = bx_disassemble.disasm(
        BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.d_b,
        BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64,
        BX_CPU_THIS_PTR get_segment_base(BX_SEG_REG_CS), offset,
        instr_buf, char_buf+i);
    if (isize <= remainsInPage) {
      i=strlen(char_buf);
      char_buf[i++] = ' ';
      char_buf[i++] = ':';
      char_buf[i++] = ' ';
      for (unsigned j=0; j<isize; j++) {
        char_buf[i++] = letters[(instr_buf[j] >> 4) & 0xf];
        char_buf[i++] = letters[(instr_buf[j] >> 0) & 0xf];
      }
      char_buf[i] = 0;
      BX_INFO((">> %s", char_buf));
    }
    else {
Esempio n. 2
0
void bxInstrumentation::bx_print_instruction(void)
{
  char disasm_tbuf[512];	// buffer for instruction disassembly
  bx_disassembler.disasm(is32, is64, 0, 0, opcode, disasm_tbuf);

  if(opcode_length != 0)
  {
    unsigned n;

    fprintf(stderr, "----------------------------------------------------------\n");
    fprintf(stderr, "CPU: %d: %s\n", cpu_id, disasm_tbuf);
    fprintf(stderr, "LEN: %d\tBYTES: ", opcode_length);
    for(n=0;n < opcode_length;n++) fprintf(stderr, "%02x", opcode[n]);
    if(is_branch)
    {
      fprintf(stderr, "\tBRANCH ");

      if(is_taken)
        fprintf(stderr, "TARGET " FMT_ADDRX " (TAKEN)", target_linear);
      else
        fprintf(stderr, "(NOT TAKEN)");
    }
    fprintf(stderr, "\n");
    for(n=0;n < num_data_accesses;n++)
    {
      fprintf(stderr, "MEM ACCESS[%u]: 0x" FMT_ADDRX " (linear) 0x" FMT_PHY_ADDRX " (physical) %s SIZE: %d\n", n,
                    data_access[n].laddr,
                    data_access[n].paddr,
                    data_access[n].op == BX_READ ? "RD":"WR",
                    data_access[n].size);
    }
    fprintf(stderr, "\n");
  }
}
	int
	disassembleForAtInSize(void *cpu, ulong laddr,
							void *memory, ulong byteSize)
	{
		BX_CPU_C *anx86 = (BX_CPU_C *)cpu;

		Bit8u  instr_buf[16];
		size_t i=0;

		static char letters[] = "0123456789ABCDEF";
		static disassembler bx_disassemble;
		long remainsInPage = byteSize - laddr;

		if (remainsInPage < 0) {
			theErrorAcorn = MemoryBoundsError;
			return -MemoryBoundsError;
		}

		memcpy(instr_buf, (char *)memory + laddr, min(15,byteSize - laddr));
		i = sprintf(bochs_log, "%08lx: ", laddr);
		bx_disassemble.set_syntax_att();
		unsigned isize = bx_disassemble.disasm(
							anx86->sregs[BX_SEG_REG_CS].cache.u.segment.d_b,
							anx86->cpu_mode == BX_MODE_LONG_64,
							anx86->get_segment_base(BX_SEG_REG_CS), laddr,
							instr_buf,
							bochs_log+i);
		if (isize <= remainsInPage) {
		  i=strlen(bochs_log);
		  bochs_log[i++] = ' ';
		  bochs_log[i++] = ':';
		  bochs_log[i++] = ' ';
		  for (unsigned j=0; j<isize; j++) {
			bochs_log[i++] = letters[(instr_buf[j] >> 4) & 0xf];
			bochs_log[i++] = letters[(instr_buf[j] >> 0) & 0xf];
			bochs_log[i++] = ' ';
		  }
		}
Esempio n. 4
0
void bxInstrumentation::bx_instr_new_instruction()
{
  if (!active) return;

  if (valid)
  {
    char disasm_tbuf[512];	// buffer for instruction disassembly
    unsigned length = opcode_size, n;
    bx_disassembler.disasm(is32, is64, 0, 0, opcode, disasm_tbuf);
    if(length != 0)	
    {
      fprintf(stderr, "----------------------------------------------------------\n");
      fprintf(stderr, "CPU: %d: %s\n", cpu_id, disasm_tbuf);
      fprintf(stderr, "LEN: %d\tPREFIXES: %d\tBYTES: ", length, nprefixes);
      for(n=0;n<length;n++) fprintf(stderr, "%02x", opcode[n]);
      if(is_branch) 
      {
        fprintf(stderr, "\tBRANCH ");

        if(is_taken) 
          fprintf(stderr, "TARGET " FMT_ADDRX " (TAKEN)", target_linear);
        else
          fprintf(stderr, "(NOT TAKEN)");
      }   
      fprintf(stderr, "\n");
      for(n=0;n < num_data_accesses;n++)
      {
        fprintf(stderr, "MEM ACCESS[%u]: " FMT_ADDRX " (linear) 0x%08x (physical) %s SIZE: %d\n", n,
                      data_access[n].laddr, 
                      data_access[n].paddr,
                      data_access[n].op == BX_READ ? "RD":"WR",
                      data_access[n].size);
      }
      fprintf(stderr, "\n");
    }
  }

  valid = is_branch = 0;
  nprefixes = num_data_accesses = 0;
}
Esempio n. 5
0
void WSwanDBG_Disassemble(uint32 &a, uint32 SpecialA, char *text_buffer)
{
 uint32 mis = MDFNGameInfo->Debugger->MaxInstructionSize;
 mis = 256;
 uint8 instr_buffer[mis];
 uint32 ps = v30mz_get_reg(NEC_PS);
 int consumed;

 for(unsigned int i = 0; i < mis; i++)
 {
  instr_buffer[i] = WSwan_readmem20(((ps << 4) + a + i) & 0xFFFFF);
 }

 consumed = zedis.disasm(0x0000, a, instr_buffer, text_buffer);

 int x;
 for(x = strlen(text_buffer); x < 40; x++)
  text_buffer[x] = ' ';
 text_buffer[x] = 0;

 for(int i = 0; i < consumed; i++)
 {
  char tmp[16];
  trio_snprintf(tmp, 16, " %02x", instr_buffer[i]);
  strcat(text_buffer, tmp);
 }

 for(int i = 1; i < consumed; i++)
  if(((a + i) & 0xFFFF) == SpecialA)
  {
   a = SpecialA;
   strcpy(text_buffer, "BORKBORK");
   return;
  }

 a = (a + consumed) & 0xFFFF;
}
Esempio n. 6
0
void WSwanDBG_ToggleSyntax(void)
{
 zedis.toggle_syntax_mode();
}