]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
ppc.cpp: FS-UAE compat update + trivial changes
authorFrode Solheim <frode@fs-uae.net>
Sat, 5 Sep 2015 09:13:50 +0000 (11:13 +0200)
committerFrode Solheim <frode@fs-uae.net>
Sat, 5 Sep 2015 09:13:50 +0000 (11:13 +0200)
ppc/ppc.cpp

index 85984eaeabe8396fbb392424c07cbe7a5088117f..8e9f8639e77afd4ee6ebb3979e1088831e73e6b9 100644 (file)
@@ -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
 
 #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)
@@ -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
 }