diff options
| author | 2018-01-14 21:42:23 -0500 | |
|---|---|---|
| committer | 2018-01-14 21:45:06 -0500 | |
| commit | 7bedea73a89c007a82b1f46a22c5000246a12df7 (patch) | |
| tree | b6a67a7aea84fa309d1180e1272f0e843b9edca4 /src | |
| parent | audio: Add files to CMake. (diff) | |
| download | yuzu-7bedea73a89c007a82b1f46a22c5000246a12df7.tar.gz yuzu-7bedea73a89c007a82b1f46a22c5000246a12df7.tar.xz yuzu-7bedea73a89c007a82b1f46a22c5000246a12df7.zip | |
time: Implement GetStandardUserSystemClock, GetCurrentTime.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/core/hle/service/service.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/service/time/time.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/service/time/time.h | 16 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_s.cpp | 58 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_s.h | 23 |
6 files changed, 121 insertions, 1 deletions
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 | |||
| 55 | hle/service/service.cpp | 55 | hle/service/service.cpp |
| 56 | hle/service/sm/controller.cpp | 56 | hle/service/sm/controller.cpp |
| 57 | hle/service/sm/sm.cpp | 57 | hle/service/sm/sm.cpp |
| 58 | hle/service/time/time.cpp | ||
| 59 | hle/service/time/time_s.cpp | ||
| 58 | hle/service/vi/vi.cpp | 60 | hle/service/vi/vi.cpp |
| 59 | hle/service/vi/vi_m.cpp | 61 | hle/service/vi/vi_m.cpp |
| 60 | hle/shared_page.cpp | 62 | hle/shared_page.cpp |
| @@ -141,6 +143,8 @@ set(HEADERS | |||
| 141 | hle/service/service.h | 143 | hle/service/service.h |
| 142 | hle/service/sm/controller.h | 144 | hle/service/sm/controller.h |
| 143 | hle/service/sm/sm.h | 145 | hle/service/sm/sm.h |
| 146 | hle/service/time/time.h | ||
| 147 | hle/service/time/time_s.h | ||
| 144 | hle/service/vi/vi.h | 148 | hle/service/vi/vi.h |
| 145 | hle/service/vi/vi_m.h | 149 | hle/service/vi/vi_m.h |
| 146 | hle/shared_page.h | 150 | 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 @@ | |||
| 25 | #include "core/hle/service/service.h" | 25 | #include "core/hle/service/service.h" |
| 26 | #include "core/hle/service/sm/controller.h" | 26 | #include "core/hle/service/sm/controller.h" |
| 27 | #include "core/hle/service/sm/sm.h" | 27 | #include "core/hle/service/sm/sm.h" |
| 28 | #include "core/hle/service/time/time.h" | ||
| 28 | #include "core/hle/service/vi/vi.h" | 29 | #include "core/hle/service/vi/vi.h" |
| 29 | 30 | ||
| 30 | using Kernel::ClientPort; | 31 | using Kernel::ClientPort; |
| @@ -79,7 +80,8 @@ Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { | |||
| 79 | ASSERT(port == nullptr); | 80 | ASSERT(port == nullptr); |
| 80 | Kernel::SharedPtr<Kernel::ServerPort> server_port; | 81 | Kernel::SharedPtr<Kernel::ServerPort> server_port; |
| 81 | Kernel::SharedPtr<Kernel::ClientPort> client_port; | 82 | Kernel::SharedPtr<Kernel::ClientPort> client_port; |
| 82 | std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, service_name); | 83 | std::tie(server_port, client_port) = |
| 84 | Kernel::ServerPort::CreatePortPair(max_sessions, service_name); | ||
| 83 | port = MakeResult<Kernel::SharedPtr<Kernel::ServerPort>>(std::move(server_port)).Unwrap(); | 85 | port = MakeResult<Kernel::SharedPtr<Kernel::ServerPort>>(std::move(server_port)).Unwrap(); |
| 84 | port->SetHleHandler(shared_from_this()); | 86 | port->SetHleHandler(shared_from_this()); |
| 85 | return client_port; | 87 | return client_port; |
| @@ -170,6 +172,7 @@ void Init() { | |||
| 170 | LM::InstallInterfaces(*SM::g_service_manager); | 172 | LM::InstallInterfaces(*SM::g_service_manager); |
| 171 | NVDRV::InstallInterfaces(*SM::g_service_manager); | 173 | NVDRV::InstallInterfaces(*SM::g_service_manager); |
| 172 | PCTL::InstallInterfaces(*SM::g_service_manager); | 174 | PCTL::InstallInterfaces(*SM::g_service_manager); |
| 175 | Time::InstallInterfaces(*SM::g_service_manager); | ||
| 173 | VI::InstallInterfaces(*SM::g_service_manager); | 176 | VI::InstallInterfaces(*SM::g_service_manager); |
| 174 | 177 | ||
| 175 | LOG_DEBUG(Service, "initialized OK"); | 178 | 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 @@ | |||
| 1 | // Copyright 2018 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "core/hle/service/time/time.h" | ||
| 6 | #include "core/hle/service/time/time_s.h" | ||
| 7 | |||
| 8 | namespace Service { | ||
| 9 | namespace Time { | ||
| 10 | |||
| 11 | void InstallInterfaces(SM::ServiceManager& service_manager) { | ||
| 12 | std::make_shared<TimeS>()->InstallAsService(service_manager); | ||
| 13 | } | ||
| 14 | |||
| 15 | } // namespace Time | ||
| 16 | } // 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 @@ | |||
| 1 | // Copyright 2018 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "core/hle/service/service.h" | ||
| 8 | |||
| 9 | namespace Service { | ||
| 10 | namespace Time { | ||
| 11 | |||
| 12 | /// Registers all Time services with the specified service manager. | ||
| 13 | void InstallInterfaces(SM::ServiceManager& service_manager); | ||
| 14 | |||
| 15 | } // namespace Time | ||
| 16 | } // 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 @@ | |||
| 1 | // Copyright 2018 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <chrono> | ||
| 6 | #include "common/logging/log.h" | ||
| 7 | #include "core/hle/ipc_helpers.h" | ||
| 8 | #include "core/hle/kernel/client_port.h" | ||
| 9 | #include "core/hle/kernel/client_session.h" | ||
| 10 | #include "core/hle/service/time/time_s.h" | ||
| 11 | |||
| 12 | namespace Service { | ||
| 13 | namespace Time { | ||
| 14 | |||
| 15 | class ISystemClock final : public ServiceFramework<ISystemClock> { | ||
| 16 | public: | ||
| 17 | ISystemClock() : ServiceFramework("ISystemClock") { | ||
| 18 | static const FunctionInfo functions[] = { | ||
| 19 | {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"}, | ||
| 20 | }; | ||
| 21 | RegisterHandlers(functions); | ||
| 22 | } | ||
| 23 | |||
| 24 | private: | ||
| 25 | void GetCurrentTime(Kernel::HLERequestContext& ctx) { | ||
| 26 | const s64 time_since_epoch{std::chrono::duration_cast<std::chrono::milliseconds>( | ||
| 27 | std::chrono::system_clock::now().time_since_epoch()) | ||
| 28 | .count()}; | ||
| 29 | IPC::RequestBuilder rb{ctx, 4}; | ||
| 30 | rb.Push(RESULT_SUCCESS); | ||
| 31 | rb.Push<u64>(time_since_epoch); | ||
| 32 | LOG_DEBUG(Service, "called"); | ||
| 33 | } | ||
| 34 | }; | ||
| 35 | |||
| 36 | void TimeS::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { | ||
| 37 | auto client_port = std::make_shared<ISystemClock>()->CreatePort(); | ||
| 38 | auto session = client_port->Connect(); | ||
| 39 | if (session.Succeeded()) { | ||
| 40 | LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", | ||
| 41 | (*session)->GetObjectId()); | ||
| 42 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | ||
| 43 | rb.Push(RESULT_SUCCESS); | ||
| 44 | rb.PushMoveObjects(std::move(session).Unwrap()); | ||
| 45 | } else { | ||
| 46 | UNIMPLEMENTED(); | ||
| 47 | } | ||
| 48 | } | ||
| 49 | |||
| 50 | TimeS::TimeS() : ServiceFramework("time:s") { | ||
| 51 | static const FunctionInfo functions[] = { | ||
| 52 | {0x00000000, &TimeS::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, | ||
| 53 | }; | ||
| 54 | RegisterHandlers(functions); | ||
| 55 | } | ||
| 56 | |||
| 57 | } // namespace Time | ||
| 58 | } // 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 @@ | |||
| 1 | // Copyright 2018 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "core/hle/kernel/hle_ipc.h" | ||
| 8 | #include "core/hle/service/service.h" | ||
| 9 | |||
| 10 | namespace Service { | ||
| 11 | namespace Time { | ||
| 12 | |||
| 13 | class TimeS final : public ServiceFramework<TimeS> { | ||
| 14 | public: | ||
| 15 | TimeS(); | ||
| 16 | ~TimeS() = default; | ||
| 17 | |||
| 18 | private: | ||
| 19 | void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); | ||
| 20 | }; | ||
| 21 | |||
| 22 | } // namespace Time | ||
| 23 | } // namespace Service | ||