[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging] tools/ocaml: implement stub_xc_domain_create() for ARM



commit dbf9a090ba3df0df10971d29f47b080a44cf8178
Author:     Andrii Sultanov <andriy.sultanov@xxxxxxxxxx>
AuthorDate: Thu Oct 22 10:40:06 2026 +0200
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Thu Oct 22 13:40:20 2026 +0100

    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@xxxxxxxxxx>
    Signed-off-by: Julian Vetter <julian.vetter@xxxxxxxxxx>
    Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
 tools/ocaml/libs/xc/xenctrl_stubs.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c 
b/tools/ocaml/libs/xc/xenctrl_stubs.c
index 180f2fbf45..c15a3428da 100644
--- a/tools/ocaml/libs/xc/xenctrl_stubs.c
+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
@@ -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 */
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.