diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/service/ldn/errors.h | 13 | ||||
| -rw-r--r-- | src/core/hle/service/ldn/ldn.cpp | 36 | 
4 files changed, 52 insertions, 11 deletions
| diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 1662ec63d..e74e6a668 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -400,6 +400,7 @@ add_library(core STATIC      hle/service/hid/controllers/xpad.h      hle/service/lbl/lbl.cpp      hle/service/lbl/lbl.h +    hle/service/ldn/errors.h      hle/service/ldn/ldn.cpp      hle/service/ldn/ldn.h      hle/service/ldr/ldr.cpp diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index bb77c2569..8e1fe9438 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -1047,20 +1047,21 @@ void IStorageAccessor::Write(Kernel::HLERequestContext& ctx) {      const u64 offset{rp.Pop<u64>()};      const std::vector<u8> data{ctx.ReadBuffer()}; +    const std::size_t size{std::min(data.size(), backing.GetSize() - offset)}; -    LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, data.size()); +    LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, size); -    if (data.size() > backing.GetSize() - offset) { +    if (offset > backing.GetSize()) {          LOG_ERROR(Service_AM,                    "offset is out of bounds, backing_buffer_sz={}, data_size={}, offset={}", -                  backing.GetSize(), data.size(), offset); +                  backing.GetSize(), size, offset);          IPC::ResponseBuilder rb{ctx, 2};          rb.Push(ERR_SIZE_OUT_OF_BOUNDS);          return;      } -    std::memcpy(backing.GetData().data() + offset, data.data(), data.size()); +    std::memcpy(backing.GetData().data() + offset, data.data(), size);      IPC::ResponseBuilder rb{ctx, 2};      rb.Push(RESULT_SUCCESS); @@ -1070,11 +1071,11 @@ void IStorageAccessor::Read(Kernel::HLERequestContext& ctx) {      IPC::RequestParser rp{ctx};      const u64 offset{rp.Pop<u64>()}; -    const std::size_t size{ctx.GetWriteBufferSize()}; +    const std::size_t size{std::min(ctx.GetWriteBufferSize(), backing.GetSize() - offset)};      LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, size); -    if (size > backing.GetSize() - offset) { +    if (offset > backing.GetSize()) {          LOG_ERROR(Service_AM, "offset is out of bounds, backing_buffer_sz={}, size={}, offset={}",                    backing.GetSize(), size, offset); diff --git a/src/core/hle/service/ldn/errors.h b/src/core/hle/service/ldn/errors.h new file mode 100644 index 000000000..a718c5c66 --- /dev/null +++ b/src/core/hle/service/ldn/errors.h @@ -0,0 +1,13 @@ +// Copyright 2021 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/result.h" + +namespace Service::LDN { + +constexpr ResultCode ERROR_DISABLED{ErrorModule::LDN, 22}; + +} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index ee908f399..c630d93cd 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -6,6 +6,7 @@  #include "core/hle/ipc_helpers.h"  #include "core/hle/result.h" +#include "core/hle/service/ldn/errors.h"  #include "core/hle/service/ldn/ldn.h"  #include "core/hle/service/sm/sm.h" @@ -103,7 +104,7 @@ public:          : ServiceFramework{system_, "IUserLocalCommunicationService"} {          // clang-format off          static const FunctionInfo functions[] = { -            {0, nullptr, "GetState"}, +            {0, &IUserLocalCommunicationService::GetState, "GetState"},              {1, nullptr, "GetNetworkInfo"},              {2, nullptr, "GetIpv4Address"},              {3, nullptr, "GetDisconnectReason"}, @@ -138,13 +139,38 @@ public:          RegisterHandlers(functions);      } -    void Initialize2(Kernel::HLERequestContext& ctx) { +    void GetState(Kernel::HLERequestContext& ctx) {          LOG_WARNING(Service_LDN, "(STUBBED) called"); -        // Result success seem make this services start network and continue. -        // If we just pass result error then it will stop and maybe try again and again. + +        IPC::ResponseBuilder rb{ctx, 3}; + +        // Indicate a network error, as we do not actually emulate LDN +        rb.Push(static_cast<u32>(State::Error)); + +        rb.Push(RESULT_SUCCESS); +    } + +    void Initialize2(Kernel::HLERequestContext& ctx) { +        LOG_DEBUG(Service_LDN, "called"); + +        is_initialized = true; +          IPC::ResponseBuilder rb{ctx, 2}; -        rb.Push(RESULT_UNKNOWN); +        rb.Push(RESULT_SUCCESS);      } + +private: +    enum class State { +        None, +        Initialized, +        AccessPointOpened, +        AccessPointCreated, +        StationOpened, +        StationConnected, +        Error, +    }; + +    bool is_initialized{};  };  class LDNS final : public ServiceFramework<LDNS> { | 
