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:
parent
74b271bc2a
commit
3942e3ccff
3 changed files with 135 additions and 0 deletions
|
@ -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
68
drivers/xen/memory.c
Normal 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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue