[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/2] tools/ocaml/xc: Address ABI issues with physinfo arch flags
The current bindings function, but the preexisting type physinfo_arch_cap_flag = | X86 of x86_physinfo_arch_cap_flag is a special case in the Ocaml type system with an unusual indirection, and will break when a second option, e.g. `| ARM of ...` is added. Also, the position the list is logically wrong. Currently, the types express a list of elements which might be an x86 flag or an arm flag (and can intermix), whereas what we actually want is either a list of x86 flags, or a list of ARM flags (that cannot intermix). Rework the Ocaml types to avoid the ABI special case and move the list primitive, and adjust the C bindings to match. Fixes: 2ce11ce249a3 ("x86/HVM: allow per-domain usage of hardware virtualized APIC") Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Christian Lindig <christian.lindig@xxxxxxxxxx> CC: David Scott <dave@xxxxxxxxxx> CC: Edwin Torok <edvin.torok@xxxxxxxxxx> CC: Rob Hoes <Rob.Hoes@xxxxxxxxxx> CC: Henry Wang <Henry.Wang@xxxxxxx> --- tools/ocaml/libs/xc/xenctrl.ml | 10 ++++++---- tools/ocaml/libs/xc/xenctrl.mli | 11 +++++++---- tools/ocaml/libs/xc/xenctrl_stubs.c | 22 ++++++++++++---------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml index 0c71e5eef3c7..28ed6422317c 100644 --- a/tools/ocaml/libs/xc/xenctrl.ml +++ b/tools/ocaml/libs/xc/xenctrl.ml @@ -130,13 +130,15 @@ type physinfo_cap_flag = | CAP_Gnttab_v1 | CAP_Gnttab_v2 +type arm_physinfo_cap_flag -type x86_physinfo_arch_cap_flag = +type x86_physinfo_cap_flag = | CAP_X86_ASSISTED_XAPIC | CAP_X86_ASSISTED_X2APIC -type physinfo_arch_cap_flag = - | X86 of x86_physinfo_arch_cap_flag +type arch_physinfo_cap_flags = + | ARM of arm_physinfo_cap_flag list + | X86 of x86_physinfo_cap_flag list type physinfo = { @@ -151,7 +153,7 @@ type physinfo = (* XXX hw_cap *) capabilities : physinfo_cap_flag list; max_nr_cpus : int; - arch_capabilities : physinfo_arch_cap_flag list; + arch_capabilities : arch_physinfo_cap_flags; } type version = diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli index a8458e19ca4b..c2076d60c970 100644 --- a/tools/ocaml/libs/xc/xenctrl.mli +++ b/tools/ocaml/libs/xc/xenctrl.mli @@ -115,12 +115,15 @@ type physinfo_cap_flag = | CAP_Gnttab_v1 | CAP_Gnttab_v2 -type x86_physinfo_arch_cap_flag = +type arm_physinfo_cap_flag + +type x86_physinfo_cap_flag = | CAP_X86_ASSISTED_XAPIC | CAP_X86_ASSISTED_X2APIC -type physinfo_arch_cap_flag = - | X86 of x86_physinfo_arch_cap_flag +type arch_physinfo_cap_flags = + | ARM of arm_physinfo_cap_flag list + | X86 of x86_physinfo_cap_flag list type physinfo = { threads_per_core : int; @@ -133,7 +136,7 @@ type physinfo = { scrub_pages : nativeint; capabilities : physinfo_cap_flag list; max_nr_cpus : int; (** compile-time max possible number of nr_cpus *) - arch_capabilities : physinfo_arch_cap_flag list; + arch_capabilities : arch_physinfo_cap_flags; } type version = { major : int; minor : int; extra : string; } type compile_info = { diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index fe9c00ce008a..03f4cbf93cd3 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -716,9 +716,10 @@ CAMLprim value stub_xc_send_debug_keys(value xch, value keys) CAMLprim value stub_xc_physinfo(value xch) { CAMLparam1(xch); - CAMLlocal4(physinfo, cap_list, x86_arch_cap_list, arch_cap_list); + CAMLlocal2(physinfo, cap_list); + CAMLlocal2(arch_cap_flags, arch_cap_list); xc_physinfo_t c_physinfo; - int r; + int r, arch_cap_flags_tag; caml_enter_blocking_section(); r = xc_physinfo(_H(xch), &c_physinfo); @@ -748,18 +749,19 @@ CAMLprim value stub_xc_physinfo(value xch) Store_field(physinfo, 9, Val_int(c_physinfo.max_cpu_id + 1)); #if defined(__i386__) || defined(__x86_64__) - x86_arch_cap_list = c_bitmap_to_ocaml_list - /* ! x86_physinfo_arch_cap_flag CAP_X86_ none */ + arch_cap_list = c_bitmap_to_ocaml_list + /* ! x86_physinfo_cap_flag CAP_X86_ none */ /* ! XEN_SYSCTL_PHYSCAP_X86_ XEN_SYSCTL_PHYSCAP_X86_MAX max */ (c_physinfo.arch_capabilities); - /* - * arch_capabilities: physinfo_arch_cap_flag list; - */ - arch_cap_list = x86_arch_cap_list; + + arch_cap_flags_tag = 1; /* tag x86 */ #else - arch_cap_list = Val_emptylist; + caml_failwith("Unhandled architecture"); #endif - Store_field(physinfo, 10, arch_cap_list); + + arch_cap_flags = caml_alloc_small(1, arch_cap_flags_tag); + Store_field(arch_cap_flags, 0, arch_cap_list); + Store_field(physinfo, 10, arch_cap_flags); CAMLreturn(physinfo); } -- 2.11.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |