Since guest operating systems have read-only access to their page
tables, Xen must be involved when making any changes. The following
multi-purpose hypercall can be used to modify page-table entries,
update the machine-to-physical mapping table, flush the TLB, install
a new page-table base pointer, and more.
mmu_update(mmu_update_t *req, int count, int *success_count)
Update the page table for the domain; a set of count updates are
submitted for processing in a batch, with success_count being
updated to report the number of successful updates.
Each element of req[] contains a pointer (address) and value;
the least significant 2-bits of the pointer are used to distinguish
the type of update requested as follows:
- MMU_NORMAL_PT_UPDATE:
- update a page directory entry or
page table entry to the associated value; Xen will check that the
update is safe, as described in Chapter 3.
- MMU_MACHPHYS_UPDATE:
- update an entry in the
machine-to-physical table. The calling domain must own the machine
page in question (or be privileged).
Explicitly updating batches of page table entries is extremely
efficient, but can require a number of alterations to the guest
OS. Using the writable page table mode (Chapter 3) is
recommended for new OS ports.
Regardless of which page table update mode is being used, however,
there are some occasions (notably handling a demand page fault) where
a guest OS will wish to modify exactly one PTE rather than a
batch, and where that PTE is mapped into the current address space.
This is catered for by the following:
update_va_mapping(unsigned long va, uint64_t val,
unsigned long flags)
Update the currently installed PTE that maps virtual address va
to new value val. As with mmu_update(), Xen checks the
modification is safe before applying it. The flags determine
which kind of TLB flush, if any, should follow the update.
Finally, sufficiently privileged domains may occasionally wish to manipulate
the pages of others:
update_va_mapping(unsigned long va, uint64_t val,
unsigned long flags, domid_t domid)
Identical to update_va_mapping() save that the pages being
mapped must belong to the domain domid.
An additional MMU hypercall provides an ``extended command''
interface. This provides additional functionality beyond the basic
table updating commands:
mmuext_op(struct mmuext_op *op, int count, int *success_count, domid_t domid)
This hypercall is used to perform additional MMU operations. These
include updating cr3 (or just re-installing it for a TLB flush),
requesting various kinds of TLB flush, flushing the cache, installing
a new LDT, or pinning & unpinning page-table pages (to ensure their
reference count doesn't drop to zero which would require a
revalidation of all entries). Some of the operations available are
restricted to domains with sufficient system privileges.
It is also possible for privileged domains to reassign page ownership
via an extended MMU operation, although grant tables are used instead
of this where possible; see Section A.8.
Finally, a hypercall interface is exposed to activate and deactivate
various optional facilities provided by Xen for memory management.
vm_assist(unsigned int cmd, unsigned int type)
Toggle various memory management modes (in particular writable page
tables).