On 05/02/2026 1:56 pm, Edwin Török wrote:
> Observed when attempting to boot a >4TiB VM:
>
> After a call to domain_setmaxmem with 6370254848 (KiB),
> the domain's maxmem got set to 2075287552,
> which is exactly 2^32 smaller.
>
> xc_domain_setmaxmem takes an uint64_t as a parameter,
> and the OCaml value is 64-bit already, so fix the C variable
> to match the type and avoid the truncation.
Fixes: f5b43e95facd ("libxl: fix "xl mem-set" regression from 0c029c4da2")
> Signed-off-by: Edwin Török <[email protected]>
Reviewed-by: Andrew Cooper <[email protected]>
> ---
> tools/ocaml/libs/xc/xenctrl_stubs.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c
> b/tools/ocaml/libs/xc/xenctrl_stubs.c
> index ac2a7537d6..c55f73b265 100644
> --- a/tools/ocaml/libs/xc/xenctrl_stubs.c
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -947,7 +947,7 @@ CAMLprim value stub_xc_domain_setmaxmem(value xch_val,
> value domid,
> int retval;
>
> uint32_t c_domid = Int_val(domid);
> - unsigned int c_max_memkb = Int64_val(max_memkb);
> + uint64_t c_max_memkb = Int64_val(max_memkb);
> caml_enter_blocking_section();
> retval = xc_domain_setmaxmem(xch, c_domid, c_max_memkb);
> caml_leave_blocking_section();
Interestingly, in 8b7ce06a2d341c1f when the Ocaml bindings where
introduced, it was always an Int64 downcast into an unsigned int, so the
binding was correct. Later, xc_domain_setmaxmem() was upgraded from an
unsigned int to a uint64_t.
~Andrew