ANDROID: KVM: arm64: pkvm_module_ops documentation
This structure is at the heart of the module support for pKVM. Add a description to help anyone trying to create a module. Bug: 312200309 Change-Id: Ie1d9043a6a94d15dd8ef25c6f0f8d442da26bc1f Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
This commit is contained in:
parent
c331f5b7af
commit
af85ead8ce
1 changed files with 101 additions and 0 deletions
|
|
@ -16,6 +16,107 @@ enum pkvm_psci_notification {
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_MODULES
|
#ifdef CONFIG_MODULES
|
||||||
|
/**
|
||||||
|
* struct pkvm_module_ops - pKVM modules callbacks
|
||||||
|
* @create_private_mapping: Map a memory region into the hypervisor private
|
||||||
|
* range. @haddr returns the virtual address where
|
||||||
|
* the mapping starts. It can't be unmapped. Host
|
||||||
|
* access permissions are unaffected.
|
||||||
|
* @alloc_module_va: Reserve a range of VA space in the hypervisor
|
||||||
|
* private range. This is handy for modules that
|
||||||
|
* need to map plugin code in a similar fashion to
|
||||||
|
* how pKVM maps module code. That space could also
|
||||||
|
* be used to map memory temporarily, when the
|
||||||
|
* fixmap granularity (PAGE_SIZE) is too small.
|
||||||
|
* @map_module_page: Used in conjunction with @alloc_module_va. When
|
||||||
|
* @is_protected is not set, the page is also
|
||||||
|
* unmapped from the host stage-2.
|
||||||
|
* @register_serial_driver: Register a driver for a serial interface. The
|
||||||
|
* framework only needs a single callback
|
||||||
|
* @hyp_putc_cb which is expected to print a single
|
||||||
|
* character.
|
||||||
|
* @puts: If a serial interface is registered, print a
|
||||||
|
* string, else does nothing.
|
||||||
|
* @putx64: If a serial interface is registered, print a
|
||||||
|
* 64-bit number, else does nothing.
|
||||||
|
* @fixmap_map: Map a page in the per-CPU hypervisor fixmap.
|
||||||
|
* This is intended to be used for temporary
|
||||||
|
* mappings in the hypervisor VA space.
|
||||||
|
* @fixmap_unmap must be called between each
|
||||||
|
* mapping to do cache maintenance and ensure the
|
||||||
|
* new mapping is visible.
|
||||||
|
* @fixmap_unmap: Unmap a page from the hypervisor fixmap. This
|
||||||
|
* call is required between each @fixmap_map().
|
||||||
|
* @linear_map_early: Map a large portion of memory into the
|
||||||
|
* hypervisor linear VA space. This is intended to
|
||||||
|
* be used only for module bootstrap and must be
|
||||||
|
* unmapped before the host is deprivilged.
|
||||||
|
* @linear_unmap_early: See @linear_map_early.
|
||||||
|
* @flush_dcache_to_poc: Clean the data cache to the point of coherency.
|
||||||
|
* This is not a requirement for any other of the
|
||||||
|
* pkvm_module_ops callbacks.
|
||||||
|
* @update_hcr_el2: Modify the running value of HCR_EL2. pKVM will
|
||||||
|
* save/restore the new value across power
|
||||||
|
* management transitions.
|
||||||
|
* @update_hfgwtr_el2: Modify the running value of HFGWTR_EL2. pKVM
|
||||||
|
* will save/restore the new value across power
|
||||||
|
* management transitions.
|
||||||
|
* @register_host_perm_fault_handler:
|
||||||
|
* @cb is called whenever the host generates an
|
||||||
|
* abort with the fault status code Permission
|
||||||
|
* Fault. Returning -EPERM lets pKVM handle the
|
||||||
|
* abort. This is useful when a module changes the
|
||||||
|
* host stage-2 permissions for certain pages.
|
||||||
|
* @host_stage2_mod_prot: Apply @prot to the page @pfn. This requires a
|
||||||
|
* permission fault handler to be registered (see
|
||||||
|
* @register_host_perm_fault_handler), otherwise
|
||||||
|
* pKVM will be unable to handle this fault and the
|
||||||
|
* CPU will be stuck in an infinite loop.
|
||||||
|
* @host_stage2_get_leaf: Query the host's stage2 page-table entry for
|
||||||
|
* the page @phys.
|
||||||
|
* @register_host_smc_handler: @cb is called whenever the host issues an SMC
|
||||||
|
* pKVM couldn't handle. If @cb returns false, the
|
||||||
|
* SMC will be forwarded to EL3.
|
||||||
|
* @register_default_trap_handler:
|
||||||
|
* @cb is called whenever EL2 traps EL1 and pKVM
|
||||||
|
* has not handled it. If @cb returns false, the
|
||||||
|
* hypervisor will panic. This trap handler must be
|
||||||
|
* registered whenever changes are made to HCR
|
||||||
|
* (@update_hcr_el2) or HFGWTR
|
||||||
|
* (@update_hfgwtr_el2).
|
||||||
|
* @register_illegal_abt_notifier:
|
||||||
|
* To notify the module of a pending illegal abort
|
||||||
|
* from the host. On @cb return, the abort will be
|
||||||
|
* injected back into the host.
|
||||||
|
* @register_psci_notifier: To notify the module of a pending PSCI event.
|
||||||
|
* @register_hyp_panic_notifier:
|
||||||
|
* To notify the module of a pending hypervisor
|
||||||
|
* panic. On return from @cb, the panic will occur.
|
||||||
|
* @host_donate_hyp: The page @pfn is unmapped from the host and
|
||||||
|
* full control is given to the hypervisor.
|
||||||
|
* @hyp_donate_host: The page @pfn whom control has previously been
|
||||||
|
* given to the hypervisor (@host_donate_hyp) is
|
||||||
|
* given back to the host.
|
||||||
|
* @host_share_hyp: The page @pfn will be shared between the host
|
||||||
|
* and the hypervisor. Must be followed by
|
||||||
|
* @pin_shared_mem.
|
||||||
|
* @host_unshare_hyp: The page @pfn will be unshared and unmapped from
|
||||||
|
* the hypervisor. Must be called after
|
||||||
|
* @unpin_shared_mem.
|
||||||
|
* @pin_shared_mem: After @host_share_hyp, the newly shared page is
|
||||||
|
* still owned by the host. @pin_shared_mem will
|
||||||
|
* prevent the host from reclaiming that page until
|
||||||
|
* the hypervisor releases it (@unpin_shared_mem)
|
||||||
|
* @unpin_shared_mem: Enable the host to reclaim the shared memory
|
||||||
|
* (@host_unshare_hyp).
|
||||||
|
* @memcpy: Same as kernel memcpy, but use hypervisor VAs.
|
||||||
|
* @memset: Same as kernel memset, but use a hypervisor VA.
|
||||||
|
* @hyp_pa: Return the physical address for a hypervisor
|
||||||
|
* virtual address in the linear range.
|
||||||
|
* @hyp_va: Convert a physical address into a virtual one.
|
||||||
|
* @kern_hyp_va: Convert a kernel virtual address into an
|
||||||
|
* hypervisor virtual one.
|
||||||
|
*/
|
||||||
struct pkvm_module_ops {
|
struct pkvm_module_ops {
|
||||||
int (*create_private_mapping)(phys_addr_t phys, size_t size,
|
int (*create_private_mapping)(phys_addr_t phys, size_t size,
|
||||||
enum kvm_pgtable_prot prot,
|
enum kvm_pgtable_prot prot,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue