From: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
To: Pierrick Bouvier <pierrick.bouvier@linaro.org>, qemu-devel@nongnu.org
Cc: "Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Philippe Mathieu-Daudé " <philmd@linaro.org>,
"rowan Hart" <rowanbhart@gmail.com>,
"Gustavo Romero" <gustavo.romero@linaro.org>,
"Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Richard Henderson" <richard.henderson@linaro.org>
Subject: Re: [PATCH v5 7/9] contrib/plugins/uftrace: implement x64 support
Date: Fri, 08 Aug 2025 12:42:38 +0300 [thread overview]
Message-ID: <t0o5pl.3rum11rfv1tyj@linaro.org> (raw)
In-Reply-To: <20250808020702.410109-8-pierrick.bouvier@linaro.org>
On Fri, 08 Aug 2025 05:07, Pierrick Bouvier <pierrick.bouvier@linaro.org> wrote:
>It's trivial to implement x64 support, as it's the same stack layout
>than aarch64.
s/than/as
>
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
>---
> contrib/plugins/uftrace.c | 85 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 85 insertions(+)
>
>diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c
>index 6628b4256fd..f10172eed10 100644
>--- a/contrib/plugins/uftrace.c
>+++ b/contrib/plugins/uftrace.c
>@@ -79,6 +79,20 @@ typedef struct {
> struct qemu_plugin_register *reg_scr_el3;
> } Aarch64Cpu;
>
>+typedef enum {
>+ X64_RING0,
>+ X64_RING1,
>+ X64_RING2,
>+ X64_RING3,
>+ X64_REAL_MODE,
>+} X64PrivilegeLevel;
>+
>+typedef struct {
>+ struct qemu_plugin_register *reg_rbp;
>+ struct qemu_plugin_register *reg_cs;
>+ struct qemu_plugin_register *reg_cr0;
>+} X64Cpu;
>+
> typedef struct {
> uint64_t timestamp;
> uint64_t data;
>@@ -565,6 +579,75 @@ static CpuOps aarch64_ops = {
> .does_insn_modify_frame_pointer = aarch64_does_insn_modify_frame_pointer,
> };
>
>+static uint8_t x64_num_privilege_levels(void)
>+{
>+ return X64_REAL_MODE + 1;
>+}
>+
>+static const char *x64_get_privilege_level_name(uint8_t pl)
>+{
>+ switch (pl) {
>+ case X64_RING0: return "Ring0";
>+ case X64_RING1: return "Ring1";
>+ case X64_RING2: return "Ring2";
>+ case X64_RING3: return "Ring3";
>+ case X64_REAL_MODE: return "RealMode";
>+ default:
>+ g_assert_not_reached();
>+ }
>+}
>+
>+static uint8_t x64_get_privilege_level(Cpu *cpu_)
>+{
>+ X64Cpu *cpu = cpu_->arch;
>+ uint64_t cr0 = cpu_read_register64(cpu_, cpu->reg_cr0);
>+ uint64_t protected_mode = (cr0 >> 0) & 0b1;
>+ if (!protected_mode) {
>+ return X64_REAL_MODE;
>+ }
>+ uint32_t cs = cpu_read_register32(cpu_, cpu->reg_cs);
>+ uint32_t ring_level = (cs >> 0) & 0b11;
>+ return ring_level;
>+}
>+
>+static uint64_t x64_get_frame_pointer(Cpu *cpu_)
>+{
>+ X64Cpu *cpu = cpu_->arch;
>+ return cpu_read_register64(cpu_, cpu->reg_rbp);
>+}
>+
>+static void x64_init(Cpu *cpu_)
>+{
>+ X64Cpu *cpu = g_new0(X64Cpu, 1);
>+ cpu_->arch = cpu;
>+ cpu->reg_rbp = plugin_find_register("rbp");
>+ g_assert(cpu->reg_rbp);
>+ cpu->reg_cs = plugin_find_register("cs");
>+ g_assert(cpu->reg_cs);
>+ cpu->reg_cr0 = plugin_find_register("cr0");
>+ g_assert(cpu->reg_cr0);
>+}
>+
>+static void x64_end(Cpu *cpu)
>+{
>+ g_free(cpu->arch);
>+}
>+
>+static bool x64_does_insn_modify_frame_pointer(const char *disas)
>+{
>+ return strstr(disas, "rbp");
>+}
>+
>+static CpuOps x64_ops = {
>+ .init = x64_init,
>+ .end = x64_end,
>+ .get_frame_pointer = x64_get_frame_pointer,
>+ .get_privilege_level = x64_get_privilege_level,
>+ .num_privilege_levels = x64_num_privilege_levels,
>+ .get_privilege_level_name = x64_get_privilege_level_name,
>+ .does_insn_modify_frame_pointer = x64_does_insn_modify_frame_pointer,
>+};
>+
> static void track_privilege_change(unsigned int cpu_index, void *udata)
> {
> Cpu *cpu = qemu_plugin_scoreboard_find(score, cpu_index);
>@@ -771,6 +854,8 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
>
> if (!strcmp(info->target_name, "aarch64")) {
> arch_ops = aarch64_ops;
>+ } else if (!strcmp(info->target_name, "x86_64")) {
>+ arch_ops = x64_ops;
> } else {
> fprintf(stderr, "plugin uftrace: %s target is not supported\n",
> info->target_name);
>--
>2.47.2
>
No idea about x86 assembly tbh but this looks correct to me.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
next prev parent reply other threads:[~2025-08-08 9:44 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-08 2:06 [PATCH v5 0/9] contrib/plugins: uftrace Pierrick Bouvier
2025-08-08 2:06 ` [PATCH v5 1/9] contrib/plugins/uftrace: skeleton file Pierrick Bouvier
2025-08-08 8:14 ` Manos Pitsidianakis
2025-08-08 16:19 ` Pierrick Bouvier
2025-08-08 16:34 ` Manos Pitsidianakis
2025-08-08 17:28 ` Pierrick Bouvier
2025-08-08 2:06 ` [PATCH v5 2/9] contrib/plugins/uftrace: define cpu operations and implement aarch64 Pierrick Bouvier
2025-08-08 8:28 ` Manos Pitsidianakis
2025-08-08 16:27 ` Pierrick Bouvier
2025-08-08 16:36 ` Manos Pitsidianakis
2025-08-08 2:06 ` [PATCH v5 3/9] contrib/plugins/uftrace: track callstack Pierrick Bouvier
2025-08-08 8:49 ` Manos Pitsidianakis
2025-08-08 16:36 ` Pierrick Bouvier
2025-08-08 2:06 ` [PATCH v5 4/9] contrib/plugins/uftrace: implement tracing Pierrick Bouvier
2025-08-08 9:11 ` Manos Pitsidianakis
2025-08-08 16:38 ` Pierrick Bouvier
2025-08-08 18:03 ` Pierrick Bouvier
2025-08-08 18:13 ` Manos Pitsidianakis
2025-08-08 18:23 ` Pierrick Bouvier
2025-08-08 18:29 ` Manos Pitsidianakis
2025-08-08 18:24 ` Pierrick Bouvier
2025-08-08 2:06 ` [PATCH v5 5/9] contrib/plugins/uftrace: implement privilege level tracing Pierrick Bouvier
2025-08-08 9:26 ` Manos Pitsidianakis
2025-08-08 16:41 ` Pierrick Bouvier
2025-08-08 2:06 ` [PATCH v5 6/9] contrib/plugins/uftrace: generate additional files for uftrace Pierrick Bouvier
2025-08-08 9:37 ` Manos Pitsidianakis
2025-08-08 16:42 ` Pierrick Bouvier
2025-08-08 2:07 ` [PATCH v5 7/9] contrib/plugins/uftrace: implement x64 support Pierrick Bouvier
2025-08-08 9:42 ` Manos Pitsidianakis [this message]
2025-08-08 16:52 ` Pierrick Bouvier
2025-08-08 2:07 ` [PATCH v5 8/9] contrib/plugins/uftrace_symbols.py Pierrick Bouvier
2025-08-08 2:07 ` [PATCH v5 9/9] contrib/plugins/uftrace: add documentation Pierrick Bouvier
2025-08-08 9:46 ` Manos Pitsidianakis
2025-08-08 16:59 ` Pierrick Bouvier
2025-08-08 20:45 ` [PATCH v5 0/9] contrib/plugins: uftrace Pierrick Bouvier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=t0o5pl.3rum11rfv1tyj@linaro.org \
--to=manos.pitsidianakis@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=erdnaxe@crans.org \
--cc=gustavo.romero@linaro.org \
--cc=ma.mandourr@gmail.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=rowanbhart@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.