Skip to content

Commit 14e80d6

Browse files
authored
Merge pull request #1915 from nicolasnoble/msan-dma
More MSAN features.
2 parents 6e74436 + 3e50878 commit 14e80d6

File tree

8 files changed

+39
-5
lines changed

8 files changed

+39
-5
lines changed

src/core/cdrom.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,7 @@ class CDRomImpl : public PCSX::CDRom {
14661466
memFile->write<uint8_t>(m_transfer[m_transferIndex++]);
14671467
adjustTransferIndex();
14681468
}
1469+
PCSX::g_emulator->m_mem->msanDmaWrite(madr, cdsize);
14691470
if (PCSX::g_emulator->settings.get<PCSX::Emulator::SettingDebugSettings>()
14701471
.get<PCSX::Emulator::DebugSettings::Debug>()) {
14711472
PCSX::g_emulator->m_debug->checkDMAwrite(3, madr, cdsize);

src/core/gdb-server.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,9 @@ static const std::string memoryMap = R"(<?xml version="1.0"?>
270270
<memory type="ram" start="0xffffffff9fc00000" length="0x80000"/>
271271
<memory type="ram" start="0xffffffffbfc00000" length="0x80000"/>
272272
273+
<!-- MSAN -->
274+
<memory type="ram" start="0x0000000020000000" length="0x60000000"/>
275+
273276
<!-- This really is only for 0xfffe0130 -->
274277
<memory type="ram" start="0xfffffffffffe0000" length="0x200"/>
275278
</memory-map>

src/core/gpu.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ void PCSX::GPU::dma(uint32_t madr, uint32_t bcr, uint32_t chcr) { // GPU
514514
size = (bcr >> 16) * (bcr & 0xffff);
515515
directDMARead(ptr, size, madr);
516516
g_emulator->m_cpu->Clear(madr, size);
517+
g_emulator->m_mem->msanDmaWrite(madr, size * 4);
517518
if (g_emulator->settings.get<Emulator::SettingDebugSettings>().get<Emulator::DebugSettings::Debug>()) {
518519
g_emulator->m_debug->checkDMAwrite(2, madr, size * 4);
519520
}

src/core/mdec.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ void PCSX::MDEC::dma1(uint32_t adr, uint32_t bcr, uint32_t chcr) {
480480
size *= 4;
481481
/* I guess the memory speed is limitating */
482482
dmacnt = size;
483+
g_emulator->m_mem->msanDmaWrite(adr, size);
483484
if (g_emulator->settings.get<Emulator::SettingDebugSettings>().get<Emulator::DebugSettings::Debug>()) {
484485
g_emulator->m_debug->checkDMAwrite(1, adr, size);
485486
}

src/core/psxdma.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ void dma4(uint32_t madr, uint32_t bcr, uint32_t chcr) { // SPU
6161
}
6262
size = (bcr >> 16) * (bcr & 0xffff) * 2;
6363
PCSX::g_emulator->m_spu->readDMAMem(ptr, size);
64+
PCSX::g_emulator->m_mem->msanDmaWrite(madr, size * 2);
6465
if (PCSX::g_emulator->settings.get<PCSX::Emulator::SettingDebugSettings>()
6566
.get<PCSX::Emulator::DebugSettings::Debug>()) {
6667
PCSX::g_emulator->m_debug->checkDMAwrite(4, madr, size * 2);
@@ -116,6 +117,7 @@ void dma6(uint32_t madr, uint32_t bcr, uint32_t chcr) {
116117
mem++;
117118
*mem = 0xffffff;
118119
}
120+
PCSX::g_emulator->m_mem->msanDmaWrite(madr, size * 4);
119121
if (PCSX::g_emulator->settings.get<PCSX::Emulator::SettingDebugSettings>()
120122
.get<PCSX::Emulator::DebugSettings::Debug>()) {
121123
PCSX::g_emulator->m_debug->checkDMAwrite(6, madr, size * 4);

src/core/psxmem.cc

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -791,21 +791,39 @@ ssize_t PCSX::Memory::MemoryAsFile::writeAt(const void *src, size_t size, size_t
791791
return ret;
792792
}
793793

794-
void PCSX::Memory::MemoryAsFile::readBlock(void *dest, size_t size, size_t ptr) {
794+
void PCSX::Memory::MemoryAsFile::readBlock(void *dest_, size_t size, size_t ptr) {
795+
auto dest = reinterpret_cast<uint8_t *>(dest_);
795796
auto block = m_memory->m_readLUT[ptr / c_blockSize];
796797
if (!block) {
797798
memset(dest, 0, size);
799+
if (m_memory->msanInitialized()) {
800+
for (size_t i = 0; i < size; ++i) {
801+
size_t msanPtr = ptr + i;
802+
if (inMsanRange(msanPtr) && (m_memory->msanGetStatus<1>(msanPtr) == MsanStatus::OK)) {
803+
dest[i] = m_memory->m_msanRAM[msanPtr - c_msanStart];
804+
}
805+
}
806+
}
798807
return;
799808
}
800809
auto offset = ptr % c_blockSize;
801810
auto toCopy = std::min(size, c_blockSize - offset);
802811
memcpy(dest, block + offset, toCopy);
803812
}
804813

805-
void PCSX::Memory::MemoryAsFile::writeBlock(const void *src, size_t size, size_t ptr) {
814+
void PCSX::Memory::MemoryAsFile::writeBlock(const void *src_, size_t size, size_t ptr) {
806815
// Yes. That's not a bug nor a typo.
816+
auto src = reinterpret_cast<const uint8_t *>(src_);
807817
auto block = m_memory->m_readLUT[ptr / c_blockSize];
808818
if (!block) {
819+
if (m_memory->msanInitialized()) {
820+
for (size_t i = 0; i < size; ++i) {
821+
size_t msanPtr = ptr + i;
822+
if (inMsanRange(msanPtr)) {
823+
m_memory->m_msanRAM[msanPtr - c_msanStart] = src[i];
824+
}
825+
}
826+
}
809827
return;
810828
}
811829
auto offset = ptr % c_blockSize;

src/core/psxmem.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class Memory {
103103
}
104104
bestCase = MsanStatus::UNINITIALIZED;
105105
}
106-
bitmask &= 0xFF;
106+
bitmask &= 0xff;
107107
}
108108
if ((m_msanInitializedBitmap[bitmapIndex] & bitmask) != bitmask) [[unlikely]] {
109109
if ((m_msanUsableBitmap[bitmapIndex] & bitmask) != bitmask) {
@@ -124,7 +124,7 @@ class Memory {
124124
return false;
125125
}
126126
m_msanInitializedBitmap[bitmapIndex + 1] |= nextBitmask;
127-
bitmask &= 0xFF;
127+
bitmask &= 0xff;
128128
}
129129
if ((m_msanUsableBitmap[bitmapIndex] & bitmask) != bitmask) [[unlikely]] {
130130
return false;
@@ -133,6 +133,14 @@ class Memory {
133133
return true;
134134
}
135135

136+
void msanDmaWrite(uint32_t addr, uint32_t size) {
137+
if (!msanInitialized() || !inMsanRange(addr)) return;
138+
addr -= c_msanStart;
139+
for (uint32_t i = 0; i < size; ++i) {
140+
m_msanInitializedBitmap[(addr + i) / 8] |= 1 << ((addr + i) % 8);
141+
}
142+
}
143+
136144
static inline bool inMsanRange(uint32_t addr) { return addr >= c_msanStart && addr < c_msanEnd; }
137145

138146
template <unsigned n>

src/mips/common/crt0/cxxglue.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void cxxmain(int argc, char** argv) {
4949
size_t count, i;
5050

5151
#ifdef USE_PCSXMSAN
52-
pcsx_msanInit();
52+
pcsx_initMsan();
5353
#endif
5454

5555
count = __preinit_array_end - __preinit_array_start;

0 commit comments

Comments
 (0)