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"); } }
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 {
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; }
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++] = ' '; } }
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; }