Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions arch/arm64/core/xen/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,25 @@ config XEN_INTERFACE_VERSION
help
Xen interface version to use. This is the version of the
interface that Zephyr will use to communicate with the hypervisor.

config XEN_DOMCTL_INTERFACE_VERSION
hex "Xen Domctl interface version"
default 0x17
range 0x15 0x17
depends on XEN
help
Xen Domctl interface version to use. This is the version of the
domctl interface that Zephyr will use to communicate with
the hypervisor. The default value is the latest version supported
by the kernel.

config XEN_SYSCTL_INTERFACE_VERSION
hex "Xen Sysctl interface version"
default 0x15
range 0x15 0x15
depends on XEN
help
Xen Sysctl interface version to use. This is the version of the
domctl interface that Zephyr will use to communicate with
the hypervisor. The default value is the latest version supported
by the kernel.
4 changes: 3 additions & 1 deletion arch/arm64/core/xen/hypercall.S
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: Apache-2.0 */
/*
* Copyright (c) 2021-2023 EPAM Systems
* Copyright (c) 2021-2025 EPAM Systems
*/

#include <zephyr/toolchain.h>
Expand All @@ -23,7 +23,9 @@ HYPERCALL(sched_op);
HYPERCALL(event_channel_op);
HYPERCALL(hvm_op);
HYPERCALL(memory_op);
HYPERCALL(xen_version);

#ifdef CONFIG_XEN_DOM0
HYPERCALL(domctl);
HYPERCALL(sysctl);
#endif
3 changes: 2 additions & 1 deletion drivers/xen/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2021-2023 EPAM Systems
# Copyright (c) 2021-2025 EPAM Systems

zephyr_sources(hvm.c)
zephyr_sources(events.c)
zephyr_sources_ifdef(CONFIG_XEN_GRANT_TABLE gnttab.c)
zephyr_sources(memory.c)
zephyr_sources(version.c)

add_subdirectory_ifdef(CONFIG_XEN_DOM0 dom0)
3 changes: 2 additions & 1 deletion drivers/xen/dom0/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2023 EPAM Systems
# Copyright (c) 2023-2025 EPAM Systems

zephyr_sources(domctl.c)
zephyr_sources(sysctl.c)
55 changes: 43 additions & 12 deletions drivers/xen/dom0/domctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

static int do_domctl(xen_domctl_t *domctl)
{
domctl->interface_version = XEN_DOMCTL_INTERFACE_VERSION;
domctl->interface_version = CONFIG_XEN_DOMCTL_INTERFACE_VERSION;
return HYPERVISOR_domctl(domctl);
}

Expand Down Expand Up @@ -105,7 +105,8 @@ int xen_domctl_getdomaininfo(int domid, xen_domctl_getdomaininfo_t *dom_info)
return 0;
}

int xen_domctl_get_paging_mempool_size(int domid, uint64_t *size_mb)
#if CONFIG_XEN_DOMCTL_INTERFACE_VERSION >= 0x00000016
int xen_domctl_get_paging_mempool_size(int domid, uint64_t *size)
{
int rc;
xen_domctl_t domctl = {
Expand All @@ -118,21 +119,22 @@ int xen_domctl_get_paging_mempool_size(int domid, uint64_t *size_mb)
return rc;
}

*size_mb = domctl.u.paging_mempool.size;
*size = domctl.u.paging_mempool.size;

return 0;
}

int xen_domctl_set_paging_mempool_size(int domid, uint64_t size_mb)
int xen_domctl_set_paging_mempool_size(int domid, uint64_t size)
{
xen_domctl_t domctl = {
.cmd = XEN_DOMCTL_set_paging_mempool_size,
.domain = domid,
.u.paging_mempool.size = size_mb,
.u.paging_mempool.size = size,
};

return do_domctl(&domctl);
}
#endif

int xen_domctl_max_mem(int domid, uint64_t max_memkb)
{
Expand Down Expand Up @@ -273,15 +275,23 @@ int xen_domctl_max_vcpus(int domid, int max_vcpus)
return do_domctl(&domctl);
}

