Thanks for your quick response.

On Mon, Mar 30, 2020 at 9:15 AM Alex Bennée <alex.ben...@linaro.org> wrote:

>
> Lukas Straub <lukasstra...@web.de> writes:
>
> >> My question is, how do I access the guest memory and registers from the
> >> plugin callback function? The API seems to indicate that it is possible,
> >> since the callback registering requires you to say if you will access
> them,
> >> and if it's RW or just read.
>
> Currently we document what plugins can do in docs/devel/tcg-plugins.rst:
>
>   TCG plugins are unable to change the system state only monitor it
>   passively. However they can do this down to an individual instruction
>   granularity including potentially subscribing to all load and store
>   operations.
>
> This was a conscious decision to avoid plugins being used as an end-run
> around the GPL to implement proprietary out-of-tree extensions.
>
> That is not to say we might relax the rules in the future - it was a
> topic of discussion at the maintainers summit and we wanted to document
> some guidelines around interfacing with QEMU so people didn't get the
> wrong idea about what these APIs provide (c.f. multi-process qemu and
> vhost-user which could also be abused in similar ways).
>

I understand restricting the API so that the system state cannot be
changed, only inspected.  I should have been more specific in my question.
I am attempting to create a plugin that tracks all memory accesses, so I
can emulate cache behavior.  The reason I would like to read the registers,
is because many load/store instructions depend on register values, which I
can only be sure of at run-time.
Some of the concepts you mentioned I am not very familiar with; I am simply
emulating an ARM A9 processor in bare-metal mode, to give you a point of
reference of my use case.


> Indeed Emilio's original tree did contain these more invasive hooks and
> while we deliberate upstream it will hopefully not be as hard to
> maintain a light out-of-tree fork should you need such functionality now.
>

Could you please point me towards this tree?  I haven't run across it yet
in my investigating of all of this.


> >> Are there any examples of using this part of the API? I realize this is
> a
> >> very new part of Qemu functionality.
>
> So far the examples represent the totality of the API that has been
> exercised and I'm keen we add more as new extensions to the API are
> added. As to the specific question about accessing register values that
> is exactly down to the newness of the API.
>
> Register access is a tricky problem because of the fact that QEMU
> supports so many guest architectures. I wasn't keen on slapping in a
> functional but ugly API that hard-coded values like gdb register ids so
> I left it out for the time being. I'd happily accept patches to add that
> functionality assuming it meets the projects quality and taste
> guidelines.
>
> Some approaches we could take include:
>
>   - hook into tcg_global_*_new and allow plugin to introspect registers
>   - hook into gdbstub in some way
>
> The first approach elides over the fact that a lot of registers aren't
> actually known to the TCG - pretty much all vector registers tend to be
> loaded into anonymous TCG temps as we go. Maybe this could just be fixed
> by just providing a few more registrations functions at the start even
> if the TCG itself wouldn't use that knowledge.
>
> The gdbstub provides a lot more visibility of register state and for
> some architectures this can be quite comprehensive - for example in
> system mode you can access pretty much every ARM co-processor register.
> However the gdb interface is a little clunky as there are a lot of magic
> register id numbers and the canonical way to enumerate this is to chew
> through a bunch of XML that each target generates (see
> gdb_register_coprocessor). I'm not keen on exposing that pile of XML via
> the register interface. Maybe there is scope to improve our internal
> APIs so the enumeration of registers can be handled by helpers that
> record mappings and ids and generate the XML for the gdbstub centrally?
>
> There may be other approaches we could take and I'm open to suggestions.
>

I'd be happy to look into ways to implement this functionality.  However, I
just started using Qemu this year, so these things sound like they would
have a steep learning curve for me.
The gdbstub approach seems like it would provide the most introspection
ability.  What would you suggest as a starting point for looking into this?
All of this being said, if you think my project is too complicated, to
implement a cache emulator with TCG plugins, then I could always try just
hacking together some custom helper functions.


> --
> Alex Bennée
>

Thanks

Reply via email to