# HG changeset patch # User Michael Pavone # Date 1644821572 28800 # Node ID 0013362c320c61992c464c14c038a2815a27a268 # Parent 3abb64bd0da674d2c2bca8e65856b1cf850b3980 Fix handling of ram code flag offset calculation for ranges that are not an even multiple of the code flag page size diff -r 3abb64bd0da6 -r 0013362c320c backend.c --- a/backend.c Sun Feb 13 22:52:19 2022 -0800 +++ b/backend.c Sun Feb 13 22:52:52 2022 -0800 @@ -56,11 +56,11 @@ if (size_sum) { *size_sum = 0; } - uint32_t minsize; + uint32_t size_round_mask; if (flags == MMAP_CODE) { - minsize = 1 << (opts->ram_flags_shift + 3); + size_round_mask = (1 << (opts->ram_flags_shift + 3)) - 1; } else { - minsize = 0; + size_round_mask = 0; } address &= opts->address_mask; for (memmap_chunk const *cur = opts->memmap, *end = opts->memmap + opts->memmap_chunks; cur != end; cur++) @@ -69,8 +69,11 @@ return cur; } else if (size_sum && (cur->flags & flags) == flags) { uint32_t size = chunk_size(opts, cur); - if (size < minsize) { - size = minsize; + if (size_round_mask) { + if (size & size_round_mask) { + size &= ~size_round_mask; + size += size_round_mask + 1; + } } *size_sum += size; } diff -r 3abb64bd0da6 -r 0013362c320c backend_x86.c --- a/backend_x86.c Sun Feb 13 22:52:19 2022 -0800 +++ b/backend_x86.c Sun Feb 13 22:52:52 2022 -0800 @@ -338,17 +338,13 @@ ub_jcc = NULL; } if (memmap[chunk].flags & MMAP_CODE) { - uint32_t added_offset; - if (memmap[chunk].mask == opts->address_mask) { - added_offset = (memmap[chunk].end - memmap[chunk].start) / (1 << opts->ram_flags_shift) / 8; - } else { - added_offset = (memmap[chunk].mask + 1) / (1 << opts->ram_flags_shift) / 8; + uint32_t size = chunk_size(opts, memmap + chunk); + uint32_t size_round_mask = (1 << (opts->ram_flags_shift + 3)) - 1; + if (size & size_round_mask) { + size &= ~size_round_mask; + size += size_round_mask + 1; } - if (added_offset) { - ram_flags_off += added_offset; - } else { - ram_flags_off += 1; - } + ram_flags_off += size >> (opts->ram_flags_shift + 3); } if (need_wide_jcc) { need_wide_jcc = 0;