mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
IOS: Leverage Kernel/EmulationKernel difference for passing System to most IOS devices.
This commit is contained in:
@@ -41,7 +41,8 @@ namespace IOS::HLE
|
||||
{
|
||||
CoreTiming::EventType* DIDevice::s_finish_executing_di_command;
|
||||
|
||||
DIDevice::DIDevice(Kernel& ios, const std::string& device_name) : Device(ios, device_name)
|
||||
DIDevice::DIDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -70,7 +71,7 @@ std::optional<IPCReply> DIDevice::IOCtl(const IOCtlRequest& request)
|
||||
// asynchronously. The rest are also treated as async to match this. Only one command can be
|
||||
// executed at a time, so commands are queued until DVDInterface is ready to handle them.
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
const u8 command = memory.Read_U8(request.buffer_in);
|
||||
if (request.request != command)
|
||||
@@ -105,12 +106,13 @@ void DIDevice::ProcessQueuedIOCtl()
|
||||
m_executing_command = {m_commands_to_execute.front()};
|
||||
m_commands_to_execute.pop_front();
|
||||
|
||||
IOCtlRequest request{m_executing_command->m_request_address};
|
||||
auto& system = GetSystem();
|
||||
IOCtlRequest request{system, m_executing_command->m_request_address};
|
||||
auto finished = StartIOCtl(request);
|
||||
if (finished)
|
||||
{
|
||||
Core::System::GetInstance().GetCoreTiming().ScheduleEvent(
|
||||
IPC_OVERHEAD_TICKS, s_finish_executing_di_command, static_cast<u64>(finished.value()));
|
||||
system.GetCoreTiming().ScheduleEvent(IPC_OVERHEAD_TICKS, s_finish_executing_di_command,
|
||||
static_cast<u64>(finished.value()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -124,7 +126,7 @@ std::optional<DIDevice::DIResult> DIDevice::WriteIfFits(const IOCtlRequest& requ
|
||||
}
|
||||
else
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Write_U32(value, request.buffer_out);
|
||||
return DIResult::Success;
|
||||
@@ -150,7 +152,7 @@ std::optional<DIDevice::DIResult> DIDevice::StartIOCtl(const IOCtlRequest& reque
|
||||
return DIResult::SecurityError;
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
auto* mmio = memory.GetMMIOMapping();
|
||||
|
||||
@@ -561,7 +563,7 @@ std::optional<DIDevice::DIResult> DIDevice::StartDMATransfer(u32 command_length,
|
||||
return DIResult::BadArgument;
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto* mmio = system.GetMemory().GetMMIOMapping();
|
||||
mmio->Write<u32>(ADDRESS_DIMAR, request.buffer_out);
|
||||
m_last_length = command_length;
|
||||
@@ -585,7 +587,8 @@ std::optional<DIDevice::DIResult> DIDevice::StartImmediateTransfer(const IOCtlRe
|
||||
|
||||
m_executing_command->m_copy_diimmbuf = write_to_buf;
|
||||
|
||||
Core::System::GetInstance().GetDVDInterface().ExecuteCommand(DVD::ReplyType::IOS);
|
||||
auto& system = GetSystem();
|
||||
system.GetDVDInterface().ExecuteCommand(DVD::ReplyType::IOS);
|
||||
// Reply will be posted when done by FinishIOCtl.
|
||||
return {};
|
||||
}
|
||||
@@ -649,15 +652,15 @@ void DIDevice::FinishDICommand(DIResult result)
|
||||
return;
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
auto* mmio = memory.GetMMIOMapping();
|
||||
|
||||
IOCtlRequest request{m_executing_command->m_request_address};
|
||||
IOCtlRequest request{system, m_executing_command->m_request_address};
|
||||
if (m_executing_command->m_copy_diimmbuf)
|
||||
memory.Write_U32(mmio->Read<u32>(ADDRESS_DIIMMBUF), request.buffer_out);
|
||||
|
||||
m_ios.EnqueueIPCReply(request, static_cast<s32>(result));
|
||||
GetEmulationKernel().EnqueueIPCReply(request, static_cast<s32>(result));
|
||||
|
||||
m_executing_command.reset();
|
||||
|
||||
@@ -683,7 +686,7 @@ std::optional<IPCReply> DIDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
return IPCReply{static_cast<s32>(DIResult::BadArgument)};
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u8 command = memory.Read_U8(request.in_vectors[0].address);
|
||||
@@ -742,17 +745,17 @@ std::optional<IPCReply> DIDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
case DIIoctl::DVDLowGetNoDiscOpenPartitionParams:
|
||||
ERROR_LOG_FMT(IOS_DI, "DVDLowGetNoDiscOpenPartitionParams - dummied out");
|
||||
DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::USES_DIFFERENT_PARTITION_COMMAND);
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
request.DumpUnknown(system, GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
break;
|
||||
case DIIoctl::DVDLowNoDiscOpenPartition:
|
||||
ERROR_LOG_FMT(IOS_DI, "DVDLowNoDiscOpenPartition - dummied out");
|
||||
DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::USES_DIFFERENT_PARTITION_COMMAND);
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
request.DumpUnknown(system, GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
break;
|
||||
case DIIoctl::DVDLowGetNoDiscBufferSizes:
|
||||
ERROR_LOG_FMT(IOS_DI, "DVDLowGetNoDiscBufferSizes - dummied out");
|
||||
DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::USES_DIFFERENT_PARTITION_COMMAND);
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
request.DumpUnknown(system, GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
break;
|
||||
case DIIoctl::DVDLowOpenPartitionWithTmdAndTicket:
|
||||
ERROR_LOG_FMT(IOS_DI, "DVDLowOpenPartitionWithTmdAndTicket - not implemented");
|
||||
@@ -764,7 +767,7 @@ std::optional<IPCReply> DIDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
break;
|
||||
default:
|
||||
ERROR_LOG_FMT(IOS_DI, "Unknown ioctlv {:#04x}", request.request);
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
request.DumpUnknown(system, GetDeviceName(), Common::Log::LogType::IOS_DI);
|
||||
}
|
||||
return IPCReply{static_cast<s32>(return_value)};
|
||||
}
|
||||
@@ -804,7 +807,7 @@ void DIDevice::ResetDIRegisters()
|
||||
{
|
||||
// Clear transfer complete and error interrupts (normally r/z, but here we just directly write
|
||||
// zero)
|
||||
auto& di = Core::System::GetInstance().GetDVDInterface();
|
||||
auto& di = GetSystem().GetDVDInterface();
|
||||
di.ClearInterrupt(DVD::DIInterruptType::TCINT);
|
||||
di.ClearInterrupt(DVD::DIInterruptType::DEINT);
|
||||
// Enable transfer complete and error interrupts, and disable cover interrupt
|
||||
|
||||
@@ -35,10 +35,10 @@ void Init();
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
class DIDevice : public Device
|
||||
class DIDevice : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
DIDevice(Kernel& ios, const std::string& device_name);
|
||||
DIDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
|
||||
static void InterruptFromDVDInterface(DVD::DIInterruptType interrupt_type);
|
||||
static DiscIO::Partition GetCurrentPartition();
|
||||
|
||||
@@ -16,17 +16,15 @@
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
Request::Request(const u32 address_) : address(address_)
|
||||
Request::Request(Core::System& system, const u32 address_) : address(address_)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
command = static_cast<IPCCommandType>(memory.Read_U32(address));
|
||||
fd = memory.Read_U32(address + 8);
|
||||
}
|
||||
|
||||
OpenRequest::OpenRequest(const u32 address_) : Request(address_)
|
||||
OpenRequest::OpenRequest(Core::System& system, const u32 address_) : Request(system, address_)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
path = memory.GetString(memory.Read_U32(address + 0xc));
|
||||
flags = static_cast<OpenMode>(memory.Read_U32(address + 0x10));
|
||||
@@ -38,25 +36,23 @@ OpenRequest::OpenRequest(const u32 address_) : Request(address_)
|
||||
}
|
||||
}
|
||||
|
||||
ReadWriteRequest::ReadWriteRequest(const u32 address_) : Request(address_)
|
||||
ReadWriteRequest::ReadWriteRequest(Core::System& system, const u32 address_)
|
||||
: Request(system, address_)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
buffer = memory.Read_U32(address + 0xc);
|
||||
size = memory.Read_U32(address + 0x10);
|
||||
}
|
||||
|
||||
SeekRequest::SeekRequest(const u32 address_) : Request(address_)
|
||||
SeekRequest::SeekRequest(Core::System& system, const u32 address_) : Request(system, address_)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
offset = memory.Read_U32(address + 0xc);
|
||||
mode = static_cast<SeekMode>(memory.Read_U32(address + 0x10));
|
||||
}
|
||||
|
||||
IOCtlRequest::IOCtlRequest(const u32 address_) : Request(address_)
|
||||
IOCtlRequest::IOCtlRequest(Core::System& system, const u32 address_) : Request(system, address_)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
request = memory.Read_U32(address + 0x0c);
|
||||
buffer_in = memory.Read_U32(address + 0x10);
|
||||
@@ -65,9 +61,8 @@ IOCtlRequest::IOCtlRequest(const u32 address_) : Request(address_)
|
||||
buffer_out_size = memory.Read_U32(address + 0x1c);
|
||||
}
|
||||
|
||||
IOCtlVRequest::IOCtlVRequest(const u32 address_) : Request(address_)
|
||||
IOCtlVRequest::IOCtlVRequest(Core::System& system, const u32 address_) : Request(system, address_)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
request = memory.Read_U32(address + 0x0c);
|
||||
const u32 in_number = memory.Read_U32(address + 0x10);
|
||||
@@ -114,10 +109,9 @@ void IOCtlRequest::Log(std::string_view device_name, Common::Log::LogType type,
|
||||
device_name, fd, request, buffer_in_size, buffer_out_size);
|
||||
}
|
||||
|
||||
void IOCtlRequest::Dump(const std::string& description, Common::Log::LogType type,
|
||||
Common::Log::LogLevel level) const
|
||||
void IOCtlRequest::Dump(Core::System& system, const std::string& description,
|
||||
Common::Log::LogType type, Common::Log::LogLevel level) const
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
Log("===== " + description, type, level);
|
||||
@@ -127,16 +121,15 @@ void IOCtlRequest::Dump(const std::string& description, Common::Log::LogType typ
|
||||
HexDump(memory.GetPointer(buffer_out), buffer_out_size));
|
||||
}
|
||||
|
||||
void IOCtlRequest::DumpUnknown(const std::string& description, Common::Log::LogType type,
|
||||
Common::Log::LogLevel level) const
|
||||
void IOCtlRequest::DumpUnknown(Core::System& system, const std::string& description,
|
||||
Common::Log::LogType type, Common::Log::LogLevel level) const
|
||||
{
|
||||
Dump("Unknown IOCtl - " + description, type, level);
|
||||
Dump(system, "Unknown IOCtl - " + description, type, level);
|
||||
}
|
||||
|
||||
void IOCtlVRequest::Dump(std::string_view description, Common::Log::LogType type,
|
||||
Common::Log::LogLevel level) const
|
||||
void IOCtlVRequest::Dump(Core::System& system, std::string_view description,
|
||||
Common::Log::LogType type, Common::Log::LogLevel level) const
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
GENERIC_LOG_FMT(type, level, "===== {} (fd {}) - IOCtlV {:#x} ({} in, {} io)", description, fd,
|
||||
@@ -154,10 +147,10 @@ void IOCtlVRequest::Dump(std::string_view description, Common::Log::LogType type
|
||||
GENERIC_LOG_FMT(type, level, "io[{}] (size={:#x})", i++, vector.size);
|
||||
}
|
||||
|
||||
void IOCtlVRequest::DumpUnknown(const std::string& description, Common::Log::LogType type,
|
||||
Common::Log::LogLevel level) const
|
||||
void IOCtlVRequest::DumpUnknown(Core::System& system, const std::string& description,
|
||||
Common::Log::LogType type, Common::Log::LogLevel level) const
|
||||
{
|
||||
Dump("Unknown IOCtlV - " + description, type, level);
|
||||
Dump(system, "Unknown IOCtlV - " + description, type, level);
|
||||
}
|
||||
|
||||
Device::Device(Kernel& ios, const std::string& device_name, const DeviceType type)
|
||||
|
||||
@@ -13,6 +13,11 @@
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Core/IOS/IOS.h"
|
||||
|
||||
namespace Core
|
||||
{
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
enum ReturnCode : s32
|
||||
@@ -77,7 +82,7 @@ struct Request
|
||||
u32 address = 0;
|
||||
IPCCommandType command = IPC_CMD_OPEN;
|
||||
u32 fd = 0;
|
||||
explicit Request(u32 address);
|
||||
Request(Core::System& system, u32 address);
|
||||
virtual ~Request() = default;
|
||||
};
|
||||
|
||||
@@ -97,14 +102,14 @@ struct OpenRequest final : Request
|
||||
// but they are set after they reach IOS and are dispatched to the appropriate module.
|
||||
u32 uid = 0;
|
||||
u16 gid = 0;
|
||||
explicit OpenRequest(u32 address);
|
||||
OpenRequest(Core::System& system, u32 address);
|
||||
};
|
||||
|
||||
struct ReadWriteRequest final : Request
|
||||
{
|
||||
u32 buffer = 0;
|
||||
u32 size = 0;
|
||||
explicit ReadWriteRequest(u32 address);
|
||||
ReadWriteRequest(Core::System& system, u32 address);
|
||||
};
|
||||
|
||||
enum SeekMode : s32
|
||||
@@ -118,7 +123,7 @@ struct SeekRequest final : Request
|
||||
{
|
||||
u32 offset = 0;
|
||||
SeekMode mode = IOS_SEEK_SET;
|
||||
explicit SeekRequest(u32 address);
|
||||
SeekRequest(Core::System& system, u32 address);
|
||||
};
|
||||
|
||||
struct IOCtlRequest final : Request
|
||||
@@ -129,12 +134,13 @@ struct IOCtlRequest final : Request
|
||||
// Contrary to the name, the output buffer can also be used for input.
|
||||
u32 buffer_out = 0;
|
||||
u32 buffer_out_size = 0;
|
||||
explicit IOCtlRequest(u32 address);
|
||||
IOCtlRequest(Core::System& system, u32 address);
|
||||
void Log(std::string_view description, Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
Common::Log::LogLevel level = Common::Log::LogLevel::LINFO) const;
|
||||
void Dump(const std::string& description, Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
void Dump(Core::System& system, const std::string& description,
|
||||
Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
Common::Log::LogLevel level = Common::Log::LogLevel::LINFO) const;
|
||||
void DumpUnknown(const std::string& description,
|
||||
void DumpUnknown(Core::System& system, const std::string& description,
|
||||
Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
Common::Log::LogLevel level = Common::Log::LogLevel::LERROR) const;
|
||||
};
|
||||
@@ -159,11 +165,12 @@ struct IOCtlVRequest final : Request
|
||||
/// Returns the specified vector or nullptr if the index is out of bounds.
|
||||
const IOVector* GetVector(size_t index) const;
|
||||
|
||||
explicit IOCtlVRequest(u32 address);
|
||||
IOCtlVRequest(Core::System& system, u32 address);
|
||||
bool HasNumberOfValidVectors(size_t in_count, size_t io_count) const;
|
||||
void Dump(std::string_view description, Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
void Dump(Core::System& system, std::string_view description,
|
||||
Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
Common::Log::LogLevel level = Common::Log::LogLevel::LINFO) const;
|
||||
void DumpUnknown(const std::string& description,
|
||||
void DumpUnknown(Core::System& system, const std::string& description,
|
||||
Common::Log::LogType type = Common::Log::LogType::IOS,
|
||||
Common::Log::LogLevel level = Common::Log::LogLevel::LERROR) const;
|
||||
};
|
||||
@@ -214,4 +221,22 @@ protected:
|
||||
private:
|
||||
std::optional<IPCReply> Unsupported(const Request& request);
|
||||
};
|
||||
|
||||
// Helper class for Devices that we know are only ever instantiated under an EmulationKernel.
|
||||
// Deriving a Device from this allows it to access EmulationKernel-only features without runtime
|
||||
// overhead, since it will know that the m_ios instance is an EmulationKernel.
|
||||
class EmulationDevice : public Device
|
||||
{
|
||||
public:
|
||||
EmulationDevice(EmulationKernel& ios, const std::string& device_name,
|
||||
DeviceType type = DeviceType::Static)
|
||||
: Device(ios, device_name, type)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
EmulationKernel& GetEmulationKernel() const { return static_cast<EmulationKernel&>(m_ios); }
|
||||
|
||||
Core::System& GetSystem() const { return GetEmulationKernel().GetSystem(); }
|
||||
};
|
||||
} // namespace IOS::HLE
|
||||
|
||||
@@ -40,7 +40,7 @@ enum
|
||||
|
||||
};
|
||||
|
||||
IPCReply GetVersion(const IOCtlVRequest& request)
|
||||
IPCReply GetVersion(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
if (!request.HasNumberOfValidVectors(0, 1))
|
||||
{
|
||||
@@ -49,7 +49,6 @@ IPCReply GetVersion(const IOCtlVRequest& request)
|
||||
|
||||
const auto length = std::min(size_t(request.io_vectors[0].size), Common::GetScmDescStr().size());
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Memset(request.io_vectors[0].address, 0, request.io_vectors[0].size);
|
||||
memory.CopyToEmu(request.io_vectors[0].address, Common::GetScmDescStr().data(), length);
|
||||
@@ -57,7 +56,7 @@ IPCReply GetVersion(const IOCtlVRequest& request)
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
IPCReply GetCPUSpeed(const IOCtlVRequest& request)
|
||||
IPCReply GetCPUSpeed(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
if (!request.HasNumberOfValidVectors(0, 1))
|
||||
{
|
||||
@@ -74,14 +73,13 @@ IPCReply GetCPUSpeed(const IOCtlVRequest& request)
|
||||
|
||||
const u32 core_clock = u32(float(SystemTimers::GetTicksPerSecond()) * oc);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Write_U32(core_clock, request.io_vectors[0].address);
|
||||
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
IPCReply GetSpeedLimit(const IOCtlVRequest& request)
|
||||
IPCReply GetSpeedLimit(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
// get current speed limit
|
||||
if (!request.HasNumberOfValidVectors(0, 1))
|
||||
@@ -96,14 +94,13 @@ IPCReply GetSpeedLimit(const IOCtlVRequest& request)
|
||||
|
||||
const u32 speed_percent = Config::Get(Config::MAIN_EMULATION_SPEED) * 100;
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Write_U32(speed_percent, request.io_vectors[0].address);
|
||||
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
IPCReply SetSpeedLimit(const IOCtlVRequest& request)
|
||||
IPCReply SetSpeedLimit(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
// set current speed limit
|
||||
if (!request.HasNumberOfValidVectors(1, 0))
|
||||
@@ -116,7 +113,6 @@ IPCReply SetSpeedLimit(const IOCtlVRequest& request)
|
||||
return IPCReply(IPC_EINVAL);
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
const float speed = float(memory.Read_U32(request.in_vectors[0].address)) / 100.0f;
|
||||
Config::SetCurrent(Config::MAIN_EMULATION_SPEED, speed);
|
||||
@@ -124,7 +120,7 @@ IPCReply SetSpeedLimit(const IOCtlVRequest& request)
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
IPCReply GetRealProductCode(const IOCtlVRequest& request)
|
||||
IPCReply GetRealProductCode(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
if (!request.HasNumberOfValidVectors(0, 1))
|
||||
{
|
||||
@@ -150,14 +146,13 @@ IPCReply GetRealProductCode(const IOCtlVRequest& request)
|
||||
if (length == 0)
|
||||
return IPCReply(IPC_ENOENT);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Memset(request.io_vectors[0].address, 0, request.io_vectors[0].size);
|
||||
memory.CopyToEmu(request.io_vectors[0].address, code.c_str(), length);
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
IPCReply SetDiscordClient(const IOCtlVRequest& request)
|
||||
IPCReply SetDiscordClient(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
if (!Config::Get(Config::MAIN_USE_DISCORD_PRESENCE))
|
||||
return IPCReply(IPC_EACCES);
|
||||
@@ -165,7 +160,6 @@ IPCReply SetDiscordClient(const IOCtlVRequest& request)
|
||||
if (!request.HasNumberOfValidVectors(1, 0))
|
||||
return IPCReply(IPC_EINVAL);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
std::string new_client_id =
|
||||
memory.GetString(request.in_vectors[0].address, request.in_vectors[0].size);
|
||||
@@ -175,7 +169,7 @@ IPCReply SetDiscordClient(const IOCtlVRequest& request)
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
IPCReply SetDiscordPresence(const IOCtlVRequest& request)
|
||||
IPCReply SetDiscordPresence(Core::System& system, const IOCtlVRequest& request)
|
||||
{
|
||||
if (!Config::Get(Config::MAIN_USE_DISCORD_PRESENCE))
|
||||
return IPCReply(IPC_EACCES);
|
||||
@@ -183,7 +177,6 @@ IPCReply SetDiscordPresence(const IOCtlVRequest& request)
|
||||
if (!request.HasNumberOfValidVectors(10, 0))
|
||||
return IPCReply(IPC_EINVAL);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
std::string details = memory.GetString(request.in_vectors[0].address, request.in_vectors[0].size);
|
||||
@@ -242,7 +235,7 @@ IPCReply DolphinDevice::GetElapsedTime(const IOCtlVRequest& request) const
|
||||
// have issues.
|
||||
const u32 milliseconds = static_cast<u32>(m_timer.ElapsedMs());
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Write_U32(milliseconds, request.io_vectors[0].address);
|
||||
|
||||
@@ -261,7 +254,7 @@ IPCReply DolphinDevice::GetSystemTime(const IOCtlVRequest& request) const
|
||||
return IPCReply(IPC_EINVAL);
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
// Write Unix timestamp in milliseconds to memory address
|
||||
@@ -272,7 +265,8 @@ IPCReply DolphinDevice::GetSystemTime(const IOCtlVRequest& request) const
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
||||
DolphinDevice::DolphinDevice(Kernel& ios, const std::string& device_name) : Device(ios, device_name)
|
||||
DolphinDevice::DolphinDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name)
|
||||
{
|
||||
m_timer.Start();
|
||||
}
|
||||
@@ -287,19 +281,19 @@ std::optional<IPCReply> DolphinDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
case IOCTL_DOLPHIN_GET_ELAPSED_TIME:
|
||||
return GetElapsedTime(request);
|
||||
case IOCTL_DOLPHIN_GET_VERSION:
|
||||
return GetVersion(request);
|
||||
return GetVersion(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_GET_SPEED_LIMIT:
|
||||
return GetSpeedLimit(request);
|
||||
return GetSpeedLimit(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_SET_SPEED_LIMIT:
|
||||
return SetSpeedLimit(request);
|
||||
return SetSpeedLimit(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_GET_CPU_SPEED:
|
||||
return GetCPUSpeed(request);
|
||||
return GetCPUSpeed(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_GET_REAL_PRODUCTCODE:
|
||||
return GetRealProductCode(request);
|
||||
return GetRealProductCode(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_DISCORD_SET_CLIENT:
|
||||
return SetDiscordClient(request);
|
||||
return SetDiscordClient(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_DISCORD_SET_PRESENCE:
|
||||
return SetDiscordPresence(request);
|
||||
return SetDiscordPresence(GetSystem(), request);
|
||||
case IOCTL_DOLPHIN_DISCORD_RESET:
|
||||
return ResetDiscord(request);
|
||||
case IOCTL_DOLPHIN_GET_SYSTEM_TIME:
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
class DolphinDevice final : public Device
|
||||
class DolphinDevice final : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
DolphinDevice(Kernel& ios, const std::string& device_name);
|
||||
DolphinDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
std::optional<IPCReply> IOCtlV(const IOCtlVRequest& request) override;
|
||||
|
||||
private:
|
||||
|
||||
@@ -702,7 +702,7 @@ std::optional<IPCReply> ESDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
case IOCTL_ES_UNKNOWN_42:
|
||||
PanicAlertFmt("IOS-ES: Unimplemented ioctlv {:#x} ({} in vectors, {} io vectors)",
|
||||
request.request, request.in_vectors.size(), request.io_vectors.size());
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_ES,
|
||||
request.DumpUnknown(Core::System::GetInstance(), GetDeviceName(), Common::Log::LogType::IOS_ES,
|
||||
Common::Log::LogLevel::LERROR);
|
||||
return IPCReply(IPC_EINVAL);
|
||||
|
||||
|
||||
@@ -319,7 +319,8 @@ Kernel::Kernel(u64 title_id) : m_title_id(title_id)
|
||||
{
|
||||
}
|
||||
|
||||
EmulationKernel::EmulationKernel(u64 title_id) : Kernel(title_id)
|
||||
EmulationKernel::EmulationKernel(Core::System& system, u64 title_id)
|
||||
: Kernel(title_id), m_system(system)
|
||||
{
|
||||
INFO_LOG_FMT(IOS, "Starting IOS {:016x}", title_id);
|
||||
|
||||
@@ -364,7 +365,7 @@ std::shared_ptr<ESDevice> Kernel::GetES()
|
||||
return std::static_pointer_cast<ESDevice>(m_device_map.at("/dev/es"));
|
||||
}
|
||||
|
||||
std::shared_ptr<WiiSockMan> Kernel::GetSocketManager()
|
||||
std::shared_ptr<WiiSockMan> EmulationKernel::GetSocketManager()
|
||||
{
|
||||
return m_socket_manager;
|
||||
}
|
||||
@@ -462,11 +463,11 @@ private:
|
||||
std::vector<u8> m_bytes;
|
||||
};
|
||||
|
||||
static void FinishIOSBoot(u64 ios_title_id)
|
||||
static void FinishIOSBoot(Core::System& system, u64 ios_title_id)
|
||||
{
|
||||
// Shut down the active IOS first before switching to the new one.
|
||||
s_ios.reset();
|
||||
s_ios = std::make_unique<EmulationKernel>(ios_title_id);
|
||||
s_ios = std::make_unique<EmulationKernel>(system, ios_title_id);
|
||||
}
|
||||
|
||||
static constexpr SystemTimers::TimeBaseTick GetIOSBootTicks(u32 version)
|
||||
@@ -515,7 +516,7 @@ bool Kernel::BootIOS(Core::System& system, const u64 ios_title_id, HangPPC hang_
|
||||
}
|
||||
else
|
||||
{
|
||||
FinishIOSBoot(ios_title_id);
|
||||
FinishIOSBoot(system, ios_title_id);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -546,7 +547,7 @@ void Kernel::AddCoreDevices()
|
||||
AddDevice(std::make_unique<ESDevice>(*this, "/dev/es"));
|
||||
}
|
||||
|
||||
void Kernel::AddStaticDevices()
|
||||
void EmulationKernel::AddStaticDevices()
|
||||
{
|
||||
std::lock_guard lock(m_device_map_mutex);
|
||||
|
||||
@@ -623,7 +624,7 @@ void Kernel::AddStaticDevices()
|
||||
}
|
||||
}
|
||||
|
||||
s32 Kernel::GetFreeDeviceID()
|
||||
s32 EmulationKernel::GetFreeDeviceID()
|
||||
{
|
||||
for (u32 i = 0; i < IPC_MAX_FDS; i++)
|
||||
{
|
||||
@@ -649,7 +650,7 @@ std::shared_ptr<Device> EmulationKernel::GetDeviceByName(std::string_view device
|
||||
}
|
||||
|
||||
// Returns the FD for the newly opened device (on success) or an error code.
|
||||
std::optional<IPCReply> Kernel::OpenDevice(OpenRequest& request)
|
||||
std::optional<IPCReply> EmulationKernel::OpenDevice(OpenRequest& request)
|
||||
{
|
||||
const s32 new_fd = GetFreeDeviceID();
|
||||
INFO_LOG_FMT(IOS, "Opening {} (mode {}, fd {})", request.path, static_cast<u32>(request.flags),
|
||||
@@ -691,14 +692,14 @@ std::optional<IPCReply> Kernel::OpenDevice(OpenRequest& request)
|
||||
return result;
|
||||
}
|
||||
|
||||
std::optional<IPCReply> Kernel::HandleIPCCommand(const Request& request)
|
||||
std::optional<IPCReply> EmulationKernel::HandleIPCCommand(const Request& request)
|
||||
{
|
||||
if (request.command < IPC_CMD_OPEN || request.command > IPC_CMD_IOCTLV)
|
||||
return IPCReply{IPC_EINVAL, 978_tbticks};
|
||||
|
||||
if (request.command == IPC_CMD_OPEN)
|
||||
{
|
||||
OpenRequest open_request{request.address};
|
||||
OpenRequest open_request{GetSystem(), request.address};
|
||||
return OpenDevice(open_request);
|
||||
}
|
||||
|
||||
@@ -716,19 +717,19 @@ std::optional<IPCReply> Kernel::HandleIPCCommand(const Request& request)
|
||||
ret = device->Close(request.fd);
|
||||
break;
|
||||
case IPC_CMD_READ:
|
||||
ret = device->Read(ReadWriteRequest{request.address});
|
||||
ret = device->Read(ReadWriteRequest{GetSystem(), request.address});
|
||||
break;
|
||||
case IPC_CMD_WRITE:
|
||||
ret = device->Write(ReadWriteRequest{request.address});
|
||||
ret = device->Write(ReadWriteRequest{GetSystem(), request.address});
|
||||
break;
|
||||
case IPC_CMD_SEEK:
|
||||
ret = device->Seek(SeekRequest{request.address});
|
||||
ret = device->Seek(SeekRequest{GetSystem(), request.address});
|
||||
break;
|
||||
case IPC_CMD_IOCTL:
|
||||
ret = device->IOCtl(IOCtlRequest{request.address});
|
||||
ret = device->IOCtl(IOCtlRequest{GetSystem(), request.address});
|
||||
break;
|
||||
case IPC_CMD_IOCTLV:
|
||||
ret = device->IOCtlV(IOCtlVRequest{request.address});
|
||||
ret = device->IOCtlV(IOCtlVRequest{GetSystem(), request.address});
|
||||
break;
|
||||
default:
|
||||
ASSERT_MSG(IOS, false, "Unexpected command: {:#x}", static_cast<u32>(request.command));
|
||||
@@ -747,17 +748,16 @@ std::optional<IPCReply> Kernel::HandleIPCCommand(const Request& request)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Kernel::ExecuteIPCCommand(const u32 address)
|
||||
void EmulationKernel::ExecuteIPCCommand(const u32 address)
|
||||
{
|
||||
Request request{address};
|
||||
Request request{GetSystem(), address};
|
||||
std::optional<IPCReply> result = HandleIPCCommand(request);
|
||||
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
// Ensure replies happen in order
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& core_timing = system.GetCoreTiming();
|
||||
auto& core_timing = GetSystem().GetCoreTiming();
|
||||
const s64 ticks_until_last_reply = m_last_reply_time - core_timing.GetTicks();
|
||||
if (ticks_until_last_reply > 0)
|
||||
result->reply_delay_ticks += ticks_until_last_reply;
|
||||
@@ -767,20 +767,20 @@ void Kernel::ExecuteIPCCommand(const u32 address)
|
||||
}
|
||||
|
||||
// Happens AS SOON AS IPC gets a new pointer!
|
||||
void Kernel::EnqueueIPCRequest(u32 address)
|
||||
void EmulationKernel::EnqueueIPCRequest(u32 address)
|
||||
{
|
||||
// Based on hardware tests, IOS takes between 5µs and 10µs to acknowledge an IPC request.
|
||||
// Console 1: 456 TB ticks before ACK
|
||||
// Console 2: 658 TB ticks before ACK
|
||||
Core::System::GetInstance().GetCoreTiming().ScheduleEvent(500_tbticks, s_event_enqueue,
|
||||
address | ENQUEUE_REQUEST_FLAG);
|
||||
GetSystem().GetCoreTiming().ScheduleEvent(500_tbticks, s_event_enqueue,
|
||||
address | ENQUEUE_REQUEST_FLAG);
|
||||
}
|
||||
|
||||
// Called to send a reply to an IOS syscall
|
||||
void Kernel::EnqueueIPCReply(const Request& request, const s32 return_value, s64 cycles_in_future,
|
||||
CoreTiming::FromThread from)
|
||||
void EmulationKernel::EnqueueIPCReply(const Request& request, const s32 return_value,
|
||||
s64 cycles_in_future, CoreTiming::FromThread from)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
memory.Write_U32(static_cast<u32>(return_value), request.address + 4);
|
||||
// IOS writes back the command that was responded to in the FD field.
|
||||
@@ -790,7 +790,7 @@ void Kernel::EnqueueIPCReply(const Request& request, const s32 return_value, s64
|
||||
system.GetCoreTiming().ScheduleEvent(cycles_in_future, s_event_enqueue, request.address, from);
|
||||
}
|
||||
|
||||
void Kernel::HandleIPCEvent(u64 userdata)
|
||||
void EmulationKernel::HandleIPCEvent(u64 userdata)
|
||||
{
|
||||
if (userdata & ENQUEUE_REQUEST_FLAG)
|
||||
m_request_queue.push_back(static_cast<u32>(userdata));
|
||||
@@ -800,7 +800,7 @@ void Kernel::HandleIPCEvent(u64 userdata)
|
||||
UpdateIPC();
|
||||
}
|
||||
|
||||
void Kernel::UpdateIPC()
|
||||
void EmulationKernel::UpdateIPC()
|
||||
{
|
||||
if (m_ipc_paused || !IsReady())
|
||||
return;
|
||||
@@ -824,7 +824,7 @@ void Kernel::UpdateIPC()
|
||||
}
|
||||
}
|
||||
|
||||
void Kernel::UpdateDevices()
|
||||
void EmulationKernel::UpdateDevices()
|
||||
{
|
||||
// Check if a hardware device must be updated
|
||||
for (const auto& entry : m_device_map)
|
||||
@@ -836,7 +836,7 @@ void Kernel::UpdateDevices()
|
||||
}
|
||||
}
|
||||
|
||||
void Kernel::UpdateWantDeterminism(const bool new_want_determinism)
|
||||
void EmulationKernel::UpdateWantDeterminism(const bool new_want_determinism)
|
||||
{
|
||||
if (m_socket_manager)
|
||||
m_socket_manager->UpdateWantDeterminism(new_want_determinism);
|
||||
@@ -844,7 +844,7 @@ void Kernel::UpdateWantDeterminism(const bool new_want_determinism)
|
||||
device.second->UpdateWantDeterminism(new_want_determinism);
|
||||
}
|
||||
|
||||
void Kernel::DoState(PointerWrap& p)
|
||||
void EmulationKernel::DoState(PointerWrap& p)
|
||||
{
|
||||
p.Do(m_request_queue);
|
||||
p.Do(m_reply_queue);
|
||||
@@ -954,15 +954,15 @@ void Init()
|
||||
s_event_finish_ppc_bootstrap =
|
||||
core_timing.RegisterEvent("IOSFinishPPCBootstrap", FinishPPCBootstrap);
|
||||
|
||||
s_event_finish_ios_boot =
|
||||
core_timing.RegisterEvent("IOSFinishIOSBoot", [](Core::System& system_, u64 ios_title_id,
|
||||
s64) { FinishIOSBoot(ios_title_id); });
|
||||
s_event_finish_ios_boot = core_timing.RegisterEvent(
|
||||
"IOSFinishIOSBoot",
|
||||
[](Core::System& system_, u64 ios_title_id, s64) { FinishIOSBoot(system_, ios_title_id); });
|
||||
|
||||
DIDevice::s_finish_executing_di_command =
|
||||
core_timing.RegisterEvent("FinishDICommand", DIDevice::FinishDICommandCallback);
|
||||
|
||||
// Start with IOS80 to simulate part of the Wii boot process.
|
||||
s_ios = std::make_unique<EmulationKernel>(Titles::SYSTEM_MENU_IOS);
|
||||
s_ios = std::make_unique<EmulationKernel>(system, Titles::SYSTEM_MENU_IOS);
|
||||
// On a Wii, boot2 launches the system menu IOS, which then launches the system menu
|
||||
// (which bootstraps the PPC). Bootstrapping the PPC results in memory values being set up.
|
||||
// This means that the constants in the 0x3100 region are always set up by the time
|
||||
|
||||
+27
-21
@@ -119,25 +119,12 @@ public:
|
||||
explicit Kernel(IOSC::ConsoleType console_type = IOSC::ConsoleType::Retail);
|
||||
virtual ~Kernel();
|
||||
|
||||
void DoState(PointerWrap& p);
|
||||
void HandleIPCEvent(u64 userdata);
|
||||
void UpdateIPC();
|
||||
void UpdateDevices();
|
||||
void UpdateWantDeterminism(bool new_want_determinism);
|
||||
|
||||
// These are *always* part of the IOS kernel and always available.
|
||||
// They are also the only available resource managers even before loading any module.
|
||||
std::shared_ptr<FS::FileSystem> GetFS();
|
||||
std::shared_ptr<FSDevice> GetFSDevice();
|
||||
std::shared_ptr<ESDevice> GetES();
|
||||
|
||||
// This is only available on an EmulationKernel if the IOS features require it.
|
||||
std::shared_ptr<WiiSockMan> GetSocketManager();
|
||||
|
||||
void EnqueueIPCRequest(u32 address);
|
||||
void EnqueueIPCReply(const Request& request, s32 return_value, s64 cycles_in_future = 0,
|
||||
CoreTiming::FromThread from = CoreTiming::FromThread::CPU);
|
||||
|
||||
void SetUidForPPC(u32 uid);
|
||||
u32 GetUidForPPC() const;
|
||||
void SetGidForPPC(u16 gid);
|
||||
@@ -154,15 +141,9 @@ public:
|
||||
protected:
|
||||
explicit Kernel(u64 title_id);
|
||||
|
||||
void ExecuteIPCCommand(u32 address);
|
||||
std::optional<IPCReply> HandleIPCCommand(const Request& request);
|
||||
|
||||
void AddDevice(std::unique_ptr<Device> device);
|
||||
void AddCoreDevices();
|
||||
void AddStaticDevices();
|
||||
std::shared_ptr<Device> GetDeviceByName(std::string_view device_name);
|
||||
s32 GetFreeDeviceID();
|
||||
std::optional<IPCReply> OpenDevice(OpenRequest& request);
|
||||
|
||||
bool m_is_responsible_for_nand_root = false;
|
||||
u64 m_title_id = 0;
|
||||
@@ -187,15 +168,40 @@ protected:
|
||||
};
|
||||
|
||||
// HLE for an IOS tied to emulation: base kernel which may have additional modules loaded.
|
||||
class EmulationKernel : public Kernel
|
||||
class EmulationKernel final : public Kernel
|
||||
{
|
||||
public:
|
||||
explicit EmulationKernel(u64 ios_title_id);
|
||||
EmulationKernel(Core::System& system, u64 ios_title_id);
|
||||
~EmulationKernel();
|
||||
|
||||
// Get a resource manager by name.
|
||||
// This only works for devices which are part of the device map.
|
||||
std::shared_ptr<Device> GetDeviceByName(std::string_view device_name);
|
||||
|
||||
void DoState(PointerWrap& p);
|
||||
void UpdateDevices();
|
||||
void UpdateWantDeterminism(bool new_want_determinism);
|
||||
|
||||
std::shared_ptr<WiiSockMan> GetSocketManager();
|
||||
|
||||
void HandleIPCEvent(u64 userdata);
|
||||
void UpdateIPC();
|
||||
|
||||
void EnqueueIPCRequest(u32 address);
|
||||
void EnqueueIPCReply(const Request& request, s32 return_value, s64 cycles_in_future = 0,
|
||||
CoreTiming::FromThread from = CoreTiming::FromThread::CPU);
|
||||
|
||||
Core::System& GetSystem() const { return m_system; }
|
||||
|
||||
private:
|
||||
Core::System& m_system;
|
||||
|
||||
void ExecuteIPCCommand(u32 address);
|
||||
std::optional<IPCReply> HandleIPCCommand(const Request& request);
|
||||
|
||||
void AddStaticDevices();
|
||||
s32 GetFreeDeviceID();
|
||||
std::optional<IPCReply> OpenDevice(OpenRequest& request);
|
||||
};
|
||||
|
||||
// Used for controlling and accessing an IOS instance that is tied to emulation.
|
||||
|
||||
@@ -62,8 +62,8 @@ enum SOResultCode : s32
|
||||
SO_ERROR_HOST_NOT_FOUND = -305,
|
||||
};
|
||||
|
||||
NetIPTopDevice::NetIPTopDevice(Kernel& ios, const std::string& device_name)
|
||||
: Device(ios, device_name)
|
||||
NetIPTopDevice::NetIPTopDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name)
|
||||
{
|
||||
m_work_queue.Reset("Network Worker", [this](AsyncTask task) {
|
||||
const IPCReply reply = task.handler();
|
||||
@@ -330,7 +330,7 @@ std::optional<IPCReply> NetIPTopDevice::IOCtl(const IOCtlRequest& request)
|
||||
case IOCTL_SO_ICMPCANCEL:
|
||||
return HandleICMPCancelRequest(request);
|
||||
default:
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_NET);
|
||||
request.DumpUnknown(GetSystem(), GetDeviceName(), Common::Log::LogType::IOS_NET);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -352,7 +352,7 @@ std::optional<IPCReply> NetIPTopDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
case IOCTLV_SO_ICMPPING:
|
||||
return HandleICMPPingRequest(request);
|
||||
default:
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_NET);
|
||||
request.DumpUnknown(GetSystem(), GetDeviceName(), Common::Log::LogType::IOS_NET);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -366,11 +366,11 @@ void NetIPTopDevice::Update()
|
||||
while (!m_async_replies.empty())
|
||||
{
|
||||
const auto& reply = m_async_replies.front();
|
||||
GetIOS()->EnqueueIPCReply(reply.request, reply.return_value);
|
||||
GetEmulationKernel().EnqueueIPCReply(reply.request, reply.return_value);
|
||||
m_async_replies.pop();
|
||||
}
|
||||
}
|
||||
m_ios.GetSocketManager()->Update();
|
||||
GetEmulationKernel().GetSocketManager()->Update();
|
||||
}
|
||||
|
||||
IPCReply NetIPTopDevice::HandleInitInterfaceRequest(const IOCtlRequest& request)
|
||||
@@ -381,14 +381,14 @@ IPCReply NetIPTopDevice::HandleInitInterfaceRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleSocketRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 af = memory.Read_U32(request.buffer_in);
|
||||
const u32 type = memory.Read_U32(request.buffer_in + 4);
|
||||
const u32 prot = memory.Read_U32(request.buffer_in + 8);
|
||||
|
||||
const s32 return_value = m_ios.GetSocketManager()->NewSocket(af, type, prot);
|
||||
const s32 return_value = GetEmulationKernel().GetSocketManager()->NewSocket(af, type, prot);
|
||||
INFO_LOG_FMT(IOS_NET,
|
||||
"IOCTL_SO_SOCKET "
|
||||
"Socket: {:08x} ({},{},{}), BufferIn: ({:08x}, {}), BufferOut: ({:08x}, {})",
|
||||
@@ -400,23 +400,24 @@ IPCReply NetIPTopDevice::HandleSocketRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleICMPSocketRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 pf = memory.Read_U32(request.buffer_in);
|
||||
|
||||
const s32 return_value = m_ios.GetSocketManager()->NewSocket(pf, SOCK_RAW, IPPROTO_ICMP);
|
||||
const s32 return_value =
|
||||
GetEmulationKernel().GetSocketManager()->NewSocket(pf, SOCK_RAW, IPPROTO_ICMP);
|
||||
INFO_LOG_FMT(IOS_NET, "IOCTL_SO_ICMPSOCKET({:x}) {}", pf, return_value);
|
||||
return IPCReply(return_value);
|
||||
}
|
||||
|
||||
IPCReply NetIPTopDevice::HandleCloseRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 fd = memory.Read_U32(request.buffer_in);
|
||||
const s32 return_value = m_ios.GetSocketManager()->DeleteSocket(fd);
|
||||
const s32 return_value = GetEmulationKernel().GetSocketManager()->DeleteSocket(fd);
|
||||
const char* const close_fn =
|
||||
request.request == IOCTL_SO_ICMPCLOSE ? "IOCTL_SO_ICMPCLOSE" : "IOCTL_SO_CLOSE";
|
||||
|
||||
@@ -427,11 +428,12 @@ IPCReply NetIPTopDevice::HandleCloseRequest(const IOCtlRequest& request)
|
||||
|
||||
std::optional<IPCReply> NetIPTopDevice::HandleDoSockRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 fd = memory.Read_U32(request.buffer_in);
|
||||
m_ios.GetSocketManager()->DoSock(fd, request, static_cast<NET_IOCTL>(request.request));
|
||||
GetEmulationKernel().GetSocketManager()->DoSock(fd, request,
|
||||
static_cast<NET_IOCTL>(request.request));
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -444,12 +446,12 @@ IPCReply NetIPTopDevice::HandleShutdownRequest(const IOCtlRequest& request)
|
||||
return IPCReply(-SO_EINVAL);
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 fd = memory.Read_U32(request.buffer_in);
|
||||
const u32 how = memory.Read_U32(request.buffer_in + 4);
|
||||
const s32 return_value = m_ios.GetSocketManager()->ShutdownSocket(fd, how);
|
||||
const s32 return_value = GetEmulationKernel().GetSocketManager()->ShutdownSocket(fd, how);
|
||||
|
||||
INFO_LOG_FMT(IOS_NET, "IOCTL_SO_SHUTDOWN(fd={}, how={}) = {}", fd, how, return_value);
|
||||
return IPCReply(return_value);
|
||||
@@ -457,12 +459,12 @@ IPCReply NetIPTopDevice::HandleShutdownRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleListenRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
u32 fd = memory.Read_U32(request.buffer_in);
|
||||
u32 BACKLOG = memory.Read_U32(request.buffer_in + 0x04);
|
||||
auto socket_manager = m_ios.GetSocketManager();
|
||||
auto socket_manager = GetEmulationKernel().GetSocketManager();
|
||||
u32 ret = listen(socket_manager->GetHostSocket(fd), BACKLOG);
|
||||
|
||||
request.Log(GetDeviceName(), Common::Log::LogType::IOS_WC24);
|
||||
@@ -471,7 +473,7 @@ IPCReply NetIPTopDevice::HandleListenRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleGetSockOptRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
u32 fd = memory.Read_U32(request.buffer_out);
|
||||
@@ -487,7 +489,7 @@ IPCReply NetIPTopDevice::HandleGetSockOptRequest(const IOCtlRequest& request)
|
||||
u8 optval[20];
|
||||
u32 optlen = 4;
|
||||
|
||||
auto socket_manager = m_ios.GetSocketManager();
|
||||
auto socket_manager = GetEmulationKernel().GetSocketManager();
|
||||
int ret = getsockopt(socket_manager->GetHostSocket(fd), nat_level, nat_optname, (char*)&optval,
|
||||
(socklen_t*)&optlen);
|
||||
const s32 return_value = socket_manager->GetNetErrorCode(ret, "SO_GETSOCKOPT", false);
|
||||
@@ -508,7 +510,7 @@ IPCReply NetIPTopDevice::HandleGetSockOptRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleSetSockOptRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 fd = memory.Read_U32(request.buffer_in);
|
||||
@@ -539,7 +541,7 @@ IPCReply NetIPTopDevice::HandleSetSockOptRequest(const IOCtlRequest& request)
|
||||
const int nat_level = MapWiiSockOptLevelToNative(level);
|
||||
const int nat_optname = MapWiiSockOptNameToNative(optname);
|
||||
|
||||
auto socket_manager = m_ios.GetSocketManager();
|
||||
auto socket_manager = GetEmulationKernel().GetSocketManager();
|
||||
const int ret = setsockopt(socket_manager->GetHostSocket(fd), nat_level, nat_optname,
|
||||
reinterpret_cast<char*>(optval), optlen);
|
||||
return IPCReply(socket_manager->GetNetErrorCode(ret, "SO_SETSOCKOPT", false));
|
||||
@@ -547,7 +549,7 @@ IPCReply NetIPTopDevice::HandleSetSockOptRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleGetSockNameRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
u32 fd = memory.Read_U32(request.buffer_in);
|
||||
@@ -556,7 +558,8 @@ IPCReply NetIPTopDevice::HandleGetSockNameRequest(const IOCtlRequest& request)
|
||||
|
||||
sockaddr sa;
|
||||
socklen_t sa_len = sizeof(sa);
|
||||
const int ret = getsockname(m_ios.GetSocketManager()->GetHostSocket(fd), &sa, &sa_len);
|
||||
const int ret =
|
||||
getsockname(GetEmulationKernel().GetSocketManager()->GetHostSocket(fd), &sa, &sa_len);
|
||||
|
||||
if (request.buffer_out_size < 2 + sizeof(sa.sa_data))
|
||||
WARN_LOG_FMT(IOS_NET, "IOCTL_SO_GETSOCKNAME output buffer is too small. Truncating");
|
||||
@@ -576,14 +579,15 @@ IPCReply NetIPTopDevice::HandleGetSockNameRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleGetPeerNameRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
u32 fd = memory.Read_U32(request.buffer_in);
|
||||
|
||||
sockaddr sa;
|
||||
socklen_t sa_len = sizeof(sa);
|
||||
const int ret = getpeername(m_ios.GetSocketManager()->GetHostSocket(fd), &sa, &sa_len);
|
||||
const int ret =
|
||||
getpeername(GetEmulationKernel().GetSocketManager()->GetHostSocket(fd), &sa, &sa_len);
|
||||
|
||||
if (request.buffer_out_size < 2 + sizeof(sa.sa_data))
|
||||
WARN_LOG_FMT(IOS_NET, "IOCTL_SO_GETPEERNAME output buffer is too small. Truncating");
|
||||
@@ -613,7 +617,7 @@ IPCReply NetIPTopDevice::HandleGetHostIDRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleInetAToNRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const std::string hostname = memory.GetString(request.buffer_in);
|
||||
@@ -645,7 +649,7 @@ IPCReply NetIPTopDevice::HandleInetAToNRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleInetPToNRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const std::string address = memory.GetString(request.buffer_in);
|
||||
@@ -655,7 +659,7 @@ IPCReply NetIPTopDevice::HandleInetPToNRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleInetNToPRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
// u32 af = memory.Read_U32(BufferIn);
|
||||
@@ -674,12 +678,12 @@ IPCReply NetIPTopDevice::HandleInetNToPRequest(const IOCtlRequest& request)
|
||||
|
||||
std::optional<IPCReply> NetIPTopDevice::HandlePollRequest(const IOCtlRequest& request)
|
||||
{
|
||||
auto sm = m_ios.GetSocketManager();
|
||||
auto sm = GetEmulationKernel().GetSocketManager();
|
||||
|
||||
if (!request.buffer_in || !request.buffer_out)
|
||||
return IPCReply(-SO_EINVAL);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
// Negative timeout indicates wait forever
|
||||
@@ -726,7 +730,7 @@ IPCReply NetIPTopDevice::HandleGetHostByNameRequest(const IOCtlRequest& request)
|
||||
return IPCReply(-1);
|
||||
}
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const std::string hostname = memory.GetString(request.buffer_in);
|
||||
@@ -814,7 +818,7 @@ IPCReply NetIPTopDevice::HandleICMPCancelRequest(const IOCtlRequest& request)
|
||||
|
||||
IPCReply NetIPTopDevice::HandleGetInterfaceOptRequest(const IOCtlVRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 param = memory.Read_U32(request.in_vectors[0].address);
|
||||
@@ -1007,27 +1011,27 @@ IPCReply NetIPTopDevice::HandleGetInterfaceOptRequest(const IOCtlVRequest& reque
|
||||
|
||||
std::optional<IPCReply> NetIPTopDevice::HandleSendToRequest(const IOCtlVRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
u32 fd = memory.Read_U32(request.in_vectors[1].address);
|
||||
m_ios.GetSocketManager()->DoSock(fd, request, IOCTLV_SO_SENDTO);
|
||||
GetEmulationKernel().GetSocketManager()->DoSock(fd, request, IOCTLV_SO_SENDTO);
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<IPCReply> NetIPTopDevice::HandleRecvFromRequest(const IOCtlVRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
u32 fd = memory.Read_U32(request.in_vectors[0].address);
|
||||
m_ios.GetSocketManager()->DoSock(fd, request, IOCTLV_SO_RECVFROM);
|
||||
GetEmulationKernel().GetSocketManager()->DoSock(fd, request, IOCTLV_SO_RECVFROM);
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
IPCReply NetIPTopDevice::HandleGetAddressInfoRequest(const IOCtlVRequest& request)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
addrinfo hints;
|
||||
@@ -1113,7 +1117,8 @@ IPCReply NetIPTopDevice::HandleGetAddressInfoRequest(const IOCtlVRequest& reques
|
||||
ret = SO_ERROR_HOST_NOT_FOUND;
|
||||
}
|
||||
|
||||
request.Dump(GetDeviceName(), Common::Log::LogType::IOS_NET, Common::Log::LogLevel::LINFO);
|
||||
request.Dump(system, GetDeviceName(), Common::Log::LogType::IOS_NET,
|
||||
Common::Log::LogLevel::LINFO);
|
||||
return IPCReply(ret);
|
||||
}
|
||||
|
||||
@@ -1127,7 +1132,7 @@ IPCReply NetIPTopDevice::HandleICMPPingRequest(const IOCtlVRequest& request)
|
||||
u32 ip;
|
||||
} ip_info;
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
const u32 fd = memory.Read_U32(request.in_vectors[0].address);
|
||||
@@ -1176,7 +1181,7 @@ IPCReply NetIPTopDevice::HandleICMPPingRequest(const IOCtlVRequest& request)
|
||||
icmp_length = 22;
|
||||
}
|
||||
|
||||
auto socket_manager = m_ios.GetSocketManager();
|
||||
auto socket_manager = GetEmulationKernel().GetSocketManager();
|
||||
int ret = icmp_echo_req(socket_manager->GetHostSocket(fd), &addr, data, icmp_length);
|
||||
if (ret == icmp_length)
|
||||
{
|
||||
|
||||
@@ -63,10 +63,10 @@ enum NET_IOCTL
|
||||
IOCTL_SO_ICMPCLOSE
|
||||
};
|
||||
|
||||
class NetIPTopDevice : public Device
|
||||
class NetIPTopDevice : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
NetIPTopDevice(Kernel& ios, const std::string& device_name);
|
||||
NetIPTopDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
|
||||
void DoState(PointerWrap& p) override;
|
||||
std::optional<IPCReply> IOCtl(const IOCtlRequest& request) override;
|
||||
|
||||
@@ -147,8 +147,8 @@ s32 NWC24MakeUserID(u64* nwc24_id, u32 hollywood_id, u16 id_ctr, HardwareModel h
|
||||
}
|
||||
} // Anonymous namespace
|
||||
|
||||
NetKDRequestDevice::NetKDRequestDevice(Kernel& ios, const std::string& device_name)
|
||||
: Device(ios, device_name), config{ios.GetFS()}, m_dl_list{ios.GetFS()}
|
||||
NetKDRequestDevice::NetKDRequestDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name), config{ios.GetFS()}, m_dl_list{ios.GetFS()}
|
||||
{
|
||||
m_work_queue.Reset("WiiConnect24 Worker", [this](AsyncTask task) {
|
||||
const IPCReply reply = task.handler();
|
||||
@@ -161,7 +161,7 @@ NetKDRequestDevice::NetKDRequestDevice(Kernel& ios, const std::string& device_na
|
||||
|
||||
NetKDRequestDevice::~NetKDRequestDevice()
|
||||
{
|
||||
auto socket_manager = m_ios.GetSocketManager();
|
||||
auto socket_manager = GetEmulationKernel().GetSocketManager();
|
||||
if (socket_manager)
|
||||
socket_manager->Clean();
|
||||
}
|
||||
@@ -173,7 +173,7 @@ void NetKDRequestDevice::Update()
|
||||
while (!m_async_replies.empty())
|
||||
{
|
||||
const auto& reply = m_async_replies.front();
|
||||
GetIOS()->EnqueueIPCReply(reply.request, reply.return_value);
|
||||
GetEmulationKernel().EnqueueIPCReply(reply.request, reply.return_value);
|
||||
m_async_replies.pop();
|
||||
}
|
||||
}
|
||||
@@ -236,7 +236,7 @@ NWC24::ErrorCode NetKDRequestDevice::KDDownload(const u16 entry_index,
|
||||
IPCReply NetKDRequestDevice::HandleNWC24DownloadNowEx(const IOCtlRequest& request)
|
||||
{
|
||||
m_dl_list.ReadDlList();
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
const u32 flags = memory.Read_U32(request.buffer_in);
|
||||
// Nintendo converts the entry ID between a u32 and u16
|
||||
@@ -321,7 +321,7 @@ std::optional<IPCReply> NetKDRequestDevice::IOCtl(const IOCtlRequest& request)
|
||||
IOCTL_NWC24_REQUEST_SHUTDOWN = 0x28,
|
||||
};
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
s32 return_value = 0;
|
||||
switch (request.request)
|
||||
@@ -350,7 +350,7 @@ std::optional<IPCReply> NetKDRequestDevice::IOCtl(const IOCtlRequest& request)
|
||||
|
||||
case IOCTL_NWC24_CLEANUP_SOCKET:
|
||||
INFO_LOG_FMT(IOS_WC24, "NET_KD_REQ: IOCTL_NWC24_CLEANUP_SOCKET");
|
||||
m_ios.GetSocketManager()->Clean();
|
||||
GetEmulationKernel().GetSocketManager()->Clean();
|
||||
break;
|
||||
|
||||
case IOCTL_NWC24_LOCK_SOCKET: // WiiMenu
|
||||
@@ -454,7 +454,7 @@ std::optional<IPCReply> NetKDRequestDevice::IOCtl(const IOCtlRequest& request)
|
||||
// SOGetInterfaceOpt(0xfffe,0xc001); // DHCP lease time remaining?
|
||||
// SOGetInterfaceOpt(0xfffe,0x1003); // Error
|
||||
// Call /dev/net/ip/top 0x1b (SOCleanup), it closes all sockets
|
||||
m_ios.GetSocketManager()->Clean();
|
||||
GetEmulationKernel().GetSocketManager()->Clean();
|
||||
return_value = IPC_SUCCESS;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -21,10 +21,10 @@ constexpr const char DL_CNT_PATH[] = "/" WII_WC24CONF_DIR "/dlcnt.bin";
|
||||
// KD is the IOS module responsible for implementing WiiConnect24 functionality.
|
||||
// It can perform HTTPS downloads, send and receive mail via SMTP, and execute a
|
||||
// JavaScript-like language while the Wii is in standby mode.
|
||||
class NetKDRequestDevice : public Device
|
||||
class NetKDRequestDevice : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
NetKDRequestDevice(Kernel& ios, const std::string& device_name);
|
||||
NetKDRequestDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
IPCReply HandleNWC24DownloadNowEx(const IOCtlRequest& request);
|
||||
NWC24::ErrorCode KDDownload(const u16 entry_index, const std::optional<u8> subtask_id);
|
||||
~NetKDRequestDevice() override;
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
NetKDTimeDevice::NetKDTimeDevice(Kernel& ios, const std::string& device_name)
|
||||
: Device(ios, device_name)
|
||||
NetKDTimeDevice::NetKDTimeDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ std::optional<IPCReply> NetKDTimeDevice::IOCtl(const IOCtlRequest& request)
|
||||
// TODO Writes stuff to /shared2/nwc24/misc.bin
|
||||
u32 update_misc = 0;
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
switch (request.request)
|
||||
@@ -78,7 +78,7 @@ std::optional<IPCReply> NetKDTimeDevice::IOCtl(const IOCtlRequest& request)
|
||||
break;
|
||||
|
||||
default:
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_WC24);
|
||||
request.DumpUnknown(system, GetDeviceName(), Common::Log::LogType::IOS_WC24);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -91,8 +91,7 @@ u64 NetKDTimeDevice::GetAdjustedUTC() const
|
||||
{
|
||||
using namespace ExpansionInterface;
|
||||
|
||||
const time_t current_time =
|
||||
CEXIIPL::GetEmulatedTime(Core::System::GetInstance(), CEXIIPL::UNIX_EPOCH);
|
||||
const time_t current_time = CEXIIPL::GetEmulatedTime(GetSystem(), CEXIIPL::UNIX_EPOCH);
|
||||
tm* const gm_time = gmtime(¤t_time);
|
||||
const u32 emulated_time = mktime(gm_time);
|
||||
return u64(s64(emulated_time) + utcdiff);
|
||||
@@ -102,8 +101,7 @@ void NetKDTimeDevice::SetAdjustedUTC(u64 wii_utc)
|
||||
{
|
||||
using namespace ExpansionInterface;
|
||||
|
||||
const time_t current_time =
|
||||
CEXIIPL::GetEmulatedTime(Core::System::GetInstance(), CEXIIPL::UNIX_EPOCH);
|
||||
const time_t current_time = CEXIIPL::GetEmulatedTime(GetSystem(), CEXIIPL::UNIX_EPOCH);
|
||||
tm* const gm_time = gmtime(¤t_time);
|
||||
const u32 emulated_time = mktime(gm_time);
|
||||
utcdiff = s64(emulated_time - wii_utc);
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
class NetKDTimeDevice : public Device
|
||||
class NetKDTimeDevice : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
NetKDTimeDevice(Kernel& ios, const std::string& device_name);
|
||||
NetKDTimeDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
~NetKDTimeDevice() override;
|
||||
|
||||
std::optional<IPCReply> IOCtl(const IOCtlRequest& request) override;
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
|
||||
namespace IOS::HLE
|
||||
{
|
||||
NetNCDManageDevice::NetNCDManageDevice(Kernel& ios, const std::string& device_name)
|
||||
: Device(ios, device_name)
|
||||
NetNCDManageDevice::NetNCDManageDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name)
|
||||
{
|
||||
config.ReadConfig(ios.GetFS().get());
|
||||
}
|
||||
@@ -33,7 +33,7 @@ std::optional<IPCReply> NetNCDManageDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
u32 common_result = 0;
|
||||
u32 common_vector = 0;
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
switch (request.request)
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
namespace IOS::HLE
|
||||
{
|
||||
// Interface for reading and changing network configuration (probably some other stuff as well)
|
||||
class NetNCDManageDevice : public Device
|
||||
class NetNCDManageDevice : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
NetNCDManageDevice(Kernel& ios, const std::string& device_name);
|
||||
NetNCDManageDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
|
||||
std::optional<IPCReply> IOCtlV(const IOCtlVRequest& request) override;
|
||||
|
||||
|
||||
@@ -88,7 +88,8 @@ int SSLRecv(void* ctx, unsigned char* buf, size_t len)
|
||||
}
|
||||
} // namespace
|
||||
|
||||
NetSSLDevice::NetSSLDevice(Kernel& ios, const std::string& device_name) : Device(ios, device_name)
|
||||
NetSSLDevice::NetSSLDevice(EmulationKernel& ios, const std::string& device_name)
|
||||
: EmulationDevice(ios, device_name)
|
||||
{
|
||||
for (WII_SSL& ssl : _SSL)
|
||||
{
|
||||
@@ -496,7 +497,7 @@ std::optional<IPCReply> NetSSLDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
WII_SSL* ssl = &_SSL[sslID];
|
||||
mbedtls_ssl_setup(&ssl->ctx, &ssl->config);
|
||||
ssl->sockfd = memory.Read_U32(BufferOut2);
|
||||
ssl->hostfd = m_ios.GetSocketManager()->GetHostSocket(ssl->sockfd);
|
||||
ssl->hostfd = GetEmulationKernel().GetSocketManager()->GetHostSocket(ssl->sockfd);
|
||||
INFO_LOG_FMT(IOS_SSL, "IOCTLV_NET_SSL_CONNECT socket = {}", ssl->sockfd);
|
||||
mbedtls_ssl_set_bio(&ssl->ctx, ssl, SSLSendWithoutSNI, SSLRecv, nullptr);
|
||||
WriteReturnValue(SSL_OK, BufferIn);
|
||||
@@ -519,7 +520,8 @@ std::optional<IPCReply> NetSSLDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
int sslID = memory.Read_U32(BufferOut) - 1;
|
||||
if (IsSSLIDValid(sslID))
|
||||
{
|
||||
m_ios.GetSocketManager()->DoSock(_SSL[sslID].sockfd, request, IOCTLV_NET_SSL_DOHANDSHAKE);
|
||||
GetEmulationKernel().GetSocketManager()->DoSock(_SSL[sslID].sockfd, request,
|
||||
IOCTLV_NET_SSL_DOHANDSHAKE);
|
||||
return std::nullopt;
|
||||
}
|
||||
else
|
||||
@@ -533,7 +535,8 @@ std::optional<IPCReply> NetSSLDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
const int sslID = memory.Read_U32(BufferOut) - 1;
|
||||
if (IsSSLIDValid(sslID))
|
||||
{
|
||||
m_ios.GetSocketManager()->DoSock(_SSL[sslID].sockfd, request, IOCTLV_NET_SSL_WRITE);
|
||||
GetEmulationKernel().GetSocketManager()->DoSock(_SSL[sslID].sockfd, request,
|
||||
IOCTLV_NET_SSL_WRITE);
|
||||
return std::nullopt;
|
||||
}
|
||||
else
|
||||
@@ -556,7 +559,8 @@ std::optional<IPCReply> NetSSLDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
int sslID = memory.Read_U32(BufferOut) - 1;
|
||||
if (IsSSLIDValid(sslID))
|
||||
{
|
||||
m_ios.GetSocketManager()->DoSock(_SSL[sslID].sockfd, request, IOCTLV_NET_SSL_READ);
|
||||
GetEmulationKernel().GetSocketManager()->DoSock(_SSL[sslID].sockfd, request,
|
||||
IOCTLV_NET_SSL_READ);
|
||||
return std::nullopt;
|
||||
}
|
||||
else
|
||||
@@ -615,7 +619,7 @@ std::optional<IPCReply> NetSSLDevice::IOCtlV(const IOCtlVRequest& request)
|
||||
break;
|
||||
}
|
||||
default:
|
||||
request.DumpUnknown(GetDeviceName(), Common::Log::LogType::IOS_SSL);
|
||||
request.DumpUnknown(system, GetDeviceName(), Common::Log::LogType::IOS_SSL);
|
||||
}
|
||||
|
||||
// SSL return codes are written to BufferIn
|
||||
|
||||
@@ -79,10 +79,10 @@ struct WII_SSL
|
||||
bool active = false;
|
||||
};
|
||||
|
||||
class NetSSLDevice : public Device
|
||||
class NetSSLDevice : public EmulationDevice
|
||||
{
|
||||
public:
|
||||
NetSSLDevice(Kernel& ios, const std::string& device_name);
|
||||
NetSSLDevice(EmulationKernel& ios, const std::string& device_name);
|
||||
|
||||
virtual ~NetSSLDevice();
|
||||
|
||||
|
||||
@@ -260,7 +260,7 @@ void WiiSocket::Update(bool read, bool write, bool except)
|
||||
IPCCommandType ct = it->request.command;
|
||||
if (!it->is_ssl && ct == IPC_CMD_IOCTL)
|
||||
{
|
||||
IOCtlRequest ioctl{it->request.address};
|
||||
IOCtlRequest ioctl{system, it->request.address};
|
||||
switch (it->net_type)
|
||||
{
|
||||
case IOCTL_SO_FCNTL:
|
||||
@@ -351,7 +351,7 @@ void WiiSocket::Update(bool read, bool write, bool except)
|
||||
}
|
||||
else if (ct == IPC_CMD_IOCTLV)
|
||||
{
|
||||
IOCtlVRequest ioctlv{it->request.address};
|
||||
IOCtlVRequest ioctlv{system, it->request.address};
|
||||
u32 BufferIn = 0, BufferIn2 = 0;
|
||||
u32 BufferInSize = 0, BufferInSize2 = 0;
|
||||
u32 BufferOut = 0, BufferOut2 = 0;
|
||||
@@ -1042,8 +1042,8 @@ void WiiSockMan::UpdatePollCommands()
|
||||
pending_polls.erase(
|
||||
std::remove_if(
|
||||
pending_polls.begin(), pending_polls.end(),
|
||||
[&memory, this](PollCommand& pcmd) {
|
||||
const auto request = Request(pcmd.request_addr);
|
||||
[&system, &memory, this](PollCommand& pcmd) {
|
||||
const auto request = Request(system, pcmd.request_addr);
|
||||
auto& pfds = pcmd.wii_fds;
|
||||
int ret = 0;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user