[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 10/17] xen/riscv: implement guest_physmap_add_entry() for mapping GFNs to MFNs
Introduce an initial implementation of guest_physmap_add_entry() on RISC-V by adding a basic framework to insert guest physical memory mappings. This allows mapping a range of GFNs to MFNs using a placeholder p2m_set_entry() function, which currently returns -EOPNOTSUPP. Changes included: - Promoting guest_physmap_add_entry() from a stub to a functional interface calling a new p2m_insert_mapping() helper. - Adding map_regions_p2mt() for generic mapping purposes. - Introducing p2m_insert_mapping() and a skeleton for p2m_set_entry() to prepare for future support of actual page table manipulation. - Enclosing the actual mapping logic within p2m_write_lock() / p2m_write_unlock() to ensure safe concurrent updates to the P2M. Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> --- Changes in v2: - This changes were part of "xen/riscv: implement p2m mapping functionality". No additional signigicant changes were done. --- xen/arch/riscv/include/asm/p2m.h | 12 ++++------ xen/arch/riscv/p2m.c | 41 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/xen/arch/riscv/include/asm/p2m.h b/xen/arch/riscv/include/asm/p2m.h index 0c05b58992..af2025b9fd 100644 --- a/xen/arch/riscv/include/asm/p2m.h +++ b/xen/arch/riscv/include/asm/p2m.h @@ -118,14 +118,10 @@ static inline int guest_physmap_mark_populate_on_demand(struct domain *d, return -EOPNOTSUPP; } -static inline int guest_physmap_add_entry(struct domain *d, - gfn_t gfn, mfn_t mfn, - unsigned long page_order, - p2m_type_t t) -{ - BUG_ON("unimplemented"); - return -EINVAL; -} +int guest_physmap_add_entry(struct domain *d, + gfn_t gfn, mfn_t mfn, + unsigned long page_order, + p2m_type_t t); /* Untyped version for RAM only, for compatibility */ static inline int __must_check diff --git a/xen/arch/riscv/p2m.c b/xen/arch/riscv/p2m.c index 2419a61d8c..cea37c8bda 100644 --- a/xen/arch/riscv/p2m.c +++ b/xen/arch/riscv/p2m.c @@ -324,3 +324,44 @@ int p2m_set_allocation(struct domain *d, unsigned long pages, bool *preempted) return 0; } + +static int p2m_set_entry(struct p2m_domain *p2m, + gfn_t sgfn, + unsigned long nr, + mfn_t smfn, + p2m_type_t t, + p2m_access_t a) +{ + return -EOPNOTSUPP; +} + +static int p2m_insert_mapping(struct domain *d, gfn_t start_gfn, + unsigned long nr, mfn_t mfn, p2m_type_t t) +{ + struct p2m_domain *p2m = p2m_get_hostp2m(d); + int rc; + + p2m_write_lock(p2m); + rc = p2m_set_entry(p2m, start_gfn, nr, mfn, t, p2m->default_access); + p2m_write_unlock(p2m); + + return rc; +} + +int map_regions_p2mt(struct domain *d, + gfn_t gfn, + unsigned long nr, + mfn_t mfn, + p2m_type_t p2mt) +{ + return p2m_insert_mapping(d, gfn, nr, mfn, p2mt); +} + +int guest_physmap_add_entry(struct domain *d, + gfn_t gfn, + mfn_t mfn, + unsigned long page_order, + p2m_type_t t) +{ + return p2m_insert_mapping(d, gfn, (1 << page_order), mfn, t); +} -- 2.49.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |