From 3e248fe54a3efec3ee8a373ec1f0acc7823507de Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 2 May 2020 01:13:30 +0200 Subject: [PATCH 1/3] Changed absolute mouse to divide the deltas by 25 instead of 100, works much better over RDP. --- src/win/win_mouse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/win_mouse.c b/src/win/win_mouse.c index 09a27f052..2e91085ec 100644 --- a/src/win/win_mouse.c +++ b/src/win/win_mouse.c @@ -89,8 +89,8 @@ win_mouse_handle(PRAWINPUT raw) * seems to work fine for RDP on Windows 10 * Not sure about other environments. */ - mousestate.dx += (state.lLastX - x)/100; - mousestate.dy += (state.lLastY - y)/100; + mousestate.dx += (state.lLastX - x)/25; + mousestate.dy += (state.lLastY - y)/25; x=state.lLastX; y=state.lLastY; } else { From 5b87c654e1b157b917399e88df4fbf2817672170 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 2 May 2020 02:09:10 +0200 Subject: [PATCH 2/3] Changed the packet structure's data field to a 65536-byte array to need less malloc'ing and free'ing, significantly reducing heap fragmentation. --- src/include/86box/network.h | 2 +- src/network/network.c | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/include/86box/network.h b/src/include/86box/network.h index 85b2d8276..f4e653a33 100644 --- a/src/include/86box/network.h +++ b/src/include/86box/network.h @@ -71,7 +71,7 @@ typedef int (*NETSETLINKSTATE)(void *); typedef struct netpkt { void *priv; - uint8_t *data; + uint8_t data[65536]; /* Maximum length + 1 to round up to the nearest power of 2. */ int len; struct netpkt *prev, *next; diff --git a/src/network/network.c b/src/network/network.c index de9c2ed1c..5f4c6dbaf 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -230,7 +230,6 @@ network_queue_put(int tx, void *priv, uint8_t *data, int len) temp = (netpkt_t *) malloc(sizeof(netpkt_t)); memset(temp, 0, sizeof(netpkt_t)); temp->priv = priv; - temp->data = (uint8_t *) malloc(len); memcpy(temp->data, data, len); temp->len = len; temp->prev = last_pkt[tx]; @@ -266,8 +265,6 @@ network_queue_advance(int tx) return; first_pkt[tx] = temp->next; - if (temp->data != NULL) - free(temp->data); free(temp); if (first_pkt[tx] == NULL) @@ -284,8 +281,6 @@ network_queue_clear(int tx) return; do { - if (temp->data != NULL) - free(temp->data); free(temp); temp = temp->next; } while (temp != NULL); From d3618e65752e8c675848e1642e0709cc3bb7a40e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 2 May 2020 05:41:38 +0200 Subject: [PATCH 3/3] Fixes to mem.c internal operation, non-RAM areas of the memory space should now be handled more sanely. --- src/mem.c | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/mem.c b/src/mem.c index a145c9631..ddd6a2316 100644 --- a/src/mem.c +++ b/src/mem.c @@ -680,7 +680,7 @@ writemembl(uint32_t addr, uint8_t val) mem_mapping_t *map; mem_logical_addr = addr; - if (page_lookup[addr>>12]) { + if (page_lookup[addr>>12] && page_lookup[addr>>12]->write_b) { page_lookup[addr>>12]->write_b(addr, val, page_lookup[addr>>12]); return; } @@ -772,7 +772,7 @@ writememwl(uint32_t addr, uint16_t val) } } - if (page_lookup[addr>>12]) { + if (page_lookup[addr>>12] && page_lookup[addr>>12]->write_w) { page_lookup[addr>>12]->write_w(addr, val, page_lookup[addr>>12]); return; } @@ -874,7 +874,7 @@ writememll(uint32_t addr, uint32_t val) return; } } - if (page_lookup[addr>>12]) { + if (page_lookup[addr>>12] && page_lookup[addr>>12]->write_l) { page_lookup[addr>>12]->write_l(addr, val, page_lookup[addr>>12]); return; } @@ -970,7 +970,7 @@ writememql(uint32_t addr, uint64_t val) return; } } - if (page_lookup[addr>>12]) { + if (page_lookup[addr>>12] && page_lookup[addr>>12]->write_l) { page_lookup[addr>>12]->write_l(addr, val, page_lookup[addr>>12]); page_lookup[addr>>12]->write_l(addr + 4, val >> 32, page_lookup[addr>>12]); return; @@ -1104,7 +1104,7 @@ writememwl(uint32_t seg, uint32_t addr, uint16_t val) } } - if (page_lookup[addr2>>12]) { + if (page_lookup[addr2>>12] && page_lookup[addr2>>12]->write_w) { page_lookup[addr2>>12]->write_w(addr2, val, page_lookup[addr2>>12]); return; } @@ -1209,7 +1209,7 @@ writememll(uint32_t seg, uint32_t addr, uint32_t val) } } - if (page_lookup[addr2>>12]) { + if (page_lookup[addr2>>12] && page_lookup[addr2>>12]->write_l) { page_lookup[addr2>>12]->write_l(addr2, val, page_lookup[addr2>>12]); return; } @@ -1307,7 +1307,7 @@ writememql(uint32_t seg, uint32_t addr, uint64_t val) } } - if (page_lookup[addr2>>12]) { + if (page_lookup[addr2>>12] && page_lookup[addr2>>12]->write_l) { page_lookup[addr2>>12]->write_l(addr2, val, page_lookup[addr2>>12]); page_lookup[addr2>>12]->write_l(addr2 + 4, val >> 32, page_lookup[addr2>>12]); return; @@ -2303,7 +2303,7 @@ mem_a20_init(void) void mem_reset(void) { - uint32_t c, m; + uint32_t c, m, m2; m = 1024UL * mem_size; if (ram != NULL) { @@ -2324,23 +2324,21 @@ mem_reset(void) m = 4096; } else { /* 80386+; maximum address space is 4GB. */ - if (is486) { - /* We need this since there might be BIOS execution at the end of RAM, - which could break the recompiler if there's not enough page elements. */ - m = 1048576; - } else { - m = (mem_size + 384) >> 2; - if ((m << 2) < (mem_size + 384)) - m++; - if (m < 4096) - m = 4096; - } + m = 1048576; } } else { /* 8088/86; maximum address space is 1MB. */ m = 256; } + /* Calculate the amount of pages used by RAM, so that we can + give all the pages above this amount NULL write handlers. */ + m2 = (mem_size + 384) >> 2; + if ((m2 << 2) < (mem_size + 384)) + m2++; + if (m2 < 4096) + m2 = 4096; + /* * Allocate and initialize the (new) page table. * We only do this if the size of the page table has changed. @@ -2399,9 +2397,17 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz); for (c = 0; c < pages_sz; c++) { pages[c].mem = &ram[c << 12]; - pages[c].write_b = mem_write_ramb_page; - pages[c].write_w = mem_write_ramw_page; - pages[c].write_l = mem_write_raml_page; + if (c < m) { + pages[c].write_b = mem_write_ramb_page; + pages[c].write_w = mem_write_ramw_page; + pages[c].write_l = mem_write_raml_page; + } else { + /* Make absolute sure non-RAM pages have NULL handlers so the + memory read/write handlers know to ignore them. */ + pages[c].write_b = NULL; + pages[c].write_w = NULL; + pages[c].write_l = NULL; + } #ifdef USE_NEW_DYNAREC pages[c].evict_prev = EVICT_NOT_IN_LIST; pages[c].byte_dirty_mask = &byte_dirty_mask[c * 64];