int xen_domctl_createdomain(int domid, struct xen_domctl_createdomain *config)
int xen_domctl_createdomain(int *domid, struct xen_domctl_createdomain *config)
{
xen_domctl_t domctl = {
.cmd = XEN_DOMCTL_createdomain,
.domain = domid,
.u.createdomain = *config,
};
int ret;
xen_domctl_t domctl;

return do_domctl(&domctl);
if (!domid || !config) {
return -EINVAL;
}

domctl.cmd = XEN_DOMCTL_createdomain,
domctl.domain = *domid,
domctl.u.createdomain = *config,

ret = do_domctl(&domctl);
*domid = domctl.domain;

return ret;
}

int xen_domctl_destroydomain(int domid)
Expand All @@ -304,3 +314,24 @@ int xen_domctl_cacheflush(int domid, struct xen_domctl_cacheflush *cacheflush)

return do_domctl(&domctl);
}

int xen_domctl_getvcpu(int domid, uint32_t vcpu, struct xen_domctl_getvcpuinfo *info)
{
int ret;
xen_domctl_t domctl = {
.cmd = XEN_DOMCTL_getvcpuinfo,
.domain = domid,
.u.getvcpuinfo.vcpu = vcpu,
};

if (!info) {
return -EINVAL;
}

ret = do_domctl(&domctl);
if (!ret) {
*info = domctl.u.getvcpuinfo;
}

return ret;
}
59 changes: 59 additions & 0 deletions drivers/xen/dom0/sysctl.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright (c) 2025 EPAM Systems
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/arch/arm64/hypercall.h>
#include <zephyr/xen/dom0/sysctl.h>
#include <zephyr/xen/generic.h>
#include <zephyr/xen/public/xen.h>

static int do_sysctl(xen_sysctl_t *sysctl)
{
sysctl->interface_version = CONFIG_XEN_SYSCTL_INTERFACE_VERSION;
return HYPERVISOR_sysctl(sysctl);
}

int xen_sysctl_physinfo(struct xen_sysctl_physinfo *info)
{
int ret;
xen_sysctl_t sysctl = {
.cmd = XEN_SYSCTL_physinfo,
};

if (!info) {
return -EINVAL;
}

ret = do_sysctl(&sysctl);
if (ret < 0) {
return ret;
}
*info = sysctl.u.physinfo;

return ret;
}

int xen_sysctl_getdomaininfo(struct xen_domctl_getdomaininfo *domaininfo,
uint16_t first, uint16_t num)
{
int ret;
xen_sysctl_t sysctl = {
.cmd = XEN_SYSCTL_getdomaininfolist,
.u.getdomaininfolist.first_domain = first,
.u.getdomaininfolist.max_domains = num,
};

if (!domaininfo || !num) {
return -EINVAL;
}
set_xen_guest_handle(sysctl.u.getdomaininfolist.buffer, domaininfo);

ret = do_sysctl(&sysctl);
if (ret < 0) {
return ret;
}

return sysctl.u.getdomaininfolist.num_domains;
}
26 changes: 26 additions & 0 deletions drivers/xen/version.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2025 EPAM Systems
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/arch/arm64/hypercall.h>
#include <zephyr/xen/generic.h>
#include <zephyr/xen/public/version.h>
#include <zephyr/xen/public/xen.h>
#include <string.h>

int xen_version(void)
{
return HYPERVISOR_xen_version(XENVER_version, NULL);
}

int xen_version_extraversion(char *extra, int len)
{
if (!extra || len < XEN_EXTRAVERSION_LEN) {
return -EINVAL;
}

memset(extra, 0, len);
return HYPERVISOR_xen_version(XENVER_extraversion, extra);
}
4 changes: 3 additions & 1 deletion include/zephyr/arch/arm64/hypercall.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: Apache-2.0 */
/*
* Copyright (c) 2021-2023 EPAM Systems
* Copyright (c) 2021-2025 EPAM Systems
*/

#ifndef ZEPHYR_INCLUDE_ARCH_ARM64_HYPERCALL_H_
Expand All @@ -13,9 +13,11 @@ int HYPERVISOR_event_channel_op(int op, void *param);
int HYPERVISOR_hvm_op(int op, void *param);
int HYPERVISOR_memory_op(int op, void *param);
int HYPERVISOR_grant_table_op(int op, void *uop, unsigned int count);
int HYPERVISOR_xen_version(int op, void *param);

#ifdef CONFIG_XEN_DOM0
int HYPERVISOR_domctl(void *param);
int HYPERVISOR_sysctl(void *param);
#endif

#endif /* ZEPHYR_INCLUDE_ARCH_ARM64_HYPERCALL_H_ */
Loading
Loading