Move dynarec code memory out of codeblock structure.
This commit is contained in:
parent
356f406b22
commit
d63176e472
8 changed files with 51 additions and 26 deletions
|
|
@ -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*/
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue