comparison backend_x86.c @ 1145:494234e7e88f

Fix RAM flag offset calculation to take into account the existence of non-writeable MMAP_CODE chunks
author Michael Pavone <pavone@retrodev.com>
date Tue, 03 Jan 2017 21:18:42 -0800
parents fe8c79f82c22
children 5d41d0574863
comparison
equal deleted inserted replaced
1144:be3df2d8530a 1145:494234e7e88f
229 } 229 }
230 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { 230 if (is_write && (memmap[chunk].flags & MMAP_CODE)) {
231 mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size); 231 mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size);
232 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); 232 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size);
233 bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size); 233 bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size);
234 if (memmap[chunk].mask == opts->address_mask) {
235 ram_flags_off += (memmap[chunk].end - memmap[chunk].start) / (1 << opts->ram_flags_shift) / 8; ;
236 } else {
237 ram_flags_off += (memmap[chunk].mask + 1) / (1 << opts->ram_flags_shift) / 8;;
238 }
239 code_ptr not_code = code->cur + 1; 234 code_ptr not_code = code->cur + 1;
240 jcc(code, CC_NC, code->cur + 2); 235 jcc(code, CC_NC, code->cur + 2);
241 if (memmap[chunk].mask != opts->address_mask) { 236 if (memmap[chunk].mask != opts->address_mask) {
242 or_ir(code, memmap[chunk].start, opts->scratch2, opts->address_size); 237 or_ir(code, memmap[chunk].start, opts->scratch2, opts->address_size);
243 } 238 }
265 if (!is_write) { 260 if (!is_write) {
266 mov_ir(code, size == SZ_B ? 0xFF : 0xFFFF, opts->scratch1, size); 261 mov_ir(code, size == SZ_B ? 0xFF : 0xFFFF, opts->scratch1, size);
267 } 262 }
268 retn(code); 263 retn(code);
269 } 264 }
265 if (memmap[chunk].flags & MMAP_CODE) {
266 if (memmap[chunk].mask == opts->address_mask) {
267 ram_flags_off += (memmap[chunk].end - memmap[chunk].start) / (1 << opts->ram_flags_shift) / 8; ;
268 } else {
269 ram_flags_off += (memmap[chunk].mask + 1) / (1 << opts->ram_flags_shift) / 8;;
270 }
271 }
270 if (lb_jcc) { 272 if (lb_jcc) {
271 *lb_jcc = code->cur - (lb_jcc+1); 273 *lb_jcc = code->cur - (lb_jcc+1);
272 lb_jcc = NULL; 274 lb_jcc = NULL;
273 } 275 }
274 if (ub_jcc) { 276 if (ub_jcc) {