diff options
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/time/time.cpp | 130 | ||||
| -rw-r--r-- | src/core/hle/service/time/time.h | 36 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_s.cpp | 58 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_s.h | 23 | 
4 files changed, 164 insertions, 83 deletions
| diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp index e3d58aa60..674b59509 100644 --- a/src/core/hle/service/time/time.cpp +++ b/src/core/hle/service/time/time.cpp @@ -2,14 +2,140 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <chrono> +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/client_port.h" +#include "core/hle/kernel/client_session.h"  #include "core/hle/service/time/time.h" -#include "core/hle/service/time/time_s.h"  namespace Service {  namespace Time { +class ISystemClock final : public ServiceFramework<ISystemClock> { +public: +    ISystemClock() : ServiceFramework("ISystemClock") { +        static const FunctionInfo functions[] = { +            {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"}, +        }; +        RegisterHandlers(functions); +    } + +private: +    void GetCurrentTime(Kernel::HLERequestContext& ctx) { +        const s64 time_since_epoch{std::chrono::duration_cast<std::chrono::milliseconds>( +                                       std::chrono::system_clock::now().time_since_epoch()) +                                       .count()}; +        IPC::RequestBuilder rb{ctx, 4}; +        rb.Push(RESULT_SUCCESS); +        rb.Push<u64>(time_since_epoch); +        LOG_DEBUG(Service, "called"); +    } +}; + +class ISteadyClock final : public ServiceFramework<ISteadyClock> { +public: +    ISteadyClock() : ServiceFramework("ISteadyClock") {} +}; + +class ITimeZoneService final : public ServiceFramework<ITimeZoneService> { +public: +    ITimeZoneService() : ServiceFramework("ITimeZoneService") { +        static const FunctionInfo functions[] = { +            {0, &ITimeZoneService::GetDeviceLocationName, "GetDeviceLocationName"}, +            {101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"}, +        }; +        RegisterHandlers(functions); +    } + +private: +    void GetDeviceLocationName(Kernel::HLERequestContext& ctx) { +        LOG_WARNING(Service, "(STUBBED) called"); +        LocationName name{}; +        IPC::RequestBuilder rb{ctx, 11}; +        rb.Push(RESULT_SUCCESS); +        rb.PushRaw(name); +    } + +    void ToCalendarTimeWithMyRule(Kernel::HLERequestContext& ctx) { +        IPC::RequestParser rp{ctx}; +        u64 posixTime = rp.Pop<u64>(); + +        LOG_WARNING(Service, "(STUBBED) called, posixTime=0x%016llX", posixTime); + +        CalendarTime calendarTime{2018, 1, 1, 0, 0, 0}; +        CalendarAdditionalInfo additionalInfo{}; +        IPC::RequestBuilder rb{ctx, 10}; +        rb.Push(RESULT_SUCCESS); +        rb.PushRaw(calendarTime); +        rb.PushRaw(additionalInfo); +    } +}; + +void TIME::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { +    auto client_port = std::make_shared<ISystemClock>()->CreatePort(); +    auto session = client_port->Connect(); +    if (session.Succeeded()) { +        LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", +                  (*session)->GetObjectId()); +        IPC::RequestBuilder rb{ctx, 2, 0, 1}; +        rb.Push(RESULT_SUCCESS); +        rb.PushMoveObjects(std::move(session).Unwrap()); +    } else { +        UNIMPLEMENTED(); +    } +} + +void TIME::GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx) { +    auto client_port = std::make_shared<ISystemClock>()->CreatePort(); +    auto session = client_port->Connect(); +    if (session.Succeeded()) { +        LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", +                  (*session)->GetObjectId()); +        IPC::RequestBuilder rb{ctx, 2, 0, 1}; +        rb.Push(RESULT_SUCCESS); +        rb.PushMoveObjects(std::move(session).Unwrap()); +    } else { +        UNIMPLEMENTED(); +    } +} + +void TIME::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) { +    auto client_port = std::make_shared<ISteadyClock>()->CreatePort(); +    auto session = client_port->Connect(); +    if (session.Succeeded()) { +        LOG_DEBUG(Service, "called, initialized ISteadyClock -> session=%u", +                  (*session)->GetObjectId()); +        IPC::RequestBuilder rb{ctx, 2, 0, 1}; +        rb.Push(RESULT_SUCCESS); +        rb.PushMoveObjects(std::move(session).Unwrap()); +    } else { +        UNIMPLEMENTED(); +    } +} + +void TIME::GetTimeZoneService(Kernel::HLERequestContext& ctx) { +    IPC::RequestBuilder rb{ctx, 2, 0, 0, 1}; +    rb.Push(RESULT_SUCCESS); +    rb.PushIpcInterface<ITimeZoneService>(); +    LOG_DEBUG(Service, "called"); +} + +TIME::TIME(const char* name) : ServiceFramework(name) { +    static const FunctionInfo functions[] = { +        {0x00000000, &TIME::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, +        {0x00000001, &TIME::GetStandardNetworkSystemClock, "GetStandardNetworkSystemClock"}, +        {0x00000002, &TIME::GetStandardSteadyClock, "GetStandardSteadyClock"}, +        {0x00000003, &TIME::GetTimeZoneService, "GetTimeZoneService"}, +    }; +    RegisterHandlers(functions); +} +  void InstallInterfaces(SM::ServiceManager& service_manager) { -    std::make_shared<TimeS>()->InstallAsService(service_manager); +    std::make_shared<TIME>("time:a")->InstallAsService(service_manager); +    std::make_shared<TIME>("time:r")->InstallAsService(service_manager); +    std::make_shared<TIME>("time:s")->InstallAsService(service_manager); +    std::make_shared<TIME>("time:u")->InstallAsService(service_manager);  }  } // namespace Time diff --git a/src/core/hle/service/time/time.h b/src/core/hle/service/time/time.h index 7d0803e24..5f332d057 100644 --- a/src/core/hle/service/time/time.h +++ b/src/core/hle/service/time/time.h @@ -9,6 +9,42 @@  namespace Service {  namespace Time { +// TODO(Rozelette) RE this structure +struct LocationName { +    INSERT_PADDING_BYTES(0x24); +}; +static_assert(sizeof(LocationName) == 0x24, "LocationName structure has incorrect size"); + +struct CalendarTime { +    u16_le year; +    u8 month; // Starts at 1 +    u8 day;   // Starts at 1 +    u8 hour; +    u8 minute; +    u8 second; +    INSERT_PADDING_BYTES(1); +}; +static_assert(sizeof(CalendarTime) == 0x8, "CalendarTime structure has incorrect size"); + +// TODO(Rozelette) RE this structure +struct CalendarAdditionalInfo { +    INSERT_PADDING_BYTES(0x18); +}; +static_assert(sizeof(CalendarAdditionalInfo) == 0x18, +              "CalendarAdditionalInfo structure has incorrect size"); + +class TIME final : public ServiceFramework<TIME> { +public: +    explicit TIME(const char* name); +    ~TIME() = default; + +private: +    void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); +    void GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx); +    void GetStandardSteadyClock(Kernel::HLERequestContext& ctx); +    void GetTimeZoneService(Kernel::HLERequestContext& ctx); +}; +  /// Registers all Time services with the specified service manager.  void InstallInterfaces(SM::ServiceManager& service_manager); diff --git a/src/core/hle/service/time/time_s.cpp b/src/core/hle/service/time/time_s.cpp deleted file mode 100644 index 6b0597d8e..000000000 --- a/src/core/hle/service/time/time_s.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2018 yuzu emulator team -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include <chrono> -#include "common/logging/log.h" -#include "core/hle/ipc_helpers.h" -#include "core/hle/kernel/client_port.h" -#include "core/hle/kernel/client_session.h" -#include "core/hle/service/time/time_s.h" - -namespace Service { -namespace Time { - -class ISystemClock final : public ServiceFramework<ISystemClock> { -public: -    ISystemClock() : ServiceFramework("ISystemClock") { -        static const FunctionInfo functions[] = { -            {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"}, -        }; -        RegisterHandlers(functions); -    } - -private: -    void GetCurrentTime(Kernel::HLERequestContext& ctx) { -        const s64 time_since_epoch{std::chrono::duration_cast<std::chrono::milliseconds>( -                                       std::chrono::system_clock::now().time_since_epoch()) -                                       .count()}; -        IPC::RequestBuilder rb{ctx, 4}; -        rb.Push(RESULT_SUCCESS); -        rb.Push<u64>(time_since_epoch); -        LOG_DEBUG(Service, "called"); -    } -}; - -void TimeS::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { -    auto client_port = std::make_shared<ISystemClock>()->CreatePort(); -    auto session = client_port->Connect(); -    if (session.Succeeded()) { -        LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", -                  (*session)->GetObjectId()); -        IPC::RequestBuilder rb{ctx, 2, 0, 1}; -        rb.Push(RESULT_SUCCESS); -        rb.PushMoveObjects(std::move(session).Unwrap()); -    } else { -        UNIMPLEMENTED(); -    } -} - -TimeS::TimeS() : ServiceFramework("time:s") { -    static const FunctionInfo functions[] = { -        {0x00000000, &TimeS::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, -    }; -    RegisterHandlers(functions); -} - -} // namespace Time -} // namespace Service diff --git a/src/core/hle/service/time/time_s.h b/src/core/hle/service/time/time_s.h deleted file mode 100644 index 073227910..000000000 --- a/src/core/hle/service/time/time_s.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018 yuzu emulator team -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include "core/hle/kernel/hle_ipc.h" -#include "core/hle/service/service.h" - -namespace Service { -namespace Time { - -class TimeS final : public ServiceFramework<TimeS> { -public: -    TimeS(); -    ~TimeS() = default; - -private: -    void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); -}; - -} // namespace Time -} // namespace Service | 
