On 4/16/24 13:03, Peter Maydell wrote:
On Tue, 16 Apr 2024 at 17:53, Don Porter <por...@cs.unc.edu> wrote:
There is still a lot I am learning about the code base, but it seems
that qemu_get_guest_memory_mapping() does most of what one would need.
It currently only returns the "leaves" of the page table tree in a list.

What if I extend this function with an optional argument to either
1) return the interior nodes of the page table in additional lists (and
then parse+print in the monitor code), or
2) inline the monitor printing in the arch-specific hook, and pass a
flag to get_guest_memory_mapping() that turns on/off the statements that
pretty print the page tables?

It looks like most CPUs implement this function as part of checkpointing.
As far as I can see only x86 implements the get_memory_mapping
function, so once again somebody has added some bit of
functionality that does a walk of the page tables that is
x86 only and that shares no code with any of the other
page table walking code :-(

My mistake - get_memory_mappings() is only implemented in x86.

In doing some searching of the code, many architectures implement mmu_translate() and get_physical_address() functions, but they are not standardized. I also see your larger point
about replicating page walking code in x86.

I imagine you have something in mind that abstracts things like the height of the radix tree,
entries per node, checking permissions, printing the contents, etc.

Perhaps I should start by trying to merge the x86 page walking code into one set of common helper functions, get more feedback (perhaps on a new patch thread?), and then consider
how to abstract across architectures after getting feedback on this?

In looking at x86 code, I see the following places where there is page table walking code to
potentially merge:

* target/i386/monitor.c - existing info commands

* target/i386/helper.c - get_phys_page_attrs_debug

* target/i386/arch_memory_mapping.c - implements get_memory_mapping

* tcg/sysemu/excp_helper.c: implements mmu_translate() and get_physical_address()

Thanks,

Don


Reply via email to