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

Reply via email to