mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #2991 from Subv/getpointer
Remove more usages of GetPointer.
This commit is contained in:
		@@ -58,22 +58,21 @@ void Wrap() {
 | 
			
		||||
    FuncReturn(retval);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <ResultCode func(s32*, u32*, s32, bool, s64)>
 | 
			
		||||
template <ResultCode func(s32*, VAddr, s32, bool, s64)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    s32 param_1 = 0;
 | 
			
		||||
    s32 retval = func(¶m_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2),
 | 
			
		||||
                      (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
 | 
			
		||||
                     .raw;
 | 
			
		||||
    s32 retval =
 | 
			
		||||
        func(¶m_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
 | 
			
		||||
            .raw;
 | 
			
		||||
 | 
			
		||||
    Core::CPU().SetReg(1, (u32)param_1);
 | 
			
		||||
    FuncReturn(retval);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <ResultCode func(s32*, u32*, s32, u32)>
 | 
			
		||||
template <ResultCode func(s32*, VAddr, s32, u32)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    s32 param_1 = 0;
 | 
			
		||||
    u32 retval =
 | 
			
		||||
        func(¶m_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw;
 | 
			
		||||
    u32 retval = func(¶m_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw;
 | 
			
		||||
 | 
			
		||||
    Core::CPU().SetReg(1, (u32)param_1);
 | 
			
		||||
    FuncReturn(retval);
 | 
			
		||||
@@ -152,21 +151,6 @@ void Wrap() {
 | 
			
		||||
    FuncReturn(func(PARAM(0)).raw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <ResultCode func(s64*, u32, u32*, u32)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1),
 | 
			
		||||
                    (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3))
 | 
			
		||||
                   .raw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <ResultCode func(u32*, const char*)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    u32 param_1 = 0;
 | 
			
		||||
    u32 retval = func(¶m_1, (char*)Memory::GetPointer(PARAM(1))).raw;
 | 
			
		||||
    Core::CPU().SetReg(1, param_1);
 | 
			
		||||
    FuncReturn(retval);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <ResultCode func(u32*, s32, s32)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    u32 param_1 = 0;
 | 
			
		||||
@@ -222,13 +206,11 @@ void Wrap() {
 | 
			
		||||
    FuncReturn(func(PARAM(0), PARAM(1)).raw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)>
 | 
			
		||||
template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    Kernel::Handle param_1 = 0;
 | 
			
		||||
    Kernel::Handle param_2 = 0;
 | 
			
		||||
    u32 retval = func(¶m_1, ¶m_2,
 | 
			
		||||
                      reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3))
 | 
			
		||||
                     .raw;
 | 
			
		||||
    u32 retval = func(¶m_1, ¶m_2, PARAM(2), PARAM(3)).raw;
 | 
			
		||||
    Core::CPU().SetReg(1, param_1);
 | 
			
		||||
    Core::CPU().SetReg(2, param_2);
 | 
			
		||||
    FuncReturn(retval);
 | 
			
		||||
@@ -268,9 +250,9 @@ void Wrap() {
 | 
			
		||||
    func(((s64)PARAM(1) << 32) | PARAM(0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <void func(const char*, int len)>
 | 
			
		||||
template <void func(VAddr, int len)>
 | 
			
		||||
void Wrap() {
 | 
			
		||||
    func((char*)Memory::GetPointer(PARAM(0)), PARAM(1));
 | 
			
		||||
    func(PARAM(0), PARAM(1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <void func(u8)>
 | 
			
		||||
 
 | 
			
		||||
@@ -201,17 +201,21 @@ static ResultCode UnmapMemoryBlock(Kernel::Handle handle, u32 addr) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Connect to an OS service given the port name, returns the handle to the port to out
 | 
			
		||||
static ResultCode ConnectToPort(Kernel::Handle* out_handle, const char* port_name) {
 | 
			
		||||
    if (port_name == nullptr)
 | 
			
		||||
static ResultCode ConnectToPort(Kernel::Handle* out_handle, VAddr port_name_address) {
 | 
			
		||||
    if (!Memory::IsValidVirtualAddress(port_name_address))
 | 
			
		||||
        return Kernel::ERR_NOT_FOUND;
 | 
			
		||||
    if (std::strlen(port_name) > 11)
 | 
			
		||||
 | 
			
		||||
    static constexpr std::size_t PortNameMaxLength = 11;
 | 
			
		||||
    // Read 1 char beyond the max allowed port name to detect names that are too long.
 | 
			
		||||
    std::string port_name = Memory::ReadCString(port_name_address, PortNameMaxLength + 1);
 | 
			
		||||
    if (port_name.size() > PortNameMaxLength)
 | 
			
		||||
        return Kernel::ERR_PORT_NAME_TOO_LONG;
 | 
			
		||||
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called port_name=%s", port_name);
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called port_name=%s", port_name.c_str());
 | 
			
		||||
 | 
			
		||||
    auto it = Service::g_kernel_named_ports.find(port_name);
 | 
			
		||||
    if (it == Service::g_kernel_named_ports.end()) {
 | 
			
		||||
        LOG_WARNING(Kernel_SVC, "tried to connect to unknown port: %s", port_name);
 | 
			
		||||
        LOG_WARNING(Kernel_SVC, "tried to connect to unknown port: %s", port_name.c_str());
 | 
			
		||||
        return Kernel::ERR_NOT_FOUND;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -303,12 +307,11 @@ static ResultCode WaitSynchronization1(Kernel::Handle handle, s64 nano_seconds)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds
 | 
			
		||||
static ResultCode WaitSynchronizationN(s32* out, Kernel::Handle* handles, s32 handle_count,
 | 
			
		||||
static ResultCode WaitSynchronizationN(s32* out, VAddr handles_address, s32 handle_count,
 | 
			
		||||
                                       bool wait_all, s64 nano_seconds) {
 | 
			
		||||
    Kernel::Thread* thread = Kernel::GetCurrentThread();
 | 
			
		||||
 | 
			
		||||
    // Check if 'handles' is invalid
 | 
			
		||||
    if (handles == nullptr)
 | 
			
		||||
    if (!Memory::IsValidVirtualAddress(handles_address))
 | 
			
		||||
        return Kernel::ERR_INVALID_POINTER;
 | 
			
		||||
 | 
			
		||||
    // NOTE: on real hardware, there is no nullptr check for 'out' (tested with firmware 4.4). If
 | 
			
		||||
@@ -323,7 +326,8 @@ static ResultCode WaitSynchronizationN(s32* out, Kernel::Handle* handles, s32 ha
 | 
			
		||||
    std::vector<ObjectPtr> objects(handle_count);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < handle_count; ++i) {
 | 
			
		||||
        auto object = Kernel::g_handle_table.Get<Kernel::WaitObject>(handles[i]);
 | 
			
		||||
        Kernel::Handle handle = Memory::Read32(handles_address + i * sizeof(Kernel::Handle));
 | 
			
		||||
        auto object = Kernel::g_handle_table.Get<Kernel::WaitObject>(handle);
 | 
			
		||||
        if (object == nullptr)
 | 
			
		||||
            return ERR_INVALID_HANDLE;
 | 
			
		||||
        objects[i] = object;
 | 
			
		||||
@@ -452,10 +456,9 @@ static ResultCode WaitSynchronizationN(s32* out, Kernel::Handle* handles, s32 ha
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// In a single operation, sends a IPC reply and waits for a new request.
 | 
			
		||||
static ResultCode ReplyAndReceive(s32* index, Kernel::Handle* handles, s32 handle_count,
 | 
			
		||||
static ResultCode ReplyAndReceive(s32* index, VAddr handles_address, s32 handle_count,
 | 
			
		||||
                                  Kernel::Handle reply_target) {
 | 
			
		||||
    // 'handles' has to be a valid pointer even if 'handle_count' is 0.
 | 
			
		||||
    if (handles == nullptr)
 | 
			
		||||
    if (!Memory::IsValidVirtualAddress(handles_address))
 | 
			
		||||
        return Kernel::ERR_INVALID_POINTER;
 | 
			
		||||
 | 
			
		||||
    // Check if 'handle_count' is invalid
 | 
			
		||||
@@ -466,7 +469,8 @@ static ResultCode ReplyAndReceive(s32* index, Kernel::Handle* handles, s32 handl
 | 
			
		||||
    std::vector<ObjectPtr> objects(handle_count);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < handle_count; ++i) {
 | 
			
		||||
        auto object = Kernel::g_handle_table.Get<Kernel::WaitObject>(handles[i]);
 | 
			
		||||
        Kernel::Handle handle = Memory::Read32(handles_address + i * sizeof(Kernel::Handle));
 | 
			
		||||
        auto object = Kernel::g_handle_table.Get<Kernel::WaitObject>(handle);
 | 
			
		||||
        if (object == nullptr)
 | 
			
		||||
            return ERR_INVALID_HANDLE;
 | 
			
		||||
        objects[i] = object;
 | 
			
		||||
@@ -619,8 +623,10 @@ static void Break(u8 break_reason) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Used to output a message on a debug hardware unit - does nothing on a retail unit
 | 
			
		||||
static void OutputDebugString(const char* string, int len) {
 | 
			
		||||
    LOG_DEBUG(Debug_Emulated, "%.*s", len, string);
 | 
			
		||||
static void OutputDebugString(VAddr address, int len) {
 | 
			
		||||
    std::vector<char> string(len);
 | 
			
		||||
    Memory::ReadBlock(address, string.data(), len);
 | 
			
		||||
    LOG_DEBUG(Debug_Emulated, "%.*s", len, string.data());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Get resource limit
 | 
			
		||||
@@ -638,9 +644,9 @@ static ResultCode GetResourceLimit(Kernel::Handle* resource_limit, Kernel::Handl
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Get resource limit current values
 | 
			
		||||
static ResultCode GetResourceLimitCurrentValues(s64* values, Kernel::Handle resource_limit_handle,
 | 
			
		||||
                                                u32* names, u32 name_count) {
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called resource_limit=%08X, names=%p, name_count=%d",
 | 
			
		||||
static ResultCode GetResourceLimitCurrentValues(VAddr values, Kernel::Handle resource_limit_handle,
 | 
			
		||||
                                                VAddr names, u32 name_count) {
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called resource_limit=%08X, names=%08X, name_count=%d",
 | 
			
		||||
              resource_limit_handle, names, name_count);
 | 
			
		||||
 | 
			
		||||
    SharedPtr<Kernel::ResourceLimit> resource_limit =
 | 
			
		||||
@@ -648,16 +654,19 @@ static ResultCode GetResourceLimitCurrentValues(s64* values, Kernel::Handle reso
 | 
			
		||||
    if (resource_limit == nullptr)
 | 
			
		||||
        return ERR_INVALID_HANDLE;
 | 
			
		||||
 | 
			
		||||
    for (unsigned int i = 0; i < name_count; ++i)
 | 
			
		||||
        values[i] = resource_limit->GetCurrentResourceValue(names[i]);
 | 
			
		||||
    for (unsigned int i = 0; i < name_count; ++i) {
 | 
			
		||||
        u32 name = Memory::Read32(names + i * sizeof(u32));
 | 
			
		||||
        s64 value = resource_limit->GetCurrentResourceValue(name);
 | 
			
		||||
        Memory::Write64(values + i * sizeof(u64), value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return RESULT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Get resource limit max values
 | 
			
		||||
static ResultCode GetResourceLimitLimitValues(s64* values, Kernel::Handle resource_limit_handle,
 | 
			
		||||
                                              u32* names, u32 name_count) {
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called resource_limit=%08X, names=%p, name_count=%d",
 | 
			
		||||
static ResultCode GetResourceLimitLimitValues(VAddr values, Kernel::Handle resource_limit_handle,
 | 
			
		||||
                                              VAddr names, u32 name_count) {
 | 
			
		||||
    LOG_TRACE(Kernel_SVC, "called resource_limit=%08X, names=%08X, name_count=%d",
 | 
			
		||||
              resource_limit_handle, names, name_count);
 | 
			
		||||
 | 
			
		||||
    SharedPtr<Kernel::ResourceLimit> resource_limit =
 | 
			
		||||
@@ -665,8 +674,11 @@ static ResultCode GetResourceLimitLimitValues(s64* values, Kernel::Handle resour
 | 
			
		||||
    if (resource_limit == nullptr)
 | 
			
		||||
        return ERR_INVALID_HANDLE;
 | 
			
		||||
 | 
			
		||||
    for (unsigned int i = 0; i < name_count; ++i)
 | 
			
		||||
        values[i] = resource_limit->GetMaxResourceValue(names[i]);
 | 
			
		||||
    for (unsigned int i = 0; i < name_count; ++i) {
 | 
			
		||||
        u32 name = Memory::Read32(names + i * sizeof(u32));
 | 
			
		||||
        s64 value = resource_limit->GetMaxResourceValue(names);
 | 
			
		||||
        Memory::Write64(values + i * sizeof(u64), value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return RESULT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
@@ -1098,9 +1110,9 @@ static ResultCode CreateMemoryBlock(Kernel::Handle* out_handle, u32 addr, u32 si
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ResultCode CreatePort(Kernel::Handle* server_port, Kernel::Handle* client_port,
 | 
			
		||||
                             const char* name, u32 max_sessions) {
 | 
			
		||||
                             VAddr name_address, u32 max_sessions) {
 | 
			
		||||
    // TODO(Subv): Implement named ports.
 | 
			
		||||
    ASSERT_MSG(name == nullptr, "Named ports are currently unimplemented");
 | 
			
		||||
    ASSERT_MSG(name_address == 0, "Named ports are currently unimplemented");
 | 
			
		||||
 | 
			
		||||
    using Kernel::ServerPort;
 | 
			
		||||
    using Kernel::ClientPort;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user