diff options
| author | hrydgard <hrydgard@gmail.com> | 2008-09-24 20:47:11 +0000 |
|---|---|---|
| committer | hrydgard <hrydgard@gmail.com> | 2008-09-24 20:47:11 +0000 |
| commit | 08e81eddb97614a4e286a6f35092fe56c16a3113 (patch) | |
| tree | 01d26d48f75e6de46c30f07ec444fff7cdbc3bd1 /Source/Core | |
| parent | 3883ce6ee9df56787d67493a02745dd760e27c6c (diff) | |
Protect dvdread with a critical section, should fix crashes when running ikaruga from a compressed iso. Some coding standard stuff.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@672 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Common/Src/Thread.h | 33 | ||||
| -rw-r--r-- | Source/Core/Core/Src/HW/DVDInterface.cpp | 65 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Src/VolumeGC.cpp | 55 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Src/VolumeGC.h | 40 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Src/VolumeWiiCrypted.h | 46 |
5 files changed, 98 insertions, 141 deletions
diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index 6043215eef..9e351bc839 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -49,13 +49,13 @@ class CriticalSection #elif __GNUC__
pthread_mutex_t mutex;
#endif
- public:
+public:
- CriticalSection(int spincount = 1000);
- ~CriticalSection();
- void Enter();
- bool TryEnter();
- void Leave();
+ CriticalSection(int spincount = 1000);
+ ~CriticalSection();
+ void Enter();
+ bool TryEnter();
+ void Leave();
};
#ifdef _WIN32
@@ -66,23 +66,22 @@ typedef void* (*ThreadFunc)(void* arg); class Thread
{
- public:
+public:
+ Thread(ThreadFunc entry, void* arg);
+ ~Thread();
- Thread(ThreadFunc entry, void* arg);
- ~Thread();
+ void WaitForDeath();
+ void SetAffinity(int mask);
+ static void SetCurrentThreadAffinity(int mask);
- void WaitForDeath();
- void SetAffinity(int mask);
- static void SetCurrentThreadAffinity(int mask);
-
- private:
+private:
#ifdef _WIN32
- HANDLE m_hThread;
- DWORD m_threadId;
+ HANDLE m_hThread;
+ DWORD m_threadId;
#elif __GNUC__
- pthread_t thread_id;
+ pthread_t thread_id;
#endif
};
diff --git a/Source/Core/Core/Src/HW/DVDInterface.cpp b/Source/Core/Core/Src/HW/DVDInterface.cpp index 66d32b0492..7b7aae4220 100644 --- a/Source/Core/Core/Src/HW/DVDInterface.cpp +++ b/Source/Core/Core/Src/HW/DVDInterface.cpp @@ -24,31 +24,32 @@ #include "../PowerPC/PowerPC.h"
#include "PeripheralInterface.h"
#include "Memmap.h"
+#include "Thread.h"
#include "../VolumeHandler.h"
namespace DVDInterface
{
- /*
- 20975: 00000000 DVD (zzz_80146b84 ??, 0x80146bf8) : DVD(r): 0xcc006004
- 20976: 00000000 DVD (zzz_80146b84 ??, 0x80146c00) : DVD(w): 0x00000000 @ 0xcc006004
- 20977: 00000000 DVD (DVDLowRead, 0x801448a8) : DVD(w): 0x00000020 @ 0xcc006018
- 20978: 00000000 DVD (Read, 0x80144744) : DVD(w): 0xa8000000 @ 0xcc006008
- 20979: 00000000 DVD (Read, 0x80144750) : DVD(w): 0x01094227 @ 0xcc00600c
- 20980: 00000000 DVD (Read, 0x80144758) : DVD(w): 0x00000020 @ 0xcc006010
- 20981: 00000000 DVD (Read, 0x8014475c) : DVD(w): 0x8167cc80 @ 0xcc006014
- 20982: 00000000 DVD (Read, 0x80144760) : DVD(w): 0x00000020 @ 0xcc006018
- 20983: 00000000 DVD (Read, 0x80144768) : DVD(w): 0x00000003 @ 0xcc00601c
- 20984: 00000000 DVD: DVD: Read ISO: DVDOffset=0425089c, DMABuffer=0167cc80, SrcLength=00000020, DMALength=00000020
- 20989: 00000000 DVD (zzz_801442fc ??, 0x80144388) : DVD(r): 0xcc006000
- 20990: 00000000 DVD (zzz_801442fc ??, 0x801443d8) : DVD(w): 0x0000003a @ 0xcc006000
- 20992: 00000000 DVD (zzz_801442fc ??, 0x801444d0) : DVD(w): 0x00000000 @ 0xcc006004
- 20993: 00000000 DVD (zzz_80146e44 ??, 0x80146fcc) : DVD(r): 0xcc006018
-
- After this, Cubivore infinitely calls DVDGetDriveStatus, which does not even
- bother to check any DVD regs. Waiting for interrupt?
- */
+/*
+20975: 00000000 DVD (zzz_80146b84 ??, 0x80146bf8) : DVD(r): 0xcc006004
+20976: 00000000 DVD (zzz_80146b84 ??, 0x80146c00) : DVD(w): 0x00000000 @ 0xcc006004
+20977: 00000000 DVD (DVDLowRead, 0x801448a8) : DVD(w): 0x00000020 @ 0xcc006018
+20978: 00000000 DVD (Read, 0x80144744) : DVD(w): 0xa8000000 @ 0xcc006008
+20979: 00000000 DVD (Read, 0x80144750) : DVD(w): 0x01094227 @ 0xcc00600c
+20980: 00000000 DVD (Read, 0x80144758) : DVD(w): 0x00000020 @ 0xcc006010
+20981: 00000000 DVD (Read, 0x8014475c) : DVD(w): 0x8167cc80 @ 0xcc006014
+20982: 00000000 DVD (Read, 0x80144760) : DVD(w): 0x00000020 @ 0xcc006018
+20983: 00000000 DVD (Read, 0x80144768) : DVD(w): 0x00000003 @ 0xcc00601c
+20984: 00000000 DVD: DVD: Read ISO: DVDOffset=0425089c, DMABuffer=0167cc80, SrcLength=00000020, DMALength=00000020
+20989: 00000000 DVD (zzz_801442fc ??, 0x80144388) : DVD(r): 0xcc006000
+20990: 00000000 DVD (zzz_801442fc ??, 0x801443d8) : DVD(w): 0x0000003a @ 0xcc006000
+20992: 00000000 DVD (zzz_801442fc ??, 0x801444d0) : DVD(w): 0x00000000 @ 0xcc006004
+20993: 00000000 DVD (zzz_80146e44 ??, 0x80146fcc) : DVD(r): 0xcc006018
+
+After this, Cubivore infinitely calls DVDGetDriveStatus, which does not even
+bother to check any DVD regs. Waiting for interrupt?
+*/
// internal hardware addresses
enum
@@ -178,6 +179,8 @@ DVDMemStruct dvdMem; u32 g_ErrorCode = 0x00;
bool g_bDiscInside = true;
+Common::CriticalSection dvdread_section;
+
void DoState(PointerWrap &p)
{
p.Do(dvdMem);
@@ -238,7 +241,11 @@ bool IsLidOpen() bool DVDRead(u32 _iDVDOffset, u32 _iRamAddress, u32 _iLength)
{
- return VolumeHandler::ReadToPtr(Memory::GetPointer(_iRamAddress), _iDVDOffset, _iLength);
+ // We won't need the crit sec when DTK streaming has been rewritten correctly.
+ dvdread_section.Enter();
+ bool retval = VolumeHandler::ReadToPtr(Memory::GetPointer(_iRamAddress), _iDVDOffset, _iLength);
+ dvdread_section.Leave();
+ return retval;
}
bool DVDReadADPCM(u8* _pDestBuffer, u32 _iNumSamples)
@@ -430,7 +437,7 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg) // u32 sourcelength = dvdMem.Command[2];
#endif
u32 destbuffer = dvdMem.DMAAddress.Address;
- u32 destlength = dvdMem.DMALength.Length; + u32 destlength = dvdMem.DMALength.Length;
dvdMem.DMALength.Length = 0;
LOG(DVDINTERFACE, "[WARNING] DVD: Get drive info offset=%08x, destbuffer=%08x, destlength=%08x", offset * 4, destbuffer, destlength);
@@ -455,12 +462,12 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg) if (g_bDiscInside)
{
u32 iDVDOffset = dvdMem.Command[1] << 2;
- u32 iSrcLength = dvdMem.Command[2]; - if (false) { iSrcLength++; } // avoid warning
+ u32 iSrcLength = dvdMem.Command[2];
+ if (false) { iSrcLength++; } // avoid warning << wtf is this?
LOG(DVDINTERFACE, "DVD: Read ISO: DVDOffset=%08x, DMABuffer=%08x, SrcLength=%08x, DMALength=%08x",iDVDOffset,dvdMem.DMAAddress.Address,iSrcLength,dvdMem.DMALength.Length);
_dbg_assert_(DVDINTERFACE, iSrcLength == dvdMem.DMALength.Length);
- if (VolumeHandler::ReadToPtr(Memory::GetPointer(dvdMem.DMAAddress.Address), iDVDOffset, dvdMem.DMALength.Length) != true)
+ if (DVDRead(iDVDOffset, dvdMem.DMAAddress.Address, dvdMem.DMALength.Length) != true)
{
PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error");
}
@@ -481,9 +488,9 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg) // Command0 <- Position on DVD shr 2
//=========================================================================================================
case 0xAB:
- { + {
#ifdef LOGGING
- u32 offset = dvdMem.Command[1] << 2; + u32 offset = dvdMem.Command[1] << 2;
#endif
LOG(DVDINTERFACE, "DVD: Trying to seek: offset=%08x", offset);
}
@@ -514,9 +521,9 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg) // ugly hack to catch the disable command
if (dvdMem.Command[1]!=0)
- { + {
#ifdef LOGGING
- u8 subCommand = (dvdMem.Command[0] & 0x00FF0000) >> 16; + u8 subCommand = (dvdMem.Command[0] & 0x00FF0000) >> 16;
#endif
dvdMem.AudioPos = dvdMem.Command[1] << 2;
@@ -587,4 +594,4 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg) g_ErrorCode = 0x00;
}
-} // namespace +} // namespace
diff --git a/Source/Core/DiscIO/Src/VolumeGC.cpp b/Source/Core/DiscIO/Src/VolumeGC.cpp index 3092f405c3..f942898e42 100644 --- a/Source/Core/DiscIO/Src/VolumeGC.cpp +++ b/Source/Core/DiscIO/Src/VolumeGC.cpp @@ -26,55 +26,37 @@ CVolumeGC::CVolumeGC(IBlobReader* _pReader) : m_pReader(_pReader)
{}
-
CVolumeGC::~CVolumeGC()
{
delete m_pReader;
}
-
-bool
-CVolumeGC::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
+bool CVolumeGC::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
{
if (m_pReader == NULL)
- {
- return(false);
- }
-
- return(m_pReader->Read(_Offset, _Length, _pBuffer));
+ return false;
+ return m_pReader->Read(_Offset, _Length, _pBuffer);
}
-
-std::string
-CVolumeGC::GetName() const
+std::string CVolumeGC::GetName() const
{
if (m_pReader == NULL)
- {
- return(false);
- }
+ return false;
char Name[128];
-
if (!Read(0x20, 0x60, (u8*)&Name))
- {
- return(false);
- }
+ return false;
- return(Name);
+ return Name;
}
-
-std::string
-CVolumeGC::GetUniqueID() const
+std::string CVolumeGC::GetUniqueID() const
{
static const std::string NO_UID("NO_UID");
if (m_pReader == NULL)
- {
return NO_UID;
- }
char id[6];
-
if (!Read(0, sizeof(id), reinterpret_cast<u8*>(id)))
{
PanicAlert("Failed to read unique ID from disc image");
@@ -84,14 +66,10 @@ CVolumeGC::GetUniqueID() const return std::string(id, sizeof(id));
}
-
-IVolume::ECountry
-CVolumeGC::GetCountry() const
+IVolume::ECountry CVolumeGC::GetCountry() const
{
if (!m_pReader)
- {
- return(COUNTRY_UNKNOWN);
- }
+ return COUNTRY_UNKNOWN;
u8 CountryCode;
m_pReader->Read(3, 1, &CountryCode);
@@ -141,17 +119,12 @@ CVolumeGC::GetCountry() const return(country);
}
-
-u64
-CVolumeGC::GetSize() const
+u64 CVolumeGC::GetSize() const
{
if (m_pReader)
- {
- return((size_t)m_pReader->GetDataSize());
- }
+ return (size_t)m_pReader->GetDataSize();
else
- {
- return(0);
- }
+ return 0;
}
+
} // namespace
diff --git a/Source/Core/DiscIO/Src/VolumeGC.h b/Source/Core/DiscIO/Src/VolumeGC.h index d481c7818b..a29f30db29 100644 --- a/Source/Core/DiscIO/Src/VolumeGC.h +++ b/Source/Core/DiscIO/Src/VolumeGC.h @@ -20,35 +20,23 @@ #include "Volume.h"
#include "Blob.h"
-//
-// --- this volume type is used for GC and for decrypted Wii images ---
-//
+// --- this volume type is used for GC disc images ---
namespace DiscIO
{
-class CVolumeGC
- : public IVolume
+class CVolumeGC : public IVolume
{
- public:
-
- CVolumeGC(IBlobReader* _pReader);
-
- ~CVolumeGC();
-
- bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
-
- std::string GetName() const;
-
- std::string GetUniqueID() const;
-
- ECountry GetCountry() const;
-
- u64 GetSize() const;
-
-
- private:
-
- IBlobReader* m_pReader;
+public:
+ CVolumeGC(IBlobReader* _pReader);
+ ~CVolumeGC();
+ bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
+ std::string GetName() const;
+ std::string GetUniqueID() const;
+ ECountry GetCountry() const;
+ u64 GetSize() const;
+
+private:
+ IBlobReader* m_pReader;
};
-} // namespace
+} // namespace
diff --git a/Source/Core/DiscIO/Src/VolumeWiiCrypted.h b/Source/Core/DiscIO/Src/VolumeWiiCrypted.h index aef579b0e8..63e9cad76e 100644 --- a/Source/Core/DiscIO/Src/VolumeWiiCrypted.h +++ b/Source/Core/DiscIO/Src/VolumeWiiCrypted.h @@ -22,43 +22,33 @@ #include "Blob.h"
#include "AES/aes.h"
-//
// --- this volume type is used for encrypted Wii images ---
-//
+
namespace DiscIO
{
-class CVolumeWiiCrypted
- : public IVolume
+class CVolumeWiiCrypted : public IVolume
{
- public:
-
- CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey);
-
- ~CVolumeWiiCrypted();
-
- bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
-
- std::string GetName() const;
-
- std::string GetUniqueID() const;
+public:
+ CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey);
+ ~CVolumeWiiCrypted();
+ bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
+ std::string GetName() const;
+ std::string GetUniqueID() const;
+ ECountry GetCountry() const;
+ u64 GetSize() const;
- ECountry GetCountry() const;
+private:
+ IBlobReader* m_pReader;
- u64 GetSize() const;
+ u8* m_pBuffer;
+ AES_KEY m_AES_KEY;
+ u64 m_VolumeOffset;
- private:
-
- IBlobReader* m_pReader;
-
- u8* m_pBuffer;
- AES_KEY m_AES_KEY;
-
- u64 m_VolumeOffset;
-
- mutable u64 m_LastDecryptedBlockOffset;
- mutable unsigned char m_LastDecryptedBlock[0x8000];
+ mutable u64 m_LastDecryptedBlockOffset;
+ mutable unsigned char m_LastDecryptedBlock[0x8000];
};
+
} // namespace
#endif
|
