On 29 Jun 2022, at 14:55, Jane Malalane <jane.malal...@citrix.com<mailto:jane.malal...@citrix.com>> wrote:
+ physinfo = caml_alloc_tuple(11); Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core)); Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket)); Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus)); @@ -749,6 +749,17 @@ CAMLprim value stub_xc_physinfo(value xch) Store_field(physinfo, 8, cap_list); Store_field(physinfo, 9, Val_int(c_physinfo.max_cpu_id + 1)); +#if defined(__i386__) || defined(__x86_64__) + /* + * arch_capabilities: physinfo_arch_cap_flag list; + */ + arch_cap_list = c_bitmap_to_ocaml_list + /* ! physinfo_arch_cap_flag CAP_ none */ + /* ! XEN_SYSCTL_PHYSCAP_ XEN_SYSCTL_PHYSCAP_X86_MAX max */ + (c_physinfo.arch_capabilities); + Store_field(physinfo, 10, arch_cap_list); +#endif + CAMLreturn(physinfo); } I this extending the tuple but only defining a value on x86? Does this not lead to undefined fields on other architectures? type physinfo = { threads_per_core : int; cores_per_socket : int; @@ -124,6 +128,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; } type version = { major : int; minor : int; extra : string Here the record is extended but it looks to me like the new field is kept undefined on non x86 architectures. If the field still has a defined content, it would be good to explain why. — C