diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e41981007..f5c92a5aa 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -55,6 +55,8 @@ set(SRCS hle/service/service.cpp hle/service/sm/controller.cpp hle/service/sm/sm.cpp + hle/service/time/time.cpp + hle/service/time/time_s.cpp hle/service/vi/vi.cpp hle/service/vi/vi_m.cpp hle/shared_page.cpp @@ -141,6 +143,8 @@ set(HEADERS hle/service/service.h hle/service/sm/controller.h hle/service/sm/sm.h + hle/service/time/time.h + hle/service/time/time_s.h hle/service/vi/vi.h hle/service/vi/vi_m.h hle/shared_page.h diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index c27525980..02d434660 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -25,6 +25,7 @@ #include "core/hle/service/service.h" #include "core/hle/service/sm/controller.h" #include "core/hle/service/sm/sm.h" +#include "core/hle/service/time/time.h" #include "core/hle/service/vi/vi.h" using Kernel::ClientPort; @@ -79,7 +80,8 @@ Kernel::SharedPtr ServiceFrameworkBase::CreatePort() { ASSERT(port == nullptr); Kernel::SharedPtr server_port; Kernel::SharedPtr client_port; - std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, service_name); + std::tie(server_port, client_port) = + Kernel::ServerPort::CreatePortPair(max_sessions, service_name); port = MakeResult>(std::move(server_port)).Unwrap(); port->SetHleHandler(shared_from_this()); return client_port; @@ -170,6 +172,7 @@ void Init() { LM::InstallInterfaces(*SM::g_service_manager); NVDRV::InstallInterfaces(*SM::g_service_manager); PCTL::InstallInterfaces(*SM::g_service_manager); + Time::InstallInterfaces(*SM::g_service_manager); VI::InstallInterfaces(*SM::g_service_manager); LOG_DEBUG(Service, "initialized OK"); diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp new file mode 100644 index 000000000..e3d58aa60 --- /dev/null +++ b/src/core/hle/service/time/time.cpp @@ -0,0 +1,16 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/time/time.h" +#include "core/hle/service/time/time_s.h" + +namespace Service { +namespace Time { + +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared()->InstallAsService(service_manager); +} + +} // namespace Time +} // namespace Service diff --git a/src/core/hle/service/time/time.h b/src/core/hle/service/time/time.h new file mode 100644 index 000000000..7d0803e24 --- /dev/null +++ b/src/core/hle/service/time/time.h @@ -0,0 +1,16 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service { +namespace Time { + +/// Registers all Time services with the specified service manager. +void InstallInterfaces(SM::ServiceManager& service_manager); + +} // namespace Time +} // namespace Service diff --git a/src/core/hle/service/time/time_s.cpp b/src/core/hle/service/time/time_s.cpp new file mode 100644 index 000000000..6b0597d8e --- /dev/null +++ b/src/core/hle/service/time/time_s.cpp @@ -0,0 +1,58 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#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 { +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::system_clock::now().time_since_epoch()) + .count()}; + IPC::RequestBuilder rb{ctx, 4}; + rb.Push(RESULT_SUCCESS); + rb.Push(time_since_epoch); + LOG_DEBUG(Service, "called"); + } +}; + +void TimeS::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { + auto client_port = std::make_shared()->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 new file mode 100644 index 000000000..073227910 --- /dev/null +++ b/src/core/hle/service/time/time_s.h @@ -0,0 +1,23 @@ +// 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 { +public: + TimeS(); + ~TimeS() = default; + +private: + void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); +}; + +} // namespace Time +} // namespace Service