Re: [PATCH] kho: fix signed shift UB in kho_preserved_memory_reserve()

From: Kiarash Azarnia

Date: Sun Aug 16 2026 - 05:25:44 EST


Here is how I reproduced this, in case it is useful for review.

Minimal reproducer (prints what the function computes, both ways):

#include <stdio.h>
#define PAGE_SHIFT 12

int main(void)
{
int order;

for (order = 18; order <= 20; order++) {
unsigned long long before = 1 << (order + PAGE_SHIFT);
unsigned long long after = (unsigned long long)1 << (order + PAGE_SHIFT);
printf("order=%2d before=0x%llx after=0x%llx\n", order, before, after);
}
return 0;
}

prints:

order=18 before=0x40000000 after=0x40000000
order=19 before=0xffffffff80000000 after=0x80000000
order=20 before=0x1 after=0x100000000

Order 19 is a 2 GiB region, reachable from a reserve_mem=2G boot.

It also shows on a real boot: with CONFIG_KEXEC_HANDOVER=y, CONFIG_LIVEUPDATE=y,
CONFIG_UBSAN unset, and

reserve_mem=2G:2G:khotest kho_scratch=128M,128M,128M kho=on liveupdate=on
kexec -l -s --reuse-cmdline --append=" luo_stage=2"

stage 2 warned in memblock_add_range and lost ~820 MB (MemTotal 5181908 kB vs
6004928 kB in stage 1); after the fix, no WARN, MemTotal 6004884 kB.