From d63176e4726964cbb4e0874d8caab47bababf66d Mon Sep 17 00:00:00 2001 From: SarahW Date: Wed, 28 Nov 2018 18:43:40 +0000 Subject: [PATCH] Move dynarec code memory out of codeblock structure. --- src/codegen.h | 9 +++++++-- src/codegen_backend.c | 3 +++ src/codegen_backend_arm.c | 18 +++++++++++------- src/codegen_backend_arm64.c | 18 +++++++++++------- src/codegen_backend_x86-64.c | 10 +++++++--- src/codegen_backend_x86-64.h | 2 +- src/codegen_backend_x86.c | 16 ++++++++++------ src/codegen_backend_x86.h | 3 ++- 8 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/codegen.h b/src/codegen.h index dcca68b..b212cbe 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -30,7 +30,10 @@ */ /*Hack until better memory management written*/ -#define BLOCK_DATA_SIZE 0x10000 +/*This is deliberately _not_ a power of two, to avoid cache aliasing problems. + Try changing this to a power of two, and watch the performance plummet :) + It's probably best for this to be a multiple of the cache line size though*/ +#define BLOCK_DATA_SIZE 0xff80 typedef struct codeblock_t { @@ -61,9 +64,11 @@ typedef struct codeblock_t uint32_t status; uint32_t flags; - uint8_t data[BLOCK_DATA_SIZE]; + uint8_t *data; } codeblock_t; +uint8_t *codeblock_data; + /*Code block uses FPU*/ #define CODEBLOCK_HAS_FPU 1 /*Code block is always entered with the same FPU top-of-stack*/ diff --git a/src/codegen_backend.c b/src/codegen_backend.c index fa01aa8..482e1e9 100644 --- a/src/codegen_backend.c +++ b/src/codegen_backend.c @@ -96,7 +96,10 @@ void codegen_reset() mem_reset_page_blocks(); for (c = 0; c < BLOCK_SIZE; c++) + { codeblock[c].pc = BLOCK_PC_INVALID; + codeblock[c].data = &codeblock_data[c * BLOCK_DATA_SIZE]; + } } void dump_block() diff --git a/src/codegen_backend_arm.c b/src/codegen_backend_arm.c index 5852294..00c2a17 100644 --- a/src/codegen_backend_arm.c +++ b/src/codegen_backend_arm.c @@ -294,23 +294,27 @@ void codegen_backend_init() #endif #if defined WIN32 || defined _WIN32 || defined _WIN32 - codeblock = VirtualAlloc(NULL, (BLOCK_SIZE+1) * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); + codeblock_data = VirtualAlloc(NULL, (BLOCK_SIZE+1) * BLOCK_DATA_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); #else - codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); + codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE); #endif - if (!codeblock) - fatal("codeblock failed to alloc - %i\n", (BLOCK_SIZE+1) * sizeof(codeblock_t)); + if (!codeblock_data) + fatal("codeblock_data failed to alloc - %i\n", (BLOCK_SIZE+1) * BLOCK_DATA_SIZE); + codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); - for (c = 0; c < BLOCK_SIZE; c++) + for (c = 0; c < BLOCK_SIZE+1; c++) + { codeblock[c].pc = BLOCK_PC_INVALID; + codeblock[c].data = &codeblock_data[c * BLOCK_DATA_SIZE]; + } #if defined(__linux__) || defined(__APPLE__) - start = (void *)((long)codeblock & pagemask); - len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; + start = (void *)((long)codeblock_data & pagemask); + len = (((BLOCK_SIZE+1) * BLOCK_DATA_SIZE) + pagesize) & pagemask; if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { perror("mprotect"); diff --git a/src/codegen_backend_arm64.c b/src/codegen_backend_arm64.c index f201c4b..839f37e 100644 --- a/src/codegen_backend_arm64.c +++ b/src/codegen_backend_arm64.c @@ -289,23 +289,27 @@ void codegen_backend_init() #endif #if defined WIN32 || defined _WIN32 || defined _WIN32 - codeblock = VirtualAlloc(NULL, (BLOCK_SIZE+1) * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); + codeblock_data = VirtualAlloc(NULL, (BLOCK_SIZE+1) * BLOCK_DATA_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); #else - codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); + codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE); #endif - if (!codeblock) - fatal("codeblock failed to alloc - %i\n", (BLOCK_SIZE+1) * sizeof(codeblock_t)); + if (!codeblock_data) + fatal("codeblock_data failed to alloc - %i\n", (BLOCK_SIZE+1) * BLOCK_DATA_SIZE); + codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); - for (c = 0; c < BLOCK_SIZE; c++) + for (c = 0; c < BLOCK_SIZE+1; c++) + { codeblock[c].pc = BLOCK_PC_INVALID; + codeblock[c].data = &codeblock_data[c * BLOCK_SIZE]; + } #if defined(__linux__) || defined(__APPLE__) - start = (void *)((long)codeblock & pagemask); - len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; + start = (void *)((long)codeblock_data & pagemask); + len = (((BLOCK_SIZE+1) * BLOCK_DATA_SIZE) + pagesize) & pagemask; if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { perror("mprotect"); diff --git a/src/codegen_backend_x86-64.c b/src/codegen_backend_x86-64.c index bb92241..c509c04 100644 --- a/src/codegen_backend_x86-64.c +++ b/src/codegen_backend_x86-64.c @@ -276,17 +276,21 @@ void codegen_backend_init() #endif #if defined WIN32 || defined _WIN32 || defined _WIN32 - codeblock = VirtualAlloc(NULL, (BLOCK_SIZE+1) * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); + codeblock_data = VirtualAlloc(NULL, (BLOCK_SIZE+1) * BLOCK_DATA_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); #else - codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); + codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE); #endif + codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); - for (c = 0; c < BLOCK_SIZE; c++) + for (c = 0; c < BLOCK_SIZE+1; c++) + { + codeblock[c].data = &codeblock_data[c * BLOCK_DATA_SIZE]; codeblock[c].pc = BLOCK_PC_INVALID; + } #if defined(__linux__) || defined(__APPLE__) start = (void *)((long)codeblock & pagemask); diff --git a/src/codegen_backend_x86-64.h b/src/codegen_backend_x86-64.h index 50797ef..4e9ec51 100644 --- a/src/codegen_backend_x86-64.h +++ b/src/codegen_backend_x86-64.h @@ -10,7 +10,7 @@ #define HASH(l) ((l) & 0x1ffff) /*Hack until better memory management written*/ -#define BLOCK_EXIT_OFFSET 0xffe0 +#define BLOCK_EXIT_OFFSET (BLOCK_DATA_SIZE - 32) /*#define BLOCK_EXIT_OFFSET 0x7f0*/ #define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20) diff --git a/src/codegen_backend_x86.c b/src/codegen_backend_x86.c index daeff4d..675d9fe 100644 --- a/src/codegen_backend_x86.c +++ b/src/codegen_backend_x86.c @@ -261,22 +261,26 @@ void codegen_backend_init() long pagemask = ~(pagesize - 1); #endif -#if defined WIN32 || defined _WIN32 || defined _WIN32 - codeblock = VirtualAlloc(NULL, (BLOCK_SIZE+1) * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); -#else codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); +#if defined WIN32 || defined _WIN32 || defined _WIN32 + codeblock_data = VirtualAlloc(NULL, (BLOCK_SIZE+1) * BLOCK_DATA_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); +#else + codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE; #endif codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock_hash, 0, HASH_SIZE * sizeof(codeblock_t *)); - for (c = 0; c < BLOCK_SIZE; c++) + for (c = 0; c < BLOCK_SIZE + 1; c++) + { + codeblock[c].data = &codeblock_data[c * BLOCK_DATA_SIZE]; codeblock[c].pc = BLOCK_PC_INVALID; + } #if defined(__linux__) || defined(__APPLE__) - start = (void *)((long)codeblock & pagemask); - len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; + start = (void *)((long)codeblock_data & pagemask); + len = (((BLOCK_SIZE+1) * BLOCK_DATA_SIZE) + pagesize) & pagemask; if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { perror("mprotect"); diff --git a/src/codegen_backend_x86.h b/src/codegen_backend_x86.h index 5face4e..13ccfab 100644 --- a/src/codegen_backend_x86.h +++ b/src/codegen_backend_x86.h @@ -10,7 +10,8 @@ #define HASH(l) ((l) & 0x1ffff) /*Hack until better memory management written*/ -#define BLOCK_EXIT_OFFSET 0xfff0 +#define BLOCK_EXIT_OFFSET (BLOCK_DATA_SIZE - 16) +//#define BLOCK_EXIT_OFFSET 0xfff0 /*#define BLOCK_EXIT_OFFSET 0x7f0*/ #define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20)