On Mon, Nov 26, 2018 at 10:27:12 -0800, Richard Henderson wrote: > On 11/26/18 6:52 AM, Alex Bennée wrote: > > I'm not convinced this is the best way to go about it. We end up having > > to sprinkle the plugin calls into each decoder rather than keeping all > > the infrastructure in the common main loop. However the common loop will > > need to know the total number of bytes decoded so we could change the > > declaration to: > > > > int (*translate_insn)(DisasContextBase *db, CPUState *cpu); > > > > and return the number of bytes decoded. > > Returning the number of bytes is more difficult than simply just > > old_pc = db->pc_next; > opc->translate_insn(db, cpu); > bytes = db->pc_next - old_pc; > > requiring no target changes at all.
The main reason why I added the qemu_plugin_insn_append calls was to avoid reading the instructions twice from guest memory, because I was worried that doing so might somehow alter the guest's execution, e.g. what if we read a cross-page instruction, and both pages mapped to the same TLB entry? We'd end up having more TLB misses because instrumentation was enabled. If you think that's not really a concern, we could just re-do the reads in the translator loop and get the size as above. Thanks, Emilio