From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
To: Julian Ganz <nenut@skiff.uberspace.de>,
Julian Ganz <neither@nut.email>,
qemu-devel@nongnu.org
Subject: Re: [RFC PATCH v2 0/7] tcg-plugins: add hooks for interrupts, exceptions and traps
Date: Tue, 22 Oct 2024 14:15:16 -0700 [thread overview]
Message-ID: <2419ec6e-3d4e-4d6d-a738-7615c99ed60c@linaro.org> (raw)
In-Reply-To: <ab29d100610abcc59ce2305a1ace1ac0b53340a3@skiff.uberspace.de>
On 10/22/24 01:21, Julian Ganz wrote:
> Hi, Pierrick,
>
> October 21, 2024 at 11:59 PM, "Pierrick Bouvier" wrote:
>> On 10/21/24 14:02, Julian Ganz wrote:
>>> The motivation for this API is a plugin that simulates a RISC-V tracing
>>> unit (and produces a trace). For that we actually also needed to
>>> track the "regular" control flow, i.e. find out whether a branch was
>>> taken or where a jump went. That wasn't hard, especially considering
>>> that the TCG API already gives you (more or less) basic blocks. Still,
>>> we ended up tracing every instruction because that made some of the logic
>>> much simpler and easier to reason about.
>>> We realized that we need a trap API because they:
>>> * can occur at any time/point of execusion
>>> * usually come with additional effects such as mode changes.
>>>
>> Thanks for sharing your insights.
>> I think there is definitely value in what you offer, and I'm trying to think how we could extend it in the future easily, without having another callback when a new event appear. In my experience on plugins, the least callbacks we have, and the simpler they are, the better it is.
>>
>> Maybe we could have a single API like:
>>
>> enum qemu_plugin_cf_event_type {
>> QEMU_PLUGIN_CF_INTERRUPT;
>> QEMU_PLUGIN_CF_TRAP;
>> QEMU_PLUGIN_CF_SEMIHOSTING;
>> };
>
> I have considered such an enum, as an input for the callback, as a
> parameter of the registration function, and both. Of course, if you were
> to add a selection parameter for the registration function, you likely
> want OR-able flags.
>
> An additional input for the callback type would obviously require a new
> function type just for that callback. Since the callbacks are somewhat
> similar to the VCPU init, exit, resume, ... ones it felt appropriate
> to use the same function type for all of them.
>
I tend to disagree on that. IMHO, it's better to reduce number of API
entries instead of callback types.
It's easy for a user to understand how to implement a given callback,
while it's hard to understand which API you need for which thing.
For the syscall cbs, we already have a specific callback. So why not here?
I tend to see init/exit/resume events as different because you can't get
useful information attached, except the cpu id. But for control flow
related stuff, you can be interested in having more.
I understand you're focused on those "events" for now, but while digging
into this, it seems like the initial need was to track the control flow.
So I would like to push more in this direction, and offer a more
extendable solution. Do you think the end goal for a plugin using this
information may be different? (beyond a plugin counting
trap/interrupts/semihosting event).
> As for the registration, it may make the registration a bit more
> convenient and maybe keep the API clutter a bit lower, but not by that
> much.
>
It's ok for the user. But I think it's more complicated to extend, when
we'll want to introduce control flow API in the future. Do we want 5 or
6 different callbacks when people want to track fully control flow from
a plugin?
>
>> /* Sum type, a.k.a. "Rust-like" enum */
>> typedef struct {
>> enum qemu_plugin_cf_event_type ev;
>> union {
>> data_for_interrupt interrupt;
>> data_for_trap trap;
>> data_for_semihosting semihosting;
>> } qemu_plugin_cf_event;
>> /* data_for_... could contain things like from/to addresses, interrupt id, ... */
>
> I don't think this is a good idea.
>
> Traps are just too diverse, imo there is too little overlap between
> different architectures, with the sole exception maybe being the PC
> prior to the trap. "Interrupt id" sounds like a reasonably common
> concept, but then you would need to define a mapping for each and every
> architecture. What integer type do you use? In RISC-V, for example,
> exceptions and interrupt "ids" are differentiated via the most
> significant bit. Dou keep that or do you zero it? And then there's
> ring/privilage mode, cause (sometimes for each mode), ...
>
I didn't want to open the per architecture pandora box :).
I don't think the plugin API itself should deal with per architecture
details like meaning of a given id. I was just thinking to push this
"raw" information to the plugin, that may/may not use architecture
specific knowledge to do its work. We already have plugins that have
similar per architecture knowledge (contrib/plugins/howvec.c) and it's
ok in some specific cases.
But having something like from/to address seems useful to start. Even if
we don't provide it for all events yet, it's ok.
> It would also complicate call sites for hooks in target code. You'd
> either need awkwardly long function signitures or setup code for that
> struct. Both are things you don't want, as a hook call site should
> never distract from the actual logic surrounding them. You could
> probably have something reasonable in Rust, using a builder/command
> pattern. But in C this would require too much boiler plate code than
> I'd be comfortable with.
>
We can have one "builder" function per data type, with fixed parameters
(no varargs), it's reasonable and would scale well with new entries/data
information.
> Regards,
> Julian
next prev parent reply other threads:[~2024-10-22 21:15 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-21 12:24 [PATCH] tcg-plugins: add a hook for interrupts, exceptions and traps Julian Ganz
2023-10-23 13:08 ` Alex Bennée
2023-10-23 18:45 ` Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 0/7] tcg-plugins: add hooks " Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 1/7] plugins: add API for registering trap related callbacks Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 2/7] plugins: add hooks for new " Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 3/7] contrib/plugins: add plugin showcasing new trap related API Julian Ganz
2024-10-21 18:06 ` Pierrick Bouvier
2024-10-21 18:07 ` Pierrick Bouvier
2024-10-21 20:22 ` Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 4/7] target/arm: call plugin trap callbacks Julian Ganz
2024-10-21 12:58 ` Peter Maydell
2024-10-21 16:25 ` Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 5/7] target/avr: " Julian Ganz
2024-10-19 17:29 ` Michael Rolnik
2024-10-19 16:39 ` [RFC PATCH v2 6/7] target/riscv: " Julian Ganz
2024-10-19 16:39 ` [RFC PATCH v2 7/7] target/sparc: " Julian Ganz
2024-10-20 19:37 ` [RFC PATCH v2 0/7] tcg-plugins: add hooks for interrupts, exceptions and traps Alex Bennée
2024-10-21 18:00 ` Pierrick Bouvier
2024-10-21 18:47 ` Alex Bennée
2024-10-21 20:45 ` Pierrick Bouvier
2024-10-21 21:02 ` Julian Ganz
2024-10-21 21:59 ` Pierrick Bouvier
2024-10-22 8:21 ` Julian Ganz
2024-10-22 8:58 ` Alex Bennée
2024-10-22 20:12 ` Julian Ganz
2024-10-22 21:15 ` Pierrick Bouvier [this message]
2024-10-23 12:56 ` Julian Ganz
2024-10-23 13:57 ` Alex Bennée
2024-10-23 15:21 ` Pierrick Bouvier
2024-10-23 15:16 ` Pierrick Bouvier
2024-10-23 16:12 ` Julian Ganz
2024-10-23 16:39 ` Pierrick Bouvier
2024-10-23 17:12 ` Julian Ganz
2024-10-23 17:53 ` 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=2419ec6e-3d4e-4d6d-a738-7615c99ed60c@linaro.org \
--to=pierrick.bouvier@linaro.org \
--cc=neither@nut.email \
--cc=nenut@skiff.uberspace.de \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).