size_out /= 1024;
size_ext = 'M';
}
- _stprintf (txt, _T("%08X %7d%c/%d = %7d%c %s%s %s %s"), (j << 16) | bankoffset, size_out, size_ext,
+ _stprintf (txt, _T("%08X %7d%c/%d = %7d%c %s%s%c %s %s"), (j << 16) | bankoffset, size_out, size_ext,
mirrored, mirrored ? size_out / mirrored : size_out, size_ext,
(a1->flags & ABFLAG_CACHE_ENABLE_INS) ? _T("I") : _T("-"),
(a1->flags & ABFLAG_CACHE_ENABLE_DATA) ? _T("D") : _T("-"),
+ a1->baseaddr == NULL ? ' ' : '*',
bankmodes[ce_banktype[j]],
name);
tmp[0] = 0;
#define ABFLAG_CACHE_ENABLE_ALL (ABFLAG_CACHE_ENABLE_BOTH | ABFLAG_CACHE_ENABLE_INS_BURST | ABFLAG_CACHE_ENABLE_DATA_BURST)
typedef struct {
- /* These ones should be self-explanatory... */
+ /* These ones should be self-explanatory...
+ * Do not move. JIT depends on it
+ */
mem_get_func lget, wget, bget;
mem_put_func lput, wput, bput;
/* Use xlateaddr to translate an Amiga address to a uae_u8 * that can
uae_u8 *baseaddr_direct_r;
uae_u8 *baseaddr_direct_w;
uae_u32 startaccessmask;
+ bool barrier;
+ uae_u32 protectmode;
} addrbank;
#define MEMORY_MIN_SUBBANK 1024
extern void chipmem_setindirect(void);
extern void initramboard(addrbank *ab, struct ramboard *rb);
extern void loadboardfile(addrbank *ab, struct boardloadfile *lf);
+extern void mman_set_barriers(bool);
uae_u32 memory_get_long(uaecptr);
uae_u32 memory_get_word(uaecptr);
return result;
}
-void unprotect_maprom (void)
+// remove possible barrier at the start of this memory region
+void uae_mman_unmap(addrbank *ab, struct uae_mman_data *md)
+{
+ if (canbang && (ab->flags & ABFLAG_ALLOCINDIRECT)) {
+ virtualfreewithlock(ab->start + natmem_offset, ab->reserved_size, MEM_DECOMMIT);
+ }
+}
+
+void unprotect_maprom(void)
{
bool protect = false;
for (int i = 0; i < MAX_SHMID; i++) {
}
}
-void protect_roms (bool protect)
+void protect_roms(bool protect)
{
if (protect) {
// protect only if JIT enabled, always allow unprotect
}
}
+// Mark indirect regions (indirect VRAM) as non-accessible when JIT direct is active.
+// Beginning of region might have barrier region which is not marked as non-accessible,
+// allowing JIT direct to think it is directly accessible VRAM.
+void mman_set_barriers(bool disable)
+{
+ addrbank *abprev = NULL;
+ for (int i = 0; i < MEMORY_BANKS; i++) {
+ uaecptr addr = i * 0x10000;
+ addrbank *ab = &get_mem_bank(addr);
+ if (ab == abprev) {
+ continue;
+ }
+ int size = 0x10000;
+ for (int j = i + 1; j < MEMORY_BANKS; j++) {
+ uaecptr addr2 = j * 0x10000;
+ addrbank *ab2 = &get_mem_bank(addr2);
+ if (ab2 != ab) {
+ break;
+ }
+ size += 0x10000;
+ }
+ abprev = ab;
+ if (ab && ab->baseaddr == NULL && (ab->flags & ABFLAG_ALLOCINDIRECT)) {
+ DWORD old;
+ if (disable || !currprefs.cachesize || currprefs.comptrustbyte || currprefs.comptrustword || currprefs.comptrustlong) {
+ if (!ab->protectmode) {
+ ab->protectmode = PAGE_READWRITE;
+ }
+ if (!VirtualProtect(addr + natmem_offset, size, ab->protectmode, &old)) {
+ size = 0x1000;
+ VirtualProtect(addr + natmem_offset, size, ab->protectmode, &old);
+ }
+ write_log("%08x-%08x = access restored (%08x)\n", addr, size, ab->protectmode);
+ } else {
+ if (VirtualProtect(addr + natmem_offset, size, PAGE_NOACCESS, &old)) {
+ ab->protectmode = old;
+ write_log("%08x-%08x = set to no access\n", addr, addr + size);
+ } else {
+ size = 0x1000;
+ if (VirtualProtect(addr + natmem_offset, size, PAGE_NOACCESS, &old)) {
+ ab->protectmode = old;
+ write_log("%08x-%08x = set to no access\n", addr, addr + size);
+ }
+ }
+ }
+ }
+ }
+}
+
int uae_shmdt (const void *shmaddr)
{
return 0;