mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 19:14:58 -06:00
disas: use result of ->read_memory_func
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>
This commit is contained in:
parent
4332099f0e
commit
90bbf9d9db
2 changed files with 51 additions and 38 deletions
|
@ -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);
|
||||
|
@ -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 (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;
|
||||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue