qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Instruction trace for userspace emulator


From: Marcus Engene
Subject: Instruction trace for userspace emulator
Date: Fri, 7 Jan 2022 13:56:04 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0

Hi,

I'd like to do instruction traces for qemu user, but with more information. Basically I'd like qemu-x86_64 to give me roughly the same as
perf record -e intel_pt//u ./a.out

I want to submit changes upstream.

I wrote an email 14dec which Alex Bennée kindly answered but it was deleted locally so I can't reply to it now.

I understand the limitations of only having ELF STT_FUNC for
 * the binary I start + the interpreter as these two are loaded by qemu
 * the binary needs to not be stripped
Loading of subsequent libraries seems to totally be done by the interpreter, if I've read the code correctly. I would like to use plugins because I'd like to write another plugin later that dumps guest memory when entering a function of choice.

I added a new API for plugins. Example below. If any:

QEMU_PLUGIN_EXPORT
void qemu_plugin_syminfos(struct syminfo *global_syminfos) {
    local_syminfos = global_syminfos;
}

If any plugin has defined this function, elfload.c loads_symbols()

-    if (qemu_log_enabled()) {
+    if (qemu_log_enabled() || load_symbols_from_elf) {
         load_symbols(ehdr, image_fd, load_bias);
     }

The problem is that the addresses in syminfos are from ELF, and are not the same as the addresses in qemu_plugin_tb struct. So, somewhere I need to add a mapping table between this address and guest address so I can lookup the correct symbol. But where would I add that? I looked in translator.c and it's call chain but nothing was obvious to me.

Any thoughts around this would be highly appreciated.

Kind regards,
Marcus





reply via email to

[Prev in Thread] Current Thread [Next in Thread]