Triforce: Address some logging and error checks

This commit is contained in:
Sepalani
2026-02-04 19:38:53 -06:00
committed by Jordan Woyak
parent 4505a4ad9e
commit bbf0e96603
3 changed files with 54 additions and 17 deletions
+5
View File
@@ -237,6 +237,11 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard
// Load game into RAM, like on the actual Triforce
u8* dimm = AMMediaboard::InitDIMM(disc_size);
if (!dimm)
{
ERROR_LOG_FMT(BOOT, "AMMediaboard::InitDIMM failed");
return false;
}
volume.Read(0, disc_size, dimm, DiscIO::PARTITION_NONE);
+32 -14
View File
@@ -14,6 +14,7 @@
#include "Common/FileUtil.h"
#include "Common/IOFile.h"
#include "Common/Logging/Log.h"
#include "Common/Network.h"
#include "Core/Boot/Boot.h"
#include "Core/BootManager.h"
@@ -243,7 +244,14 @@ static SOCKET socket_(int af, int type, int protocol)
{
if (s_sockets[i] == SOCKET_ERROR)
{
s_sockets[i] = socket(af, type, protocol);
const s32 host_fd = socket(af, type, protocol);
if (host_fd < 0)
{
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: failed to create socket ({})",
Common::StrNetworkError());
return SOCKET_ERROR;
}
s_sockets[i] = host_fd;
return i;
}
}
@@ -370,14 +378,11 @@ u8* InitDIMM(u32 size)
if (size == 0)
return nullptr;
s_dimm_disc.reset(size);
if (s_dimm_disc.empty())
{
s_dimm_disc.reset(size);
if (s_dimm_disc.empty())
{
PanicAlertFmt("Failed to allocate DIMM memory.");
return nullptr;
}
PanicAlertFmt("Failed to allocate DIMM memory.");
return nullptr;
}
s_firmware_map = false;
@@ -407,6 +412,8 @@ static s32 NetDIMMAccept(int fd, sockaddr* addr, socklen_t* len)
return client_sock;
}
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: accept() failed in NetDIMMAccept ({})",
Common::StrNetworkError());
s_last_error = SOCKET_ERROR;
return SOCKET_ERROR;
}
@@ -418,7 +425,8 @@ static s32 NetDIMMAccept(int fd, sockaddr* addr, socklen_t* len)
}
else
{
// select() failed
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: select() failed in NetDIMMAccept ({})",
Common::StrNetworkError());
s_last_error = SOCKET_ERROR;
}
@@ -492,6 +500,8 @@ static s32 NetDIMMConnect(int fd, sockaddr_in* addr, int len)
}
else
{
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: getsockopt() failed in NetDIMMConnect ({})",
Common::StrNetworkError());
s_last_error = SOCKET_ERROR;
ret = SOCKET_ERROR;
}
@@ -504,7 +514,8 @@ static s32 NetDIMMConnect(int fd, sockaddr_in* addr, int len)
}
else
{
// select() failed
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: select() failed in NetDIMMConnect ({})",
Common::StrNetworkError());
s_last_error = SOCKET_ERROR;
ret = SOCKET_ERROR;
}
@@ -512,6 +523,8 @@ static s32 NetDIMMConnect(int fd, sockaddr_in* addr, int len)
else if (ret == SOCKET_ERROR)
{
// Immediate failure (e.g. WSAECONNREFUSED)
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: NetDIMMConnect failed, connect() = {} ({})", err,
Common::DecodeNetworkError(err));
s_last_error = ret;
}
else
@@ -797,8 +810,8 @@ u32 ExecuteCommand(std::array<u32, 3>& dicmd_buf, u32* diimm_buf, u32 address, u
ret = NetDIMMAccept(fd, &addr, &len);
if (len)
{
memcpy(s_network_command_buffer + addr_off, &addr, len);
memcpy(s_network_command_buffer + len_off, &len, sizeof(int));
memcpy(s_network_command_buffer + addr_off, &addr, sizeof(sockaddr));
memcpy(s_network_command_buffer + len_off, &len, sizeof(u32));
}
}
@@ -813,7 +826,7 @@ u32 ExecuteCommand(std::array<u32, 3>& dicmd_buf, u32* diimm_buf, u32 address, u
const u32 off = s_media_buffer_32[3] - NetworkCommandAddress2;
const u32 len = s_media_buffer_32[4];
if (!NetworkCMDBufferCheck(off, len))
if (!NetworkCMDBufferCheck(off, std::max<u32>(sizeof(sockaddr_in), len)))
{
break;
}
@@ -834,7 +847,12 @@ u32 ExecuteCommand(std::array<u32, 3>& dicmd_buf, u32* diimm_buf, u32 address, u
const int err = WSAGetLastError();
if (ret < 0)
PanicAlertFmt("Socket Bind Failed with{0}", err);
{
const auto err_msg = Common::DecodeNetworkError(err);
PanicAlertFmt("Failed to bind socket (error {}: {})", err, err_msg);
ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: AMMBCommand::Bind failed, bind() = {} ({})", err,
err_msg);
}
NOTICE_LOG_FMT(AMMEDIABOARD_NET, "GC-AM: bind( {}, ({},{:08x}:{}), {} ):{} ({})\n", fd,
addr.sin_family, addr.sin_addr.s_addr, Common::swap16(addr.sin_port), len,
@@ -865,7 +883,7 @@ u32 ExecuteCommand(std::array<u32, 3>& dicmd_buf, u32* diimm_buf, u32 address, u
const u32 off = s_media_buffer_32[3] - NetworkCommandAddress2;
const u32 len = s_media_buffer_32[4];
if (!NetworkCMDBufferCheck(off, len))
if (!NetworkCMDBufferCheck(off, std::max<u32>(sizeof(sockaddr_in), len)))
{
break;
}
@@ -80,7 +80,7 @@ CEXIBaseboard::CEXIBaseboard(Core::System& system) : IEXIDevice(system)
if (AMMediaboard::GetGameType() == VirtuaStriker4 ||
AMMediaboard::GetGameType() == GekitouProYakyuu)
{
if (m_backup.GetSize())
if (m_backup.GetSize() >= 0x20C + 0x1F4)
{
Common::UniqueBuffer<u8> data(m_backup.GetSize());
m_backup.ReadBytes(data.data(), data.size());
@@ -133,11 +133,18 @@ void CEXIBaseboard::DMAWrite(u32 addr, u32 size)
{
const auto& system = Core::System::GetInstance();
const auto& memory = system.GetMemory();
auto span = memory.GetSpanForAddress(addr);
if (span.size() < size)
{
ERROR_LOG_FMT(SP1, "AM-BB: Backup DMA Write overflow: address=0x{:08x}, length={}, span={}",
addr, size, span.size());
return;
}
NOTICE_LOG_FMT(SP1, "AM-BB: COMMAND: Backup DMA Write: {:08x} {:x}", addr, size);
m_backup.Seek(m_backup_offset, File::SeekOrigin::Begin);
m_backup.WriteBytes(memory.GetSpanForAddress(addr).data(), size);
m_backup.WriteBytes(span.data(), size);
m_backup.Flush();
}
@@ -145,11 +152,18 @@ void CEXIBaseboard::DMARead(u32 addr, u32 size)
{
const auto& system = Core::System::GetInstance();
const auto& memory = system.GetMemory();
auto span = memory.GetSpanForAddress(addr);
if (span.size() < size)
{
ERROR_LOG_FMT(SP1, "AM-BB: Backup DMA Read overflow: address=0x{:08x}, length={}, span={}",
addr, size, span.size());
return;
}
NOTICE_LOG_FMT(SP1, "AM-BB: COMMAND: Backup DMA Read: {:08x} {:x}", addr, size);
m_backup.Seek(m_backup_offset, File::SeekOrigin::Begin);
m_backup.ReadBytes(memory.GetSpanForAddress(addr).data(), size);
m_backup.ReadBytes(span.data(), size);
}
void CEXIBaseboard::TransferByte(u8& byte)