mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools: add physinfo arch_capabilities handling for Arm
On Arm, the SVE vector length is encoded in arch_capabilities field of struct xen_sysctl_physinfo, make use of this field in the tools when building for arm. Create header arm-arch-capabilities.h to handle the arch_capabilities field of physinfo for Arm. Signed-off-by: Luca Fancellu <luca.fancellu@arm.com> Acked-by: George Dunlap <george.dunlap@citrix.com> Acked-by: Christian Lindig <christian.lindig@cloud.com> Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
1 parent
9392bf6a3a
commit
56a7aaa16b
13 files changed
+87
-21
No files matched your search
@@ -3506,6 +3506,7 @@ x.CapVmtrace = bool(xc.cap_vmtrace)
|
|||||||
x.CapVpmu = bool(xc.cap_vpmu)
|
x.CapVpmu = bool(xc.cap_vpmu)
|
||||||
x.CapGnttabV1 = bool(xc.cap_gnttab_v1)
|
x.CapGnttabV1 = bool(xc.cap_gnttab_v1)
|
||||||
x.CapGnttabV2 = bool(xc.cap_gnttab_v2)
|
x.CapGnttabV2 = bool(xc.cap_gnttab_v2)
|
||||||
|
x.ArchCapabilities = uint32(xc.arch_capabilities)
|
||||||
|
|
||||||
return nil}
|
return nil}
|
||||||
|
|
||||||
@@ -3540,6 +3541,7 @@ xc.cap_vmtrace = C.bool(x.CapVmtrace)
|
|||||||
xc.cap_vpmu = C.bool(x.CapVpmu)
|
xc.cap_vpmu = C.bool(x.CapVpmu)
|
||||||
xc.cap_gnttab_v1 = C.bool(x.CapGnttabV1)
|
xc.cap_gnttab_v1 = C.bool(x.CapGnttabV1)
|
||||||
xc.cap_gnttab_v2 = C.bool(x.CapGnttabV2)
|
xc.cap_gnttab_v2 = C.bool(x.CapGnttabV2)
|
||||||
|
xc.arch_capabilities = C.uint32_t(x.ArchCapabilities)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1079,6 +1079,7 @@ CapVmtrace bool
|
|||||||
CapVpmu bool
|
CapVpmu bool
|
||||||
CapGnttabV1 bool
|
CapGnttabV1 bool
|
||||||
CapGnttabV2 bool
|
CapGnttabV2 bool
|
||||||
|
ArchCapabilities uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
type Connectorinfo struct {
|
type Connectorinfo struct {
|
||||||
|
|||||||
@@ -525,6 +525,12 @@
|
|||||||
*/
|
*/
|
||||||
#define LIBXL_HAVE_PHYSINFO_CAP_GNTTAB 1
|
#define LIBXL_HAVE_PHYSINFO_CAP_GNTTAB 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LIBXL_HAVE_PHYSINFO_ARCH_CAPABILITIES indicates that libxl_physinfo has a
|
||||||
|
* arch_capabilities field.
|
||||||
|
*/
|
||||||
|
#define LIBXL_HAVE_PHYSINFO_ARCH_CAPABILITIES 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LIBXL_HAVE_MAX_GRANT_VERSION indicates libxl_domain_build_info has a
|
* LIBXL_HAVE_MAX_GRANT_VERSION indicates libxl_domain_build_info has a
|
||||||
* max_grant_version field for setting the max grant table version per
|
* max_grant_version field for setting the max grant table version per
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/* SPDX-License-Identifier: LGPL-2.1-only */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 ARM Ltd.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARM_ARCH_CAPABILITIES_H
|
||||||
|
#define ARM_ARCH_CAPABILITIES_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <xen/sysctl.h>
|
||||||
|
|
||||||
|
#include <xen-tools/common-macros.h>
|
||||||
|
|
||||||
|
static inline
|
||||||
|
unsigned int arch_capabilities_arm_sve(unsigned int arch_capabilities)
|
||||||
|
{
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
unsigned int sve_vl = MASK_EXTR(arch_capabilities,
|
||||||
|
XEN_SYSCTL_PHYSCAP_ARM_SVE_MASK);
|
||||||
|
|
||||||
|
/* Vector length is divided by 128 before storing it in arch_capabilities */
|
||||||
|
return sve_vl * 128U;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARM_ARCH_CAPABILITIES_H */
|
||||||
@@ -72,6 +72,8 @@
|
|||||||
#define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1))
|
#define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m)))
|
||||||
|
|
||||||
#ifndef __must_check
|
#ifndef __must_check
|
||||||
#define __must_check __attribute__((__warn_unused_result__))
|
#define __must_check __attribute__((__warn_unused_result__))
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -409,6 +409,7 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo)
|
|||||||
!!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_gnttab_v1);
|
!!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_gnttab_v1);
|
||||||
physinfo->cap_gnttab_v2 =
|
physinfo->cap_gnttab_v2 =
|
||||||
!!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_gnttab_v2);
|
!!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_gnttab_v2);
|
||||||
|
physinfo->arch_capabilities = xcphysinfo.arch_capabilities;
|
||||||
|
|
||||||
GC_FREE;
|
GC_FREE;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -132,7 +132,6 @@
|
|||||||
|
|
||||||
#define DIV_ROUNDUP(n, d) (((n) + (d) - 1) / (d))
|
#define DIV_ROUNDUP(n, d) (((n) + (d) - 1) / (d))
|
||||||
|
|
||||||
#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m)))
|
|
||||||
#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m))
|
#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m))
|
||||||
|
|
||||||
#define LIBXL__LOGGING_ENABLED
|
#define LIBXL__LOGGING_ENABLED
|
||||||
|
|||||||
@@ -1133,6 +1133,7 @@ libxl_physinfo = Struct("physinfo", [
|
|||||||
("cap_vpmu", bool),
|
("cap_vpmu", bool),
|
||||||
("cap_gnttab_v1", bool),
|
("cap_gnttab_v1", bool),
|
||||||
("cap_gnttab_v2", bool),
|
("cap_gnttab_v2", bool),
|
||||||
|
("arch_capabilities", uint32),
|
||||||
], dir=DIR_OUT)
|
], dir=DIR_OUT)
|
||||||
|
|
||||||
libxl_connectorinfo = Struct("connectorinfo", [
|
libxl_connectorinfo = Struct("connectorinfo", [
|
||||||
|
|||||||
@@ -128,12 +128,10 @@ type physinfo_cap_flag =
|
|||||||
| CAP_Gnttab_v1
|
| CAP_Gnttab_v1
|
||||||
| CAP_Gnttab_v2
|
| CAP_Gnttab_v2
|
||||||
|
|
||||||
type arm_physinfo_cap_flag
|
|
||||||
|
|
||||||
type x86_physinfo_cap_flag
|
type x86_physinfo_cap_flag
|
||||||
|
|
||||||
type arch_physinfo_cap_flags =
|
type arch_physinfo_cap_flags =
|
||||||
| ARM of arm_physinfo_cap_flag list
|
| ARM of int
|
||||||
| X86 of x86_physinfo_cap_flag list
|
| X86 of x86_physinfo_cap_flag list
|
||||||
|
|
||||||
type physinfo =
|
type physinfo =
|
||||||
|
|||||||
@@ -113,12 +113,10 @@ type physinfo_cap_flag =
|
|||||||
| CAP_Gnttab_v1
|
| CAP_Gnttab_v1
|
||||||
| CAP_Gnttab_v2
|
| CAP_Gnttab_v2
|
||||||
|
|
||||||
type arm_physinfo_cap_flag
|
|
||||||
|
|
||||||
type x86_physinfo_cap_flag
|
type x86_physinfo_cap_flag
|
||||||
|
|
||||||
type arch_physinfo_cap_flags =
|
type arch_physinfo_cap_flags =
|
||||||
| ARM of arm_physinfo_cap_flag list
|
| ARM of int
|
||||||
| X86 of x86_physinfo_cap_flag list
|
| X86 of x86_physinfo_cap_flag list
|
||||||
|
|
||||||
type physinfo = {
|
type physinfo = {
|
||||||
|
|||||||
@@ -851,13 +851,15 @@ CAMLprim value stub_xc_physinfo(value xch_val)
|
|||||||
arch_cap_list = Tag_cons;
|
arch_cap_list = Tag_cons;
|
||||||
|
|
||||||
arch_cap_flags_tag = 1; /* tag x86 */
|
arch_cap_flags_tag = 1; /* tag x86 */
|
||||||
#else
|
|
||||||
caml_failwith("Unhandled architecture");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
arch_cap_flags = caml_alloc_small(1, arch_cap_flags_tag);
|
arch_cap_flags = caml_alloc_small(1, arch_cap_flags_tag);
|
||||||
Store_field(arch_cap_flags, 0, arch_cap_list);
|
Store_field(arch_cap_flags, 0, arch_cap_list);
|
||||||
Store_field(physinfo, 10, arch_cap_flags);
|
Store_field(physinfo, 10, arch_cap_flags);
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
Store_field(physinfo, 10, Val_int(c_physinfo.arch_capabilities));
|
||||||
|
#else
|
||||||
|
caml_failwith("Unhandled architecture");
|
||||||
|
#endif
|
||||||
|
|
||||||
CAMLreturn(physinfo);
|
CAMLreturn(physinfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <xen/hvm/hvm_info_table.h>
|
#include <xen/hvm/hvm_info_table.h>
|
||||||
#include <xen/hvm/params.h>
|
#include <xen/hvm/params.h>
|
||||||
|
|
||||||
|
#include <xen-tools/arm-arch-capabilities.h>
|
||||||
#include <xen-tools/common-macros.h>
|
#include <xen-tools/common-macros.h>
|
||||||
|
|
||||||
/* Needed for Python versions earlier than 2.3. */
|
/* Needed for Python versions earlier than 2.3. */
|
||||||
@@ -871,6 +872,7 @@ static PyObject *pyxc_physinfo(XcObject *self)
|
|||||||
const char *virtcap_names[] = { "hvm", "pv" };
|
const char *virtcap_names[] = { "hvm", "pv" };
|
||||||
const unsigned virtcaps_bits[] = { XEN_SYSCTL_PHYSCAP_hvm,
|
const unsigned virtcaps_bits[] = { XEN_SYSCTL_PHYSCAP_hvm,
|
||||||
XEN_SYSCTL_PHYSCAP_pv };
|
XEN_SYSCTL_PHYSCAP_pv };
|
||||||
|
PyObject *objret;
|
||||||
|
|
||||||
if ( xc_physinfo(self->xc_handle, &pinfo) != 0 )
|
if ( xc_physinfo(self->xc_handle, &pinfo) != 0 )
|
||||||
return pyxc_error_to_exception(self->xc_handle);
|
return pyxc_error_to_exception(self->xc_handle);
|
||||||
@@ -897,17 +899,35 @@ static PyObject *pyxc_physinfo(XcObject *self)
|
|||||||
if ( p != virt_caps )
|
if ( p != virt_caps )
|
||||||
*(p-1) = '\0';
|
*(p-1) = '\0';
|
||||||
|
|
||||||
return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
|
objret = Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
|
||||||
"nr_nodes", pinfo.nr_nodes,
|
"nr_nodes", pinfo.nr_nodes,
|
||||||
"threads_per_core", pinfo.threads_per_core,
|
"threads_per_core", pinfo.threads_per_core,
|
||||||
"cores_per_socket", pinfo.cores_per_socket,
|
"cores_per_socket", pinfo.cores_per_socket,
|
||||||
"nr_cpus", pinfo.nr_cpus,
|
"nr_cpus", pinfo.nr_cpus,
|
||||||
"total_memory", pages_to_kib(pinfo.total_pages),
|
"total_memory", pages_to_kib(pinfo.total_pages),
|
||||||
"free_memory", pages_to_kib(pinfo.free_pages),
|
"free_memory", pages_to_kib(pinfo.free_pages),
|
||||||
"scrub_memory", pages_to_kib(pinfo.scrub_pages),
|
"scrub_memory", pages_to_kib(pinfo.scrub_pages),
|
||||||
"cpu_khz", pinfo.cpu_khz,
|
"cpu_khz", pinfo.cpu_khz,
|
||||||
"hw_caps", cpu_cap,
|
"hw_caps", cpu_cap,
|
||||||
"virt_caps", virt_caps);
|
"virt_caps", virt_caps);
|
||||||
|
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
if ( objret ) {
|
||||||
|
unsigned int sve_vl_bits;
|
||||||
|
PyObject *py_arm_sve_vl;
|
||||||
|
|
||||||
|
sve_vl_bits = arch_capabilities_arm_sve(pinfo.arch_capabilities);
|
||||||
|
py_arm_sve_vl = PyLong_FromUnsignedLong(sve_vl_bits);
|
||||||
|
|
||||||
|
if ( !py_arm_sve_vl )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if( PyDict_SetItemString(objret, "arm_sve_vl", py_arm_sve_vl) )
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return objret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject *kwds)
|
static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject *kwds)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include <libxl_json.h>
|
#include <libxl_json.h>
|
||||||
#include <libxl_utils.h>
|
#include <libxl_utils.h>
|
||||||
#include <libxlutil.h>
|
#include <libxlutil.h>
|
||||||
|
#include <xen-tools/arm-arch-capabilities.h>
|
||||||
|
|
||||||
#include "xl.h"
|
#include "xl.h"
|
||||||
#include "xl_utils.h"
|
#include "xl_utils.h"
|
||||||
@@ -224,6 +225,13 @@ static void output_physinfo(void)
|
|||||||
info.cap_gnttab_v2 ? " gnttab-v2" : ""
|
info.cap_gnttab_v2 ? " gnttab-v2" : ""
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Print arm SVE vector length only on ARM platforms */
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
maybe_printf("arm_sve_vector_length : %u\n",
|
||||||
|
arch_capabilities_arm_sve(info.arch_capabilities)
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
vinfo = libxl_get_version_info(ctx);
|
vinfo = libxl_get_version_info(ctx);
|
||||||
if (vinfo) {
|
if (vinfo) {
|
||||||
i = (1 << 20) / vinfo->pagesize;
|
i = (1 << 20) / vinfo->pagesize;
|
||||||
|
|||||||