DSPCore: Make the mailbox registers atomic.
This commit is contained in:
parent
787b861121
commit
5db7d4d1d5
|
@ -6,6 +6,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <atomic>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -238,7 +239,7 @@ struct SDSP
|
||||||
u64 step_counter;
|
u64 step_counter;
|
||||||
|
|
||||||
// Mailbox.
|
// Mailbox.
|
||||||
volatile u32 mbox[2];
|
std::atomic<u32> mbox[2];
|
||||||
|
|
||||||
// Accelerator / DMA / other hardware registers. Not GPRs.
|
// Accelerator / DMA / other hardware registers. Not GPRs.
|
||||||
u16 ifx_regs[256];
|
u16 ifx_regs[256];
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "Common/Atomic.h"
|
#include "Common/CommonFuncs.h"
|
||||||
#include "Common/CPUDetect.h"
|
#include "Common/CPUDetect.h"
|
||||||
#include "Common/Intrinsics.h"
|
#include "Common/Intrinsics.h"
|
||||||
#include "Common/MemoryUtil.h"
|
#include "Common/MemoryUtil.h"
|
||||||
|
@ -26,25 +26,29 @@ void gdsp_ifx_init()
|
||||||
g_dsp.ifx_regs[i] = 0;
|
g_dsp.ifx_regs[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_dsp.mbox[0] = 0;
|
g_dsp.mbox[0].store(0);
|
||||||
g_dsp.mbox[1] = 0;
|
g_dsp.mbox[1].store(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 gdsp_mbox_peek(u8 mbx)
|
u32 gdsp_mbox_peek(u8 mbx)
|
||||||
{
|
{
|
||||||
return Common::AtomicLoad(g_dsp.mbox[mbx]);
|
return g_dsp.mbox[mbx].load();
|
||||||
}
|
}
|
||||||
|
|
||||||
void gdsp_mbox_write_h(u8 mbx, u16 val)
|
void gdsp_mbox_write_h(u8 mbx, u16 val)
|
||||||
{
|
{
|
||||||
const u32 new_value = (Common::AtomicLoadAcquire(g_dsp.mbox[mbx]) & 0xffff) | (val << 16);
|
const u32 old_value = g_dsp.mbox[mbx].load(std::memory_order_acquire);
|
||||||
Common::AtomicStoreRelease(g_dsp.mbox[mbx], new_value & ~0x80000000);
|
const u32 new_value = (old_value & 0xffff) | (val << 16);
|
||||||
|
|
||||||
|
g_dsp.mbox[mbx].store(new_value & ~0x80000000, std::memory_order_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gdsp_mbox_write_l(u8 mbx, u16 val)
|
void gdsp_mbox_write_l(u8 mbx, u16 val)
|
||||||
{
|
{
|
||||||
const u32 new_value = (Common::AtomicLoadAcquire(g_dsp.mbox[mbx]) & ~0xffff) | val;
|
const u32 old_value = g_dsp.mbox[mbx].load(std::memory_order_acquire);
|
||||||
Common::AtomicStoreRelease(g_dsp.mbox[mbx], new_value | 0x80000000);
|
const u32 new_value = (old_value & ~0xffff) | val;
|
||||||
|
|
||||||
|
g_dsp.mbox[mbx].store(new_value | 0x80000000, std::memory_order_release);
|
||||||
|
|
||||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||||
if (mbx == GDSP_MBOX_DSP)
|
if (mbx == GDSP_MBOX_DSP)
|
||||||
|
@ -63,13 +67,13 @@ u16 gdsp_mbox_read_h(u8 mbx)
|
||||||
return 0x8054;
|
return 0x8054;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (u16)(Common::AtomicLoad(g_dsp.mbox[mbx]) >> 16); // TODO: mask away the top bit?
|
return (u16)(g_dsp.mbox[mbx].load() >> 16); // TODO: mask away the top bit?
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 gdsp_mbox_read_l(u8 mbx)
|
u16 gdsp_mbox_read_l(u8 mbx)
|
||||||
{
|
{
|
||||||
const u32 value = Common::AtomicLoadAcquire(g_dsp.mbox[mbx]);
|
const u32 value = g_dsp.mbox[mbx].load(std::memory_order_acquire);
|
||||||
Common::AtomicStoreRelease(g_dsp.mbox[mbx], value & ~0x80000000);
|
g_dsp.mbox[mbx].store(value & ~0x80000000, std::memory_order_release);
|
||||||
|
|
||||||
if (init_hax && mbx)
|
if (init_hax && mbx)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue