mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
drc: some portability fixes
This commit is contained in:
parent
2446536be5
commit
c25d78eec1
5 changed files with 36 additions and 22 deletions
|
@ -6,10 +6,8 @@
|
|||
* See COPYING file in the top-level directory.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#ifdef __linux__
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#include <pico/pico.h>
|
||||
#include "cmn.h"
|
||||
|
||||
u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE];
|
||||
|
@ -17,20 +15,9 @@ u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE];
|
|||
|
||||
void drc_cmn_init(void)
|
||||
{
|
||||
#ifdef __linux__
|
||||
void *tmp;
|
||||
|
||||
tmp = mmap(tcache, DRC_TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
||||
printf("mmap tcache: %p, asked %p\n", tmp, tcache);
|
||||
#endif
|
||||
plat_mem_set_exec(tcache, sizeof(tcache));
|
||||
}
|
||||
|
||||
void drc_cmn_cleanup(void)
|
||||
{
|
||||
#ifdef __linux__
|
||||
int ret;
|
||||
ret = munmap(tcache, DRC_TCACHE_SIZE);
|
||||
printf("munmap tcache: %i\n", ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -431,6 +431,12 @@ static void REGPARM(3) *dr_lookup_block(u32 pc, int is_slave, int *tcache_id)
|
|||
return block;
|
||||
}
|
||||
|
||||
static void *dr_failure(void)
|
||||
{
|
||||
lprintf("recompilation failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void *dr_prepare_ext_branch(u32 pc, SH2 *sh2, int tcache_id)
|
||||
{
|
||||
#if LINK_BRANCHES
|
||||
|
@ -1126,13 +1132,15 @@ static void emit_do_static_regs(int is_write, int tmpr)
|
|||
|
||||
static void emit_block_entry(void)
|
||||
{
|
||||
int arg0, arg1, arg2;
|
||||
int arg0;
|
||||
|
||||
host_arg2reg(arg0, 0);
|
||||
|
||||
#if (DRC_DEBUG & 8) || defined(PDB)
|
||||
int arg1, arg2;
|
||||
host_arg2reg(arg1, 1);
|
||||
host_arg2reg(arg2, 2);
|
||||
|
||||
#if (DRC_DEBUG & 8) || defined(PDB)
|
||||
emit_do_static_regs(1, arg2);
|
||||
emith_move_r_r(arg1, CONTEXT_REG);
|
||||
emith_move_r_r(arg2, rcache_get_reg(SHR_SR, RC_GR_READ));
|
||||
|
@ -1296,10 +1304,16 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id)
|
|||
pc = branch_target_pc[i];
|
||||
if (base_pc <= pc && pc <= end_pc && !(OP_FLAGS(pc) & OF_DELAY_OP))
|
||||
branch_target_pc[tmp++] = branch_target_pc[i];
|
||||
|
||||
if (i == branch_target_count - 1) // workaround gcc 4.5.2 bug?
|
||||
break;
|
||||
}
|
||||
|
||||
branch_target_count = tmp;
|
||||
memset(branch_target_ptr, 0, sizeof(branch_target_ptr[0]) * branch_target_count);
|
||||
memset(branch_target_blkid, 0, sizeof(branch_target_blkid[0]) * branch_target_count);
|
||||
if (branch_target_count > 0) {
|
||||
memset(branch_target_ptr, 0, sizeof(branch_target_ptr[0]) * branch_target_count);
|
||||
memset(branch_target_blkid, 0, sizeof(branch_target_blkid[0]) * branch_target_count);
|
||||
}
|
||||
|
||||
// -------------------------------------------------
|
||||
// 2nd pass: actual compilation
|
||||
|
@ -2702,7 +2716,7 @@ static void sh2_generate_utils(void)
|
|||
emith_call(sh2_translate);
|
||||
emit_block_entry();
|
||||
// XXX: can't translate, fail
|
||||
emith_call(exit);
|
||||
emith_call(dr_failure);
|
||||
|
||||
// sh2_drc_test_irq(void)
|
||||
// assumes it's called from main function (may jump to dispatcher)
|
||||
|
|
|
@ -37,6 +37,7 @@ extern void cache_flush_d_inval_i(void *start_addr, void *end_addr);
|
|||
extern void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed);
|
||||
extern void *plat_mremap(void *ptr, size_t oldsize, size_t newsize);
|
||||
extern void plat_munmap(void *ptr, size_t size);
|
||||
extern int plat_mem_set_exec(void *ptr, size_t size);
|
||||
|
||||
// this one should handle display mode changes
|
||||
extern void emu_video_mode_change(int start_line, int line_count, int is_32cols);
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit c2981fc0ee15d3b1aff69901550fda32460bb1b1
|
||||
Subproject commit 6282e17ef5f37915df1a77b5d7138c666e94d0fb
|
|
@ -11,6 +11,7 @@
|
|||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <errno.h>
|
||||
#ifdef __MACH__
|
||||
#include <libkern/OSCacheControl.h>
|
||||
#endif
|
||||
|
@ -71,8 +72,10 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed)
|
|||
|
||||
req = (void *)addr;
|
||||
ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0);
|
||||
if (ret == MAP_FAILED)
|
||||
if (ret == MAP_FAILED) {
|
||||
lprintf("mmap(%08lx, %zd) failed: %d\n", addr, size, errno);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (addr != 0 && ret != (void *)addr) {
|
||||
lprintf("warning: wanted to map @%08lx, got %p\n",
|
||||
|
@ -102,6 +105,15 @@ void plat_munmap(void *ptr, size_t size)
|
|||
munmap(ptr, size);
|
||||
}
|
||||
|
||||
int plat_mem_set_exec(void *ptr, size_t size)
|
||||
{
|
||||
int ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
if (ret != 0)
|
||||
lprintf("mprotect(%p, %zd) failed: %d\n", ptr, size, errno);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void emu_video_mode_change(int start_line, int line_count, int is_32cols)
|
||||
{
|
||||
memset(vout_buf, 0, 320 * 240 * 2);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue