Added somme comments and cases for missing ES and NET commands, no actual fixes so far
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1314 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
3b67df1b45
commit
717aa36034
|
@ -129,7 +129,7 @@ void PrintCallstack(LogTypes::LOG_TYPE _Log)
|
||||||
const char *str = g_symbolDB.GetDescription(func);
|
const char *str = g_symbolDB.GetDescription(func);
|
||||||
if (!str || strlen(str) == 0 || !strcmp(str, "Invalid"))
|
if (!str || strlen(str) == 0 || !strcmp(str, "Invalid"))
|
||||||
str = "(unknown)";
|
str = "(unknown)";
|
||||||
__Log(_Log, " * %s [ addr = %08x ]\n", str, func);
|
__Logv(_Log, 3, " * %s [ addr = %08x ]\n", str, func);
|
||||||
addr = Memory::ReadUnchecked_U32(addr);
|
addr = Memory::ReadUnchecked_U32(addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,37 +49,56 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* A struct for IOS ioctlv calls */
|
||||||
|
// ----------------
|
||||||
struct SIOCtlVBuffer
|
struct SIOCtlVBuffer
|
||||||
{
|
{
|
||||||
SIOCtlVBuffer(u32 _Address)
|
SIOCtlVBuffer(u32 _Address)
|
||||||
: m_Address(_Address)
|
: m_Address(_Address)
|
||||||
{
|
{
|
||||||
Parameter = Memory::Read_U32(m_Address + 0x0C);
|
/* These are the Ioctlv parameters in the IOS communication. The BufferVector
|
||||||
NumberInBuffer = Memory::Read_U32(m_Address + 0x10);
|
is a memory address offset at where the in and out buffer addresses are
|
||||||
NumberPayloadBuffer = Memory::Read_U32(m_Address + 0x14);
|
stored. */
|
||||||
BufferVector = Memory::Read_U32(m_Address + 0x18);
|
Parameter = Memory::Read_U32(m_Address + 0x0C); // command 3
|
||||||
BufferSize = Memory::Read_U32(m_Address + 0x1C);
|
NumberInBuffer = Memory::Read_U32(m_Address + 0x10); // 4
|
||||||
|
NumberPayloadBuffer = Memory::Read_U32(m_Address + 0x14); // 5
|
||||||
|
BufferVector = Memory::Read_U32(m_Address + 0x18); // 6
|
||||||
|
BufferSize = Memory::Read_U32(m_Address + 0x1C); // 7
|
||||||
|
|
||||||
|
// The start of the out buffer
|
||||||
u32 BufferVectorOffset = BufferVector;
|
u32 BufferVectorOffset = BufferVector;
|
||||||
for (u32 i=0; i<NumberInBuffer; i++)
|
|
||||||
|
//if(Parameter = 0x1d) PanicAlert("%i: %i", Parameter, NumberInBuffer);
|
||||||
|
|
||||||
|
// Write the address and size for all in messages
|
||||||
|
for (u32 i = 0; i < NumberInBuffer; i++)
|
||||||
{
|
{
|
||||||
SBuffer Buffer;
|
SBuffer Buffer;
|
||||||
Buffer.m_Address = Memory::Read_U32(BufferVectorOffset);
|
Buffer.m_Address = Memory::Read_U32(BufferVectorOffset);
|
||||||
//restore cached address, mauled by emulatee's ioctl functions.
|
// Restore cached address, mauled by emulatee's ioctl functions.
|
||||||
Memory::Write_U32(Buffer.m_Address | 0x80000000, BufferVectorOffset);
|
Memory::Write_U32(Buffer.m_Address | 0x80000000, BufferVectorOffset);
|
||||||
BufferVectorOffset += 4;
|
BufferVectorOffset += 4;
|
||||||
Buffer.m_Size = Memory::Read_U32(BufferVectorOffset); BufferVectorOffset += 4;
|
|
||||||
LOG(WII_IPC_HLE, "SIOCtlVBuffer in%i: 0x%08x, 0x%x", i, Buffer.m_Address, Buffer.m_Size);
|
Buffer.m_Size = Memory::Read_U32(BufferVectorOffset);
|
||||||
|
BufferVectorOffset += 4;
|
||||||
|
LOGV(WII_IPC_HLE, 3, "SIOCtlVBuffer in%i: 0x%08x, 0x%x",
|
||||||
|
i, Buffer.m_Address, Buffer.m_Size);
|
||||||
InBuffer.push_back(Buffer);
|
InBuffer.push_back(Buffer);
|
||||||
}
|
}
|
||||||
for (u32 i=0; i<NumberPayloadBuffer; i++)
|
|
||||||
|
// Write the address and size for all out or in-out messages
|
||||||
|
for (u32 i = 0; i < NumberPayloadBuffer; i++)
|
||||||
{
|
{
|
||||||
SBuffer Buffer;
|
SBuffer Buffer;
|
||||||
Buffer.m_Address = Memory::Read_U32(BufferVectorOffset);
|
Buffer.m_Address = Memory::Read_U32(BufferVectorOffset);
|
||||||
Memory::Write_U32(Buffer.m_Address | 0x80000000, BufferVectorOffset);
|
Memory::Write_U32(Buffer.m_Address | 0x80000000, BufferVectorOffset);
|
||||||
BufferVectorOffset += 4;
|
BufferVectorOffset += 4;
|
||||||
Buffer.m_Size = Memory::Read_U32(BufferVectorOffset); BufferVectorOffset += 4;
|
|
||||||
LOG(WII_IPC_HLE, "SIOCtlVBuffer io%i: 0x%08x, 0x%x", i, Buffer.m_Address, Buffer.m_Size);
|
Buffer.m_Size = Memory::Read_U32(BufferVectorOffset);
|
||||||
|
BufferVectorOffset += 4;
|
||||||
|
LOGV(WII_IPC_HLE, 3, "SIOCtlVBuffer io%i: 0x%08x, 0x%x",
|
||||||
|
i, Buffer.m_Address, Buffer.m_Size);
|
||||||
PayloadBuffer.push_back(Buffer);
|
PayloadBuffer.push_back(Buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,19 +112,32 @@ protected:
|
||||||
u32 BufferVector;
|
u32 BufferVector;
|
||||||
u32 BufferSize;
|
u32 BufferSize;
|
||||||
|
|
||||||
|
|
||||||
struct SBuffer { u32 m_Address, m_Size; };
|
struct SBuffer { u32 m_Address, m_Size; };
|
||||||
std::vector<SBuffer> InBuffer;
|
std::vector<SBuffer> InBuffer;
|
||||||
std::vector<SBuffer> PayloadBuffer;
|
std::vector<SBuffer> PayloadBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* Write out the IPC struct from _CommandAddress to _NumberOfCommands numbers
|
||||||
|
of 4 byte commands. */
|
||||||
|
// ----------------
|
||||||
void DumpCommands(u32 _CommandAddress, size_t _NumberOfCommands = 8)
|
void DumpCommands(u32 _CommandAddress, size_t _NumberOfCommands = 8)
|
||||||
{
|
{
|
||||||
LOG(WII_IPC_HLE, " CommandDump of %s", GetDeviceName().c_str());
|
// Because I have to use __Logv here I add this #if
|
||||||
for (u32 i=0; i<_NumberOfCommands; i++)
|
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||||
{
|
// Select log type
|
||||||
LOG(WII_IPC_HLE, " Command%02i: 0x%08x", i, Memory::Read_U32(_CommandAddress + i*4));
|
int log;
|
||||||
}
|
if(GetDeviceName().find("dev/es") != std::string::npos)
|
||||||
|
log = LogTypes::WII_IPC_ES;
|
||||||
|
else
|
||||||
|
log = LogTypes::WII_IPC_HLE;
|
||||||
|
|
||||||
|
__Logv(log, 0, "CommandDump of %s", GetDeviceName().c_str());
|
||||||
|
for (u32 i=0; i<_NumberOfCommands; i++)
|
||||||
|
{
|
||||||
|
__Logv(log, 0, " Command%02i: 0x%08x", i, Memory::Read_U32(_CommandAddress + i*4));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void DumpAsync( u32 BufferVector, u32 _CommandAddress, u32 NumberInBuffer, u32 NumberOutBuffer )
|
void DumpAsync( u32 BufferVector, u32 _CommandAddress, u32 NumberInBuffer, u32 NumberOutBuffer )
|
||||||
|
|
|
@ -42,6 +42,7 @@ public:
|
||||||
IOCTL_ES_GETTITLES = 0x0F,
|
IOCTL_ES_GETTITLES = 0x0F,
|
||||||
IOCTL_ES_GETVIEWCNT = 0x12,
|
IOCTL_ES_GETVIEWCNT = 0x12,
|
||||||
IOCTL_ES_GETVIEWS = 0x13,
|
IOCTL_ES_GETVIEWS = 0x13,
|
||||||
|
IOCTL_ES_GETTMDVIEWCNT = 0x14,
|
||||||
IOCTL_ES_DIVERIFY = 0x1C,
|
IOCTL_ES_DIVERIFY = 0x1C,
|
||||||
IOCTL_ES_GETTITLEDIR = 0x1D,
|
IOCTL_ES_GETTITLEDIR = 0x1D,
|
||||||
IOCTL_ES_GETTITLEID = 0x20,
|
IOCTL_ES_GETTITLEID = 0x20,
|
||||||
|
@ -78,7 +79,7 @@ public:
|
||||||
SIOCtlVBuffer Buffer(_CommandAddress);
|
SIOCtlVBuffer Buffer(_CommandAddress);
|
||||||
switch(Buffer.Parameter)
|
switch(Buffer.Parameter)
|
||||||
{
|
{
|
||||||
case IOCTL_ES_GETTITLEDIR:
|
case IOCTL_ES_GETTITLEDIR: // ES_GetDataDir in DevKitPro
|
||||||
{
|
{
|
||||||
u32 TitleID = VolumeHandler::Read32(0);
|
u32 TitleID = VolumeHandler::Read32(0);
|
||||||
if (TitleID == 0)
|
if (TitleID == 0)
|
||||||
|
@ -89,8 +90,7 @@ public:
|
||||||
char* Path = (char*)Memory::GetPointer(Buffer.PayloadBuffer[0].m_Address);
|
char* Path = (char*)Memory::GetPointer(Buffer.PayloadBuffer[0].m_Address);
|
||||||
sprintf(Path, "/00010000/%02x%02x%02x%02x/data", (u8)pTitleID[3], (u8)pTitleID[2], (u8)pTitleID[1], (u8)pTitleID[0]);
|
sprintf(Path, "/00010000/%02x%02x%02x%02x/data", (u8)pTitleID[3], (u8)pTitleID[2], (u8)pTitleID[1], (u8)pTitleID[0]);
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, "CWII_IPC_HLE_Device_es command:"
|
LOG(WII_IPC_ES, "ES: IOCTL_ES_GETTITLEDIR: %s ", Path);
|
||||||
" IOCTL_ES_GETTITLEDIR: %s", Path);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -104,8 +104,32 @@ public:
|
||||||
|
|
||||||
Memory::Write_U32(TitleID, OutBuffer);
|
Memory::Write_U32(TitleID, OutBuffer);
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, "CWII_IPC_HLE_Device_es command:"
|
LOG(WII_IPC_ES, "ES: IOCTL_ES_GETTITLEID: 0x%x", TitleID);
|
||||||
" IOCTL_ES_GETTITLEID: 0x%x", TitleID);
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// This and 0x14 are called by Mario Kart
|
||||||
|
case IOCTL_ES_GETVIEWCNT: // (0x12) ES_GetNumTicketViews in DevKitPro
|
||||||
|
{
|
||||||
|
if(Buffer.NumberPayloadBuffer)
|
||||||
|
u32 OutBuffer = Memory::Read_U32(Buffer.PayloadBuffer[0].m_Address);
|
||||||
|
if(Buffer.NumberInBuffer)
|
||||||
|
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
||||||
|
|
||||||
|
// Should we write something here?
|
||||||
|
//Memory::Write_U32(0, Buffer.PayloadBuffer[0].m_Address);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IOCTL_ES_GETTMDVIEWCNT: // (0x14) ES_GetTMDViewSize in DevKitPro
|
||||||
|
{
|
||||||
|
if(Buffer.NumberPayloadBuffer)
|
||||||
|
u32 OutBuffer = Memory::Read_U32(Buffer.PayloadBuffer[0].m_Address);
|
||||||
|
if(Buffer.NumberInBuffer)
|
||||||
|
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
||||||
|
|
||||||
|
// Should we write something here?
|
||||||
|
//Memory::Write_U32(0, Buffer.PayloadBuffer[0].m_Address);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -121,7 +145,7 @@ public:
|
||||||
|
|
||||||
Memory::Write_U32(0, OutBuffer);
|
Memory::Write_U32(0, OutBuffer);
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, "CWII_IPC_HLE_Device_es command:"
|
LOG(WII_IPC_ES, "CWII_IPC_HLE_Device_es command:"
|
||||||
" IOCTL_ES_GETTITLECOUNT: 0x%x", OutBuffer);
|
" IOCTL_ES_GETTITLECOUNT: 0x%x", OutBuffer);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -137,6 +161,30 @@ public:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Extended logs
|
||||||
|
//if(Buffer.Parameter == IOCTL_ES_GETTITLEDIR || Buffer.Parameter == IOCTL_ES_GETTITLEID ||
|
||||||
|
// Buffer.Parameter == IOCTL_ES_GETVIEWCNT || Buffer.Parameter == IOCTL_ES_GETTMDVIEWCNT)
|
||||||
|
{
|
||||||
|
u32 OutBuffer = Memory::Read_U32(Buffer.PayloadBuffer[0].m_Address);
|
||||||
|
if(Buffer.NumberInBuffer > 0)
|
||||||
|
{
|
||||||
|
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
||||||
|
LOG(WII_IPC_ES, "ES Parameter: 0x%x (In: %i, Out:%i) (In 0x%08x = 0x%08x %i) (Out 0x%08x = 0x%08x %i)",
|
||||||
|
Buffer.Parameter,
|
||||||
|
Buffer.NumberInBuffer, Buffer.NumberPayloadBuffer,
|
||||||
|
Buffer.InBuffer[0].m_Address, InBuffer, Buffer.InBuffer[0].m_Size,
|
||||||
|
Buffer.PayloadBuffer[0].m_Address, OutBuffer, Buffer.PayloadBuffer[0].m_Size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG(WII_IPC_ES, "ES Parameter: 0x%x (In: %i, Out:%i) (Out 0x%08x = 0x%08x %i)",
|
||||||
|
Buffer.Parameter,
|
||||||
|
Buffer.NumberInBuffer, Buffer.NumberPayloadBuffer,
|
||||||
|
Buffer.PayloadBuffer[0].m_Address, OutBuffer, Buffer.PayloadBuffer[0].m_Size);
|
||||||
|
}
|
||||||
|
//DumpCommands(_CommandAddress, 8);
|
||||||
|
} */
|
||||||
|
|
||||||
// write return value
|
// write return value
|
||||||
Memory::Write_U32(0, _CommandAddress + 0x4);
|
Memory::Write_U32(0, _CommandAddress + 0x4);
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,13 @@
|
||||||
// Official SVN repository and contact information can be found at
|
// Official SVN repository and contact information can be found at
|
||||||
// http://code.google.com/p/dolphin-emu/
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#include "WII_IPC_HLE_Device_net.h"
|
#include "WII_IPC_HLE_Device_net.h"
|
||||||
|
|
||||||
|
|
||||||
|
// **********************************************************************************
|
||||||
|
// Handle /dev/net/kd/request requests
|
||||||
|
|
||||||
CWII_IPC_HLE_Device_net_kd_request::CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName)
|
CWII_IPC_HLE_Device_net_kd_request::CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName)
|
||||||
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
|
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
|
||||||
{
|
{
|
||||||
|
@ -29,14 +34,13 @@ CWII_IPC_HLE_Device_net_kd_request::~CWII_IPC_HLE_Device_net_kd_request()
|
||||||
|
|
||||||
bool CWII_IPC_HLE_Device_net_kd_request::Open(u32 _CommandAddress, u32 _Mode)
|
bool CWII_IPC_HLE_Device_net_kd_request::Open(u32 _CommandAddress, u32 _Mode)
|
||||||
{
|
{
|
||||||
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
//LOG(WII_IPC_NET, "NET_KD_REQ: Open (Command: 0x%02x)", Memory::Read_U32(_CommandAddress));
|
||||||
|
Memory::Write_U32(GetDeviceID(), _CommandAddress + 4);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress)
|
bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress)
|
||||||
{
|
{
|
||||||
LOG(WII_IPC_NET, "NET_KD_REQ: IOCtl (Device=%s)", GetDeviceName().c_str());
|
|
||||||
|
|
||||||
u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC);
|
u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC);
|
||||||
u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10);
|
u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10);
|
||||||
u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
|
u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
|
||||||
|
@ -44,24 +48,69 @@ bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress)
|
||||||
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
|
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
|
||||||
|
|
||||||
u32 ReturnValue = ExecuteCommand(Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
u32 ReturnValue = ExecuteCommand(Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
||||||
Memory::Write_U32(ReturnValue, _CommandAddress+4);
|
|
||||||
|
LOG(WII_IPC_NET, "NET_KD_REQ: IOCtl (Device=%s) (Parameter: 0x%02x)", GetDeviceName().c_str(), Parameter);
|
||||||
|
|
||||||
|
Memory::Write_U32(ReturnValue, _CommandAddress + 4);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 CWII_IPC_HLE_Device_net_kd_request::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize)
|
s32 CWII_IPC_HLE_Device_net_kd_request::ExecuteCommand(u32 _Parameter, u32 _BufferIn, u32 _BufferInSize, u32 _BufferOut, u32 _BufferOutSize)
|
||||||
{
|
{
|
||||||
|
// Requests are made in this order by these games
|
||||||
|
// Mario Kart: 2, 1, f, 3
|
||||||
|
// SSBB: 2, 3
|
||||||
|
|
||||||
|
/* Extended logs
|
||||||
|
//if(_Parameter == 2 || _Parameter == 3)
|
||||||
|
if(true)
|
||||||
|
{
|
||||||
|
u32 OutBuffer = Memory::Read_U32(_BufferOut);
|
||||||
|
if(_BufferInSize > 0)
|
||||||
|
{
|
||||||
|
u32 InBuffer = Memory::Read_U32(_BufferIn);
|
||||||
|
LOG(WII_IPC_ES, "NET_KD_REQ: IOCtl Parameter: 0x%x (In 0x%08x = 0x%08x %i) (Out 0x%08x = 0x%08x %i)",
|
||||||
|
_Parameter,
|
||||||
|
_BufferIn, InBuffer, _BufferInSize,
|
||||||
|
_BufferOut, OutBuffer, _BufferOutSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG(WII_IPC_ES, "NET_KD_REQ: IOCtl Parameter: 0x%x (Out 0x%08x = 0x%08x %i)",
|
||||||
|
_Parameter,
|
||||||
|
_BufferOut, OutBuffer, _BufferOutSize);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
switch(_Parameter)
|
switch(_Parameter)
|
||||||
{
|
{
|
||||||
|
case 1: // SuspendScheduler (Input: none, Output: 32 bytes)
|
||||||
|
Memory::Write_U32(0, _BufferOut);
|
||||||
|
break;
|
||||||
|
case 2: /* ExecTrySuspendScheduler (Input: 32 bytes, Output: 32 bytes). Sounds like it will check
|
||||||
|
if it should suspend the updates scheduler or not. */
|
||||||
|
Memory::Write_U32(1, _BufferOut);
|
||||||
|
break;
|
||||||
|
case 3: // ?
|
||||||
|
Memory::Write_U32(0, _BufferOut);
|
||||||
|
break;
|
||||||
|
case 0xf: // NWC24iRequestGenerateUserId (Input: none, Output: 32 bytes)
|
||||||
|
Memory::Write_U32(0, _BufferOut);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG(WII_IPC_NET, "CWII_IPC_HLE_Device_net_kd_request::IOCtl: ni 0x%x (iBufferSize: %i, oBufferSize: %i)", _Parameter, _BufferInSize, _BufferOutSize);
|
_dbg_assert_msg_(WII_IPC_NET, 0, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
|
||||||
_dbg_assert_msg_(WII_IPC_NET, 0, "CWII_IPC_HLE_Device_net_kd_request::IOCtl: ni 0x%x (iBufferSize: %i, oBufferSize: %i)", _Parameter, _BufferInSize, _BufferOutSize);
|
_Parameter, _BufferIn, _BufferInSize, _BufferOut, _BufferOutSize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Should we always return 0?
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// **********************************************************************************
|
// **********************************************************************************
|
||||||
|
// Handle /dev/net/ncd/manage requests
|
||||||
|
|
||||||
CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _DeviceID, const std::string& _rDeviceName)
|
CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _DeviceID, const std::string& _rDeviceName)
|
||||||
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
|
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
|
||||||
|
|
|
@ -50,12 +50,12 @@ CWII_IPC_HLE_Device_sdio_slot0::Open(u32 _CommandAddress, u32 _Mode)
|
||||||
|
|
||||||
|
|
||||||
// __________________________________________________________________________________________________
|
// __________________________________________________________________________________________________
|
||||||
//
|
// The front SD slot
|
||||||
bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
||||||
{
|
{
|
||||||
LOG(WII_IPC_HLE, "*************************************");
|
LOG(WII_IPC_FILEIO, "*************************************");
|
||||||
LOG(WII_IPC_HLE, "CWII_IPC_HLE_Device_sdio_slot0::IOCtl");
|
LOG(WII_IPC_FILEIO, "CWII_IPC_HLE_Device_sdio_slot0::IOCtl");
|
||||||
LOG(WII_IPC_HLE, "*************************************");
|
LOG(WII_IPC_FILEIO, "*************************************");
|
||||||
|
|
||||||
// DumpCommands(_CommandAddress);
|
// DumpCommands(_CommandAddress);
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
||||||
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
|
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
|
||||||
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
|
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, "%s - BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)", GetDeviceName().c_str(), BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
LOG(WII_IPC_FILEIO, "%s - BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)", GetDeviceName().c_str(), BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
||||||
|
|
||||||
u32 ReturnValue = 0;
|
u32 ReturnValue = 0;
|
||||||
switch (Cmd) {
|
switch (Cmd) {
|
||||||
|
@ -86,8 +86,13 @@ bool CWII_IPC_HLE_Device_sdio_slot0::IOCtl(u32 _CommandAddress)
|
||||||
case 7: //sendcmd
|
case 7: //sendcmd
|
||||||
ReturnValue = ExecuteCommand(BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
ReturnValue = ExecuteCommand(BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 11: // sd_get_status
|
||||||
|
LOGV(WII_IPC_FILEIO, 0, "SD command: sd_get_status. Answer: SD card is inserted (write 1 to %08x).", BufferOut);
|
||||||
|
Memory::Write_U32(1, BufferOut); // SD card is inserted?
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
PanicAlert("Unknown SD command");
|
PanicAlert("Unknown SD command (0x%08x)", Cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue