Skip to content

Commit

Permalink
disas: use result of ->read_memory_func
Browse files Browse the repository at this point in the history
This gets especially confusing if you start plugging in host addresses
from a trace and you wonder why the output keeps changing. Report when
read_memory_func fails instead of blindly disassembling the buffer
contents.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20220929114231.583801-35-alex.bennee@linaro.org>
  • Loading branch information
stsquad committed Oct 6, 2022
1 parent 4332099 commit 90bbf9d
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 40 deletions.
20 changes: 10 additions & 10 deletions disas.c
Expand Up @@ -83,18 +83,18 @@ static int print_insn_objdump(bfd_vma pc, disassemble_info *info,
const char *prefix)
{
int i, n = info->buffer_length;
uint8_t *buf = g_malloc(n);

info->read_memory_func(pc, buf, n, info);

for (i = 0; i < n; ++i) {
if (i % 32 == 0) {
info->fprintf_func(info->stream, "\n%s: ", prefix);
g_autofree uint8_t *buf = g_malloc(n);

if (info->read_memory_func(pc, buf, n, info) == 0) {
for (i = 0; i < n; ++i) {
if (i % 32 == 0) {
info->fprintf_func(info->stream, "\n%s: ", prefix);
}
info->fprintf_func(info->stream, "%02x", buf[i]);
}
info->fprintf_func(info->stream, "%02x", buf[i]);
} else {
info->fprintf_func(info->stream, "unable to read memory");
}

g_free(buf);
return n;
}

Expand Down
73 changes: 43 additions & 30 deletions disas/capstone.c
Expand Up @@ -191,37 +191,43 @@ bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size)
size_t tsize = MIN(sizeof(cap_buf) - csize, size);
const uint8_t *cbuf = cap_buf;

info->read_memory_func(pc + csize, cap_buf + csize, tsize, info);
csize += tsize;
size -= tsize;
if (info->read_memory_func(pc + csize, cap_buf + csize, tsize, info) == 0) {
csize += tsize;
size -= tsize;

while (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
cap_dump_insn(info, insn);
}
while (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
cap_dump_insn(info, insn);
}

/* If the target memory is not consumed, go back for more... */
if (size != 0) {
/*
* ... taking care to move any remaining fractional insn
* to the beginning of the buffer.
*/
if (csize != 0) {
memmove(cap_buf, cbuf, csize);
}
continue;
}

/* If the target memory is not consumed, go back for more... */
if (size != 0) {
/*
* ... taking care to move any remaining fractional insn
* to the beginning of the buffer.
* Since the target memory is consumed, we should not have
* a remaining fractional insn.
*/
if (csize != 0) {
memmove(cap_buf, cbuf, csize);
info->fprintf_func(info->stream,
"Disassembler disagrees with translator "
"over instruction decoding\n"
"Please report this to qemu-devel@nongnu.org\n");
}
continue;
}
break;

/*
* Since the target memory is consumed, we should not have
* a remaining fractional insn.
*/
if (csize != 0) {
} else {
info->fprintf_func(info->stream,
"Disassembler disagrees with translator "
"over instruction decoding\n"
"Please report this to qemu-devel@nongnu.org\n");
"0x%08" PRIx64 ": unable to read memory\n", pc);
break;
}
break;
}

cs_close(&handle);
Expand Down Expand Up @@ -286,16 +292,23 @@ bool cap_disas_monitor(disassemble_info *info, uint64_t pc, int count)

/* Make certain that we can make progress. */
assert(tsize != 0);
info->read_memory_func(pc + csize, cap_buf + csize, tsize, info);
csize += tsize;

if (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
cap_dump_insn(info, insn);
if (--count <= 0) {
break;
if (info->read_memory_func(pc + csize, cap_buf + csize,
tsize, info) == 0)
{
csize += tsize;

if (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
cap_dump_insn(info, insn);
if (--count <= 0) {
break;
}
}
memmove(cap_buf, cbuf, csize);
} else {
info->fprintf_func(info->stream,
"0x%08" PRIx64 ": unable to read memory\n", pc);
break;
}
memmove(cap_buf, cbuf, csize);
}

cs_close(&handle);
Expand Down

0 comments on commit 90bbf9d

Please sign in to comment.