changeset 2113:0013362c320c

Fix handling of ram code flag offset calculation for ranges that are not an even multiple of the code flag page size
author Michael Pavone <pavone@retrodev.com>
date Sun, 13 Feb 2022 22:52:52 -0800
parents 3abb64bd0da6
children 2449c88cea36
files backend.c backend_x86.c
diffstat 2 files changed, 14 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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;
 		}
--- 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;