From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
---
docs/man/xl.cfg.5.pod.in | 9 +++++++++
tools/libs/light/libxl_arm.c | 6 +++---
tools/libs/light/libxl_create.c | 3 +++
tools/libs/light/libxl_types.idl | 1 +
tools/libs/light/libxl_x86.c | 6 ++++++
tools/xl/xl_parse.c | 3 +++
6 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
index 7339c44efd..6c303e8efa 100644
--- a/docs/man/xl.cfg.5.pod.in
+++ b/docs/man/xl.cfg.5.pod.in
@@ -3089,6 +3089,15 @@ will be used for the domain. Otherwise, the value specified by the `nr_spis`
parameter will be used. The number of SPIs should match the highest interrupt
ID that will be assigned to the domain.
+=item B<trap_unmapped_accesses=BOOLEAN>
+
+An Optional boolean parameter that configures handling of accesses to unmapped
+address ranges. If enabled, guest accesses will trap. If disabled, guest
+accesses will read all bits as ones, e.g 0xFFFFFFFF for a 32bit access and
+writes will be ignored.
+
+This option is only implemented for ARM where the default is enabled.
+
=back
=head3 x86
diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c
index 9530996e72..afc62a5299 100644
--- a/tools/libs/light/libxl_arm.c
+++ b/tools/libs/light/libxl_arm.c
@@ -233,9 +233,6 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
config->arch.sve_vl = d_config->b_info.arch_arm.sve_vl / 128U;
}
- /* Trap accesses to unmapped areas. */
- config->flags |= XEN_DOMCTL_CDF_trap_unmapped_accesses;
-
return 0;
}
@@ -1714,6 +1711,9 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc,
/* ACPI is disabled by default */
libxl_defbool_setdefault(&b_info->acpi, false);
+ /* Trapping of unmapped accesses enabled by default. */
+ libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, true);
+
/* Sanitise SVE parameter */
if (b_info->arch_arm.sve_vl) {
unsigned int max_sve_vl =
diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
index e03599ea99..38770eea5b 100644
--- a/tools/libs/light/libxl_create.c
+++ b/tools/libs/light/libxl_create.c
@@ -667,6 +667,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
if (libxl_defbool_val(b_info->vpmu))
create.flags |= XEN_DOMCTL_CDF_vpmu;
+ if (libxl_defbool_val(b_info->trap_unmapped_accesses))
+ create.flags |= XEN_DOMCTL_CDF_trap_unmapped_accesses;
+
assert(info->passthrough != LIBXL_PASSTHROUGH_DEFAULT);
LOG(DETAIL, "passthrough: %s",
libxl_passthrough_to_string(info->passthrough));
diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl
index 9bb2969931..e33785c661 100644
--- a/tools/libs/light/libxl_types.idl
+++ b/tools/libs/light/libxl_types.idl
@@ -736,6 +736,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
("vmtrace_buf_kb", integer),
("vpmu", libxl_defbool),
+ ("trap_unmapped_accesses", libxl_defbool),
], dir=DIR_IN,
copy_deprecated_fn="libxl__domain_build_info_copy_deprecated",
diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
index 0b1c2d3a96..a9d470c9f6 100644
--- a/tools/libs/light/libxl_x86.c
+++ b/tools/libs/light/libxl_x86.c
@@ -26,6 +26,11 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
if (libxl_defbool_val(d_config->b_info.arch_x86.msr_relaxed))
config->arch.misc_flags |= XEN_X86_MSR_RELAXED;
+ if (libxl_defbool_val(d_config->b_info.trap_unmapped_accesses)) {
+ LOG(ERROR, "trap_unmapped_accesses is not supported on x86\n");
+ return ERROR_FAIL;
+ }
+
return 0;
}
@@ -813,6 +818,7 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc,
{
libxl_defbool_setdefault(&b_info->acpi, true);
libxl_defbool_setdefault(&b_info->arch_x86.msr_relaxed, false);
+ libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, false);
/*
* The config parameter "altp2m" replaces the parameter "altp2mhvm".
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 089a88935a..40da75ef74 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -2975,6 +2975,9 @@ skip_usbdev:
if (!xlu_cfg_get_long (config, "nr_spis", &l, 0))
b_info->arch_arm.nr_spis = l;
+ xlu_cfg_get_defbool(config, "trap_unmapped_accesses",
+ &b_info->trap_unmapped_accesses, 0);
+
parse_vkb_list(config, d_config);
d_config->virtios = NULL;
--
2.43.0
Hi Edgar,
On 30/05/2025 14:45, Edgar E. Iglesias wrote:
> @@ -1714,6 +1711,9 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc,
> /* ACPI is disabled by default */
> libxl_defbool_setdefault(&b_info->acpi, false);
>
> + /* Trapping of unmapped accesses enabled by default. */
> + libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, true);
> +
> /* Sanitise SVE parameter */
> if (b_info->arch_arm.sve_vl) {
> unsigned int max_sve_vl =
> diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
> index e03599ea99..38770eea5b 100644
> --- a/tools/libs/light/libxl_create.c
> +++ b/tools/libs/light/libxl_create.c
> @@ -667,6 +667,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
> if (libxl_defbool_val(b_info->vpmu))
> create.flags |= XEN_DOMCTL_CDF_vpmu;
>
> + if (libxl_defbool_val(b_info->trap_unmapped_accesses))
> + create.flags |= XEN_DOMCTL_CDF_trap_unmapped_accesses;
> +
> assert(info->passthrough != LIBXL_PASSTHROUGH_DEFAULT);
> LOG(DETAIL, "passthrough: %s",
> libxl_passthrough_to_string(info->passthrough));
> diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl
> index 9bb2969931..e33785c661 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -736,6 +736,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
> ("vmtrace_buf_kb", integer),
>
> ("vpmu", libxl_defbool),
> + ("trap_unmapped_accesses", libxl_defbool),
I think you want to add a LIBXL_HAVE in tools/include/libxl.h for this
new field.
Cheers,
--
Julien Grall
On Tue, Jun 03, 2025 at 10:34:53AM +0100, Julien Grall wrote:
> Hi Edgar,
>
> On 30/05/2025 14:45, Edgar E. Iglesias wrote:
> > @@ -1714,6 +1711,9 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc,
> > /* ACPI is disabled by default */
> > libxl_defbool_setdefault(&b_info->acpi, false);
> > + /* Trapping of unmapped accesses enabled by default. */
> > + libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, true);
> > +
> > /* Sanitise SVE parameter */
> > if (b_info->arch_arm.sve_vl) {
> > unsigned int max_sve_vl =
> > diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
> > index e03599ea99..38770eea5b 100644
> > --- a/tools/libs/light/libxl_create.c
> > +++ b/tools/libs/light/libxl_create.c
> > @@ -667,6 +667,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
> > if (libxl_defbool_val(b_info->vpmu))
> > create.flags |= XEN_DOMCTL_CDF_vpmu;
> > + if (libxl_defbool_val(b_info->trap_unmapped_accesses))
> > + create.flags |= XEN_DOMCTL_CDF_trap_unmapped_accesses;
> > +
> > assert(info->passthrough != LIBXL_PASSTHROUGH_DEFAULT);
> > LOG(DETAIL, "passthrough: %s",
> > libxl_passthrough_to_string(info->passthrough));
> > diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl
> > index 9bb2969931..e33785c661 100644
> > --- a/tools/libs/light/libxl_types.idl
> > +++ b/tools/libs/light/libxl_types.idl
> > @@ -736,6 +736,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
> > ("vmtrace_buf_kb", integer),
> > ("vpmu", libxl_defbool),
> > + ("trap_unmapped_accesses", libxl_defbool),
>
> I think you want to add a LIBXL_HAVE in tools/include/libxl.h for this new
> field.
Thanks, adding it in v4.
>
> Cheers,
>
> --
> Julien Grall
>
On Fri, 30 May 2025, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@amd.com>
>
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> ---
> docs/man/xl.cfg.5.pod.in | 9 +++++++++
> tools/libs/light/libxl_arm.c | 6 +++---
> tools/libs/light/libxl_create.c | 3 +++
> tools/libs/light/libxl_types.idl | 1 +
> tools/libs/light/libxl_x86.c | 6 ++++++
> tools/xl/xl_parse.c | 3 +++
> 6 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
> index 7339c44efd..6c303e8efa 100644
> --- a/docs/man/xl.cfg.5.pod.in
> +++ b/docs/man/xl.cfg.5.pod.in
> @@ -3089,6 +3089,15 @@ will be used for the domain. Otherwise, the value specified by the `nr_spis`
> parameter will be used. The number of SPIs should match the highest interrupt
> ID that will be assigned to the domain.
>
> +=item B<trap_unmapped_accesses=BOOLEAN>
> +
> +An Optional boolean parameter that configures handling of accesses to unmapped
> +address ranges. If enabled, guest accesses will trap. If disabled, guest
> +accesses will read all bits as ones, e.g 0xFFFFFFFF for a 32bit access and
> +writes will be ignored.
> +
> +This option is only implemented for ARM where the default is enabled.
> +
> =back
>
> =head3 x86
> diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c
> index 9530996e72..afc62a5299 100644
> --- a/tools/libs/light/libxl_arm.c
> +++ b/tools/libs/light/libxl_arm.c
> @@ -233,9 +233,6 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
> config->arch.sve_vl = d_config->b_info.arch_arm.sve_vl / 128U;
> }
>
> - /* Trap accesses to unmapped areas. */
> - config->flags |= XEN_DOMCTL_CDF_trap_unmapped_accesses;
> -
> return 0;
> }
>
> @@ -1714,6 +1711,9 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc,
> /* ACPI is disabled by default */
> libxl_defbool_setdefault(&b_info->acpi, false);
>
> + /* Trapping of unmapped accesses enabled by default. */
> + libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, true);
> +
> /* Sanitise SVE parameter */
> if (b_info->arch_arm.sve_vl) {
> unsigned int max_sve_vl =
> diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
> index e03599ea99..38770eea5b 100644
> --- a/tools/libs/light/libxl_create.c
> +++ b/tools/libs/light/libxl_create.c
> @@ -667,6 +667,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
> if (libxl_defbool_val(b_info->vpmu))
> create.flags |= XEN_DOMCTL_CDF_vpmu;
>
> + if (libxl_defbool_val(b_info->trap_unmapped_accesses))
> + create.flags |= XEN_DOMCTL_CDF_trap_unmapped_accesses;
> +
> assert(info->passthrough != LIBXL_PASSTHROUGH_DEFAULT);
> LOG(DETAIL, "passthrough: %s",
> libxl_passthrough_to_string(info->passthrough));
> diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl
> index 9bb2969931..e33785c661 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -736,6 +736,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
> ("vmtrace_buf_kb", integer),
>
> ("vpmu", libxl_defbool),
> + ("trap_unmapped_accesses", libxl_defbool),
>
> ], dir=DIR_IN,
> copy_deprecated_fn="libxl__domain_build_info_copy_deprecated",
> diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
> index 0b1c2d3a96..a9d470c9f6 100644
> --- a/tools/libs/light/libxl_x86.c
> +++ b/tools/libs/light/libxl_x86.c
> @@ -26,6 +26,11 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
> if (libxl_defbool_val(d_config->b_info.arch_x86.msr_relaxed))
> config->arch.misc_flags |= XEN_X86_MSR_RELAXED;
>
> + if (libxl_defbool_val(d_config->b_info.trap_unmapped_accesses)) {
> + LOG(ERROR, "trap_unmapped_accesses is not supported on x86\n");
> + return ERROR_FAIL;
> + }
> +
> return 0;
> }
>
> @@ -813,6 +818,7 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc *gc,
> {
> libxl_defbool_setdefault(&b_info->acpi, true);
> libxl_defbool_setdefault(&b_info->arch_x86.msr_relaxed, false);
> + libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, false);
>
> /*
> * The config parameter "altp2m" replaces the parameter "altp2mhvm".
> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> index 089a88935a..40da75ef74 100644
> --- a/tools/xl/xl_parse.c
> +++ b/tools/xl/xl_parse.c
> @@ -2975,6 +2975,9 @@ skip_usbdev:
> if (!xlu_cfg_get_long (config, "nr_spis", &l, 0))
> b_info->arch_arm.nr_spis = l;
>
> + xlu_cfg_get_defbool(config, "trap_unmapped_accesses",
> + &b_info->trap_unmapped_accesses, 0);
> +
> parse_vkb_list(config, d_config);
>
> d_config->virtios = NULL;
> --
> 2.43.0
>
© 2016 - 2026 Red Hat, Inc.