struct syslinux_memmap *rxmap = NULL, *ml;
struct shuffle_descriptor *dp, *dbuf;
int np, nb, rv = -1;
- int desc_blocks;
+ int desc_blocks, need_blocks;
addr_t desczone, descfree, descaddr, descoffs;
int nmoves, nzero;
struct shuffle_descriptor primaries[2];
dprintf("desczone = 0x%08x, descfree = 0x%08x\n", desczone, descfree);
- for (desc_blocks = (nzero+DESC_BLOCK_SIZE)/(DESC_BLOCK_SIZE-1) ; ;
- desc_blocks++) {
+ desc_blocks = (nzero+DESC_BLOCK_SIZE)/(DESC_BLOCK_SIZE-1);
+ for (;;) {
addr_t descmem = desc_blocks*
sizeof(struct shuffle_descriptor)*DESC_BLOCK_SIZE;
for (mp = moves; mp; mp = mp->next)
nmoves++;
- if ((nmoves+nzero) <= desc_blocks*(DESC_BLOCK_SIZE-1))
+ need_blocks = (nmoves+nzero)/(DESC_BLOCK_SIZE-1);
+
+ if (desc_blocks >= need_blocks)
break; /* Sufficient memory, yay */
+
+ desc_blocks = need_blocks; /* Try again... */
}
#if DEBUG