From: Frode Solheim Date: Sat, 5 Sep 2015 09:13:50 +0000 (+0200) Subject: ppc.cpp: FS-UAE compat update + trivial changes X-Git-Tag: 3200~87^2~1 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=280cea73067c607bdf02844af29342ea15168ad7;p=francis%2Fwinuae.git ppc.cpp: FS-UAE compat update + trivial changes --- diff --git a/ppc/ppc.cpp b/ppc/ppc.cpp index 85984eae..8e9f8639 100644 --- a/ppc/ppc.cpp +++ b/ppc/ppc.cpp @@ -4,6 +4,7 @@ #include "options.h" #include "threaddep/thread.h" +#include "machdep/rpt.h" #include "memory.h" #include "cpuboard.h" #include "debug.h" @@ -12,9 +13,8 @@ #include "gui.h" #include "autoconf.h" #include "uae/dlopen.h" - +#include "uae/log.h" #include "uae/ppc.h" - #include "uae/qemu.h" #define SPINLOCK_DEBUG 0 @@ -31,30 +31,39 @@ #define TRACE(format, ...) write_log(_T("PPC: ") format, ## __VA_ARGS__) +#ifdef WINUAE +#define WIN32_SPINLOCK +#endif + #if SPINLOCK_DEBUG static volatile int spinlock_cnt; #endif static volatile bool ppc_spinlock_waiting; -#ifdef _WIN32 + +#ifdef WIN32_SPINLOCK #define CRITICAL_SECTION_SPIN_COUNT 5000 static CRITICAL_SECTION ppc_cs1, ppc_cs2; static bool ppc_cs_initialized; #else #include -static GMutex mutex; +static GMutex mutex, mutex2; #endif void uae_ppc_spinlock_get(void) { -#ifdef _WIN32 +#ifdef WIN32_SPINLOCK EnterCriticalSection(&ppc_cs2); ppc_spinlock_waiting = true; EnterCriticalSection(&ppc_cs1); ppc_spinlock_waiting = false; LeaveCriticalSection(&ppc_cs2); #else + g_mutex_lock(&mutex2); + ppc_spinlock_waiting = true; g_mutex_lock(&mutex); + ppc_spinlock_waiting = false; + g_mutex_unlock(&mutex2); #endif #if SPINLOCK_DEBUG if (spinlock_cnt != 0) @@ -62,6 +71,7 @@ void uae_ppc_spinlock_get(void) spinlock_cnt++; #endif } + void uae_ppc_spinlock_release(void) { #if SPINLOCK_DEBUG @@ -69,7 +79,7 @@ void uae_ppc_spinlock_release(void) write_log(_T("uae_ppc_spinlock_release %d!\n"), spinlock_cnt); spinlock_cnt--; #endif -#ifdef _WIN32 +#ifdef WIN32_SPINLOCK LeaveCriticalSection(&ppc_cs1); #else g_mutex_unlock(&mutex); @@ -78,22 +88,21 @@ void uae_ppc_spinlock_release(void) static void uae_ppc_spinlock_create(void) { +#ifdef WIN32_SPINLOCK #if SPINLOCK_DEBUG write_log(_T("uae_ppc_spinlock_create\n")); #endif -#ifdef _WIN32 if (ppc_cs_initialized) { DeleteCriticalSection(&ppc_cs1); DeleteCriticalSection(&ppc_cs2); } InitializeCriticalSectionAndSpinCount(&ppc_cs1, CRITICAL_SECTION_SPIN_COUNT); InitializeCriticalSectionAndSpinCount(&ppc_cs2, CRITICAL_SECTION_SPIN_COUNT); -#else -#endif #if SPINLOCK_DEBUG spinlock_cnt = 0; #endif ppc_cs_initialized = true; +#endif } volatile int ppc_state; @@ -126,6 +135,7 @@ static void PPCCALL dummy_ppc_cpu_run_single(int count) { } static void PPCCALL dummy_ppc_cpu_pause(int pause) { + UAE_LOG_STUB("pause=%d\n", pause); } /* Functions typedefs for PPC implementation */ @@ -378,10 +388,11 @@ static void initialize(void) static void map_banks(void) { - if (impl.map_memory == NULL) + if (impl.map_memory == NULL) { return; -/* - * Use NULL to get callbacks to uae_ppc_io_mem_read/write. Use real + } + /* + * Use NULL for memory to get callbacks for read/write. Use real * memory address for direct access to RAM banks (looks like this * is needed by JIT, or at least more work is needed on QEmu Side * to allow all memory access to go via callbacks). @@ -409,7 +420,7 @@ static void map_banks(void) } for (int i = 0; i < map.num_regions; i++) { - free((void*)regions[i].name); + free(regions[i].name); } } @@ -432,7 +443,7 @@ static void set_and_wait_for_state(int state, int unlock) } impl.set_state(state); if (impl.in_cpu_thread() == false) { - uae_ppc_spinlock_get(); + uae_ppc_spinlock_get(); } } } @@ -448,6 +459,7 @@ void ppc_map_banks(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr, b { if (ppc_state == PPC_STATE_INACTIVE || !impl.map_memory) return; + PPCMemoryRegion r; r.start = start; r.size = size; @@ -507,17 +519,17 @@ static void cpu_init(void) impl.init_pvr(pvr); return; } + /* QEMU: CPU has already been initialized by qemu_uae_init */ } static void uae_ppc_cpu_reset(void) { - static bool ppc_cpu_init_done; - TRACE(_T("uae_ppc_cpu_reset\n")); - + initialize(); + static bool ppc_cpu_init_done; if (!ppc_cpu_init_done) { write_log(_T("PPC: Hard reset\n")); cpu_init(); @@ -819,14 +831,12 @@ bool uae_ppc_cpu_unlock(void) void uae_ppc_wakeup(void) { - //TRACE(_T("uae_ppc_wakeup\n")); if (ppc_state == PPC_STATE_SLEEP) ppc_state = PPC_STATE_ACTIVE; } void uae_ppc_interrupt(bool active) { - //TRACE(_T("uae_ppc_interrupt\n")); if (using_pearpc()) { if (active) { impl.atomic_raise_ext_exception(); @@ -835,7 +845,7 @@ void uae_ppc_interrupt(bool active) impl.atomic_cancel_ext_exception(); } return; - } + } PPCLockStatus status = get_ppc_lock(PPC_KEEP_SPINLOCK); impl.external_interrupt(active); @@ -893,6 +903,6 @@ void uae_ppc_pause(int pause) #if 0 else if (impl.pause) { impl.pause(pause); - } + } #endif }