#include "options.h"
#include "threaddep/thread.h"
+#include "machdep/rpt.h"
#include "memory.h"
#include "cpuboard.h"
#include "debug.h"
#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
#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 <glib.h>
-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)
spinlock_cnt++;
#endif
}
+
void uae_ppc_spinlock_release(void)
{
#if SPINLOCK_DEBUG
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);
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;
static void PPCCALL dummy_ppc_cpu_pause(int pause)
{
+ UAE_LOG_STUB("pause=%d\n", pause);
}
/* Functions typedefs for PPC implementation */
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).
}
for (int i = 0; i < map.num_regions; i++) {
- free((void*)regions[i].name);
+ free(regions[i].name);
}
}
}
impl.set_state(state);
if (impl.in_cpu_thread() == false) {
- uae_ppc_spinlock_get();
+ uae_ppc_spinlock_get();
}
}
}
{
if (ppc_state == PPC_STATE_INACTIVE || !impl.map_memory)
return;
+
PPCMemoryRegion r;
r.start = start;
r.size = size;
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();
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();
impl.atomic_cancel_ext_exception();
}
return;
- }
+ }
PPCLockStatus status = get_ppc_lock(PPC_KEEP_SPINLOCK);
impl.external_interrupt(active);
#if 0
else if (impl.pause) {
impl.pause(pause);
- }
+ }
#endif
}