tools/ocaml: implement stub_xc_domain_create() for ARM

stub_xc_domain_create() fails unconditionally with "Unhandled: ARM" for
the ARM variant of arch_domainconfig, so no OCaml toolstack (e.g.
xenopsd) can create an ARM domain.

To fix this, convert the two fields of xen_arm_arch_domainconfig,
gic_version and nr_spis, into the corresponding fields of struct
xen_arch_domainconfig and reject values that do not fit, as is already
done for other parameters. The remaining fields (sve_vl, tee_type,
arm_sci_type and v8r_el1_msa) aren't exposed to OCaml yet, so they stay
zero.

Also add a BUILD_BUG_ON() on the size of the createdomain struct, just
like the x86 case, to catch future ABI changes.

Signed-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>
Signed-off-by: Julian Vetter <julian.vetter@vates.tech>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Andrii Sultanov authored and Andrew Cooper committed 2026-10-22 13:40:20 +01:00
1 parent 30e2d8b4c5
commit dbf9a090ba
1 file changed
+27 -1
+27 -1
View File
@@ -257,8 +257,34 @@ CAMLprim value stub_xc_domain_create(value xch_val, value wanted_domid, value co
arch_domconfig = Field(VAL_ARCH, 0);
switch ( Tag_val(VAL_ARCH) )
{
case 0: /* ARM - nothing to do */
case 0: /* ARM */
#if defined(__arm__) || defined(__aarch64__)
{
/* Quick & dirty check for ABI changes. */
BUILD_BUG_ON(sizeof(cfg) != 72);
/* Mnemonics for the named fields inside xen_arm_arch_domainconfig */
#define VAL_GIC_VERSION Field(arch_domconfig, 0)
#define VAL_NR_SPIS Field(arch_domconfig, 1)
uint8_t gic_version = Long_val(VAL_GIC_VERSION);
uint32_t nr_spis = Long_val(VAL_NR_SPIS);
if ( gic_version != Long_val(VAL_GIC_VERSION) )
caml_invalid_argument("gic_version");
if ( nr_spis != Long_val(VAL_NR_SPIS) )
caml_invalid_argument("nr_spis");
cfg.arch.gic_version = gic_version;
cfg.arch.nr_spis = nr_spis;
#undef VAL_NR_SPIS
#undef VAL_GIC_VERSION
}
#else
caml_failwith("Unhandled: ARM");
#endif
break;
case 1: /* X86 - emulation flags in the block */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.