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.