xen: add helper functions for Xen domain memory management

Add wrapper functions for Xen memory managment hypercall. They can be
used for unprivilaged Zephyr guest initialization and for domain
management, when Zephyr is used as Xen Domain 0.

Signed-off-by: Dmytro Firsov <dmytro_firsov@epam.com>
This commit is contained in:
Dmytro Firsov 2023-04-27 12:35:25 +03:00 committed by Fabio Baltieri
commit 3942e3ccff
3 changed files with 135 additions and 0 deletions

View file

@ -4,5 +4,6 @@
zephyr_sources(hvm.c)
zephyr_sources(events.c)
zephyr_sources_ifdef(CONFIG_XEN_GRANT_TABLE gnttab.c)
zephyr_sources(memory.c)
add_subdirectory_ifdef(CONFIG_XEN_DOM0 dom0)

68
drivers/xen/memory.c Normal file
View file

@ -0,0 +1,68 @@
/* SPDX-License-Identifier: Apache-2.0 */
/*
* Copyright (c) 2023 EPAM Systems
*/
#include <zephyr/arch/arm64/hypercall.h>
#include <zephyr/xen/generic.h>
#include <zephyr/xen/public/memory.h>
#include <zephyr/xen/public/xen.h>
#include <zephyr/kernel.h>
int xendom_add_to_physmap(int domid, unsigned long idx,
unsigned int space, xen_pfn_t gpfn)
{
struct xen_add_to_physmap xatp = {
.domid = domid,
.idx = idx,
.space = space,
.gpfn = gpfn,
};
return HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
}
int xendom_add_to_physmap_batch(int domid, int foreign_domid,
unsigned int space, unsigned int size,
xen_ulong_t *idxs, xen_pfn_t *gpfns, int *errs)
{
struct xen_add_to_physmap_batch xatpb = {
.domid = domid,
.u.foreign_domid = foreign_domid,
.space = space,
.size = size,
};
set_xen_guest_handle(xatpb.gpfns, gpfns);
set_xen_guest_handle(xatpb.idxs, idxs);
set_xen_guest_handle(xatpb.errs, errs);
return HYPERVISOR_memory_op(XENMEM_add_to_physmap_batch, &xatpb);
}
int xendom_remove_from_physmap(int domid, xen_pfn_t gpfn)
{
struct xen_remove_from_physmap xrfp = {
.domid = domid,
.gpfn = gpfn,
};
return HYPERVISOR_memory_op(XENMEM_remove_from_physmap, &xrfp);
}
int xendom_populate_physmap(int domid, unsigned int extent_order,
unsigned int nr_extents, unsigned int mem_flags,
xen_pfn_t *extent_start)
{
struct xen_memory_reservation reservation = {
.domid = domid,
.extent_order = extent_order,
.nr_extents = nr_extents,
.mem_flags = mem_flags,
};
set_xen_guest_handle(reservation.extent_start, extent_start);
return HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation);
}