On 2024-03-14 03:12, Jan Beulich wrote:
On 13.03.2024 22:02, Jason Andryuk wrote:
On 2024-03-13 15:30, Jason Andryuk wrote:
+/* Find an e820 RAM region that fits the kernel at a suitable alignment. */
+static paddr_t __init find_kernel_memory(
+ const struct domain *d, struct elf_binary *elf,
+ const struct elf_dom_parms *parms)
+{
+ paddr_t kernel_start = (paddr_t)elf->dest_base & PAGE_MASK;
+ paddr_t kernel_end = PAGE_ALIGN((paddr_t)elf->dest_base + elf->dest_size);
+ paddr_t kernel_size = kernel_end - kernel_start;
+ unsigned int i;
+
+ /*
+ * The memory map is sorted and all RAM regions starts and sizes are
+ * aligned to page boundaries.
+ */
+ for ( i = 0; i < d->arch.nr_e820; i++ )
+ {
+ paddr_t start = d->arch.e820[i].addr;
+ paddr_t end = d->arch.e820[i].addr + d->arch.e820[i].size;
+ paddr_t kstart, kend;
+
+ if ( d->arch.e820[i].type != E820_RAM )
+ continue;
+
+ if ( d->arch.e820[i].size < kernel_size )
+ continue;
+
+ kstart = ROUNDUP(start, parms->phys_align);
+ kstart = kstart < parms->phys_min ? parms->phys_min : kstart;
This should be
kstart = MAX(kstart, parms->phys_min);
Except that MAX() really ought to be the last resort; max() and max_t()
want considering in preference.
Yes, thanks. max() will do.
Regards,
Jason