Move dynarec code memory out of codeblock structure.

This commit is contained in:
SarahW 2018-11-28 18:43:40 +00:00
commit d63176e472
8 changed files with 51 additions and 26 deletions

View file

@ -30,7 +30,10 @@
*/ */
/*Hack until better memory management written*/ /*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 typedef struct codeblock_t
{ {
@ -61,9 +64,11 @@ typedef struct codeblock_t
uint32_t status; uint32_t status;
uint32_t flags; uint32_t flags;
uint8_t data[BLOCK_DATA_SIZE]; uint8_t *data;
} codeblock_t; } codeblock_t;
uint8_t *codeblock_data;
/*Code block uses FPU*/ /*Code block uses FPU*/
#define CODEBLOCK_HAS_FPU 1 #define CODEBLOCK_HAS_FPU 1
/*Code block is always entered with the same FPU top-of-stack*/ /*Code block is always entered with the same FPU top-of-stack*/

View file

@ -96,7 +96,10 @@ void codegen_reset()
mem_reset_page_blocks(); mem_reset_page_blocks();
for (c = 0; c < BLOCK_SIZE; c++) for (c = 0; c < BLOCK_SIZE; c++)
{
codeblock[c].pc = BLOCK_PC_INVALID; codeblock[c].pc = BLOCK_PC_INVALID;
codeblock[c].data = &codeblock_data[c * BLOCK_DATA_SIZE];
}
} }
void dump_block() void dump_block()

View file

@ -294,23 +294,27 @@ void codegen_backend_init()
#endif #endif
#if defined WIN32 || defined _WIN32 || defined _WIN32 #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 #else
codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE);
#endif #endif
if (!codeblock) if (!codeblock_data)
fatal("codeblock failed to alloc - %i\n", (BLOCK_SIZE+1) * sizeof(codeblock_t)); 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 *)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *));
memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t));
memset(codeblock_hash, 0, HASH_SIZE * 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].pc = BLOCK_PC_INVALID;
codeblock[c].data = &codeblock_data[c * BLOCK_DATA_SIZE];
}
#if defined(__linux__) || defined(__APPLE__) #if defined(__linux__) || defined(__APPLE__)
start = (void *)((long)codeblock & pagemask); start = (void *)((long)codeblock_data & pagemask);
len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; len = (((BLOCK_SIZE+1) * BLOCK_DATA_SIZE) + pagesize) & pagemask;
if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
{ {
perror("mprotect"); perror("mprotect");

View file

@ -289,23 +289,27 @@ void codegen_backend_init()
#endif #endif
#if defined WIN32 || defined _WIN32 || defined _WIN32 #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 #else
codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE);
#endif #endif
if (!codeblock) if (!codeblock_data)
fatal("codeblock failed to alloc - %i\n", (BLOCK_SIZE+1) * sizeof(codeblock_t)); 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 *)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *));
memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t));
memset(codeblock_hash, 0, HASH_SIZE * 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].pc = BLOCK_PC_INVALID;
codeblock[c].data = &codeblock_data[c * BLOCK_SIZE];
}
#if defined(__linux__) || defined(__APPLE__) #if defined(__linux__) || defined(__APPLE__)
start = (void *)((long)codeblock & pagemask); start = (void *)((long)codeblock_data & pagemask);
len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; len = (((BLOCK_SIZE+1) * BLOCK_DATA_SIZE) + pagesize) & pagemask;
if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
{ {
perror("mprotect"); perror("mprotect");

View file

@ -276,17 +276,21 @@ void codegen_backend_init()
#endif #endif
#if defined WIN32 || defined _WIN32 || defined _WIN32 #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 #else
codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t)); codeblock_data = malloc((BLOCK_SIZE+1) * BLOCK_DATA_SIZE);
#endif #endif
codeblock = malloc((BLOCK_SIZE+1) * sizeof(codeblock_t));
codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *));
memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t));
memset(codeblock_hash, 0, HASH_SIZE * 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; codeblock[c].pc = BLOCK_PC_INVALID;
}
#if defined(__linux__) || defined(__APPLE__) #if defined(__linux__) || defined(__APPLE__)
start = (void *)((long)codeblock & pagemask); start = (void *)((long)codeblock & pagemask);

View file

@ -10,7 +10,7 @@
#define HASH(l) ((l) & 0x1ffff) #define HASH(l) ((l) & 0x1ffff)
/*Hack until better memory management written*/ /*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_EXIT_OFFSET 0x7f0*/
#define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20) #define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20)

View file

@ -261,22 +261,26 @@ void codegen_backend_init()
long pagemask = ~(pagesize - 1); long pagemask = ~(pagesize - 1);
#endif #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)); 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 #endif
codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *));
memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t)); memset(codeblock, 0, (BLOCK_SIZE+1) * sizeof(codeblock_t));
memset(codeblock_hash, 0, HASH_SIZE * 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; codeblock[c].pc = BLOCK_PC_INVALID;
}
#if defined(__linux__) || defined(__APPLE__) #if defined(__linux__) || defined(__APPLE__)
start = (void *)((long)codeblock & pagemask); start = (void *)((long)codeblock_data & pagemask);
len = (((BLOCK_SIZE+1) * sizeof(codeblock_t)) + pagesize) & pagemask; len = (((BLOCK_SIZE+1) * BLOCK_DATA_SIZE) + pagesize) & pagemask;
if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) if (mprotect(start, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
{ {
perror("mprotect"); perror("mprotect");

View file

@ -10,7 +10,8 @@
#define HASH(l) ((l) & 0x1ffff) #define HASH(l) ((l) & 0x1ffff)
/*Hack until better memory management written*/ /*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_EXIT_OFFSET 0x7f0*/
#define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20) #define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20)