summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/concepts.h32
-rw-r--r--src/core/hle/kernel/hle_ipc.h30
-rw-r--r--src/core/hle/service/acc/acc.cpp6
-rw-r--r--src/core/hle/service/audio/hwopus.cpp2
-rw-r--r--src/core/hle/service/bcat/module.cpp2
-rw-r--r--src/core/hle/service/es/es.cpp2
-rw-r--r--src/core/hle/service/nfp/nfp.cpp8
-rw-r--r--src/core/hle/service/set/set.cpp2
-rw-r--r--src/core/hle/service/time/time.cpp4
-rw-r--r--src/core/hle/service/time/time_zone_service.cpp4
12 files changed, 64 insertions, 30 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1e977e8a8..54dca3302 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -60,6 +60,7 @@ else()
60 -Wmissing-declarations 60 -Wmissing-declarations
61 -Wno-attributes 61 -Wno-attributes
62 -Wno-unused-parameter 62 -Wno-unused-parameter
63 -fconcepts
63 ) 64 )
64 65
65 if (ARCHITECTURE_x86_64) 66 if (ARCHITECTURE_x86_64)
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index d120c8d3d..78c3bfb3b 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -110,6 +110,7 @@ add_library(common STATIC
110 common_funcs.h 110 common_funcs.h
111 common_paths.h 111 common_paths.h
112 common_types.h 112 common_types.h
113 concepts.h
113 dynamic_library.cpp 114 dynamic_library.cpp
114 dynamic_library.h 115 dynamic_library.h
115 fiber.cpp 116 fiber.cpp
diff --git a/src/common/concepts.h b/src/common/concepts.h
new file mode 100644
index 000000000..db5fb373d
--- /dev/null
+++ b/src/common/concepts.h
@@ -0,0 +1,32 @@
1// Copyright 2020 yuzu emulator team
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7namespace Common {
8
9#include <type_traits>
10
11// Check if type is like an STL container
12template <typename T>
13concept IsSTLContainer = requires(T t) {
14 typename T::value_type;
15 typename T::iterator;
16 typename T::const_iterator;
17 // TODO(ogniK): Replace below is std::same_as<void> when MSVC supports it.
18 t.begin();
19 t.end();
20 t.cbegin();
21 t.cend();
22 t.data();
23 t.size();
24};
25
26// Check if type T is derived from T2
27template <typename T, typename T2>
28concept IsBaseOf = requires {
29 std::is_base_of_v<T, T2>;
30};
31
32} // namespace Common
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index b31673928..f3277b766 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -13,6 +13,7 @@
13#include <vector> 13#include <vector>
14#include <boost/container/small_vector.hpp> 14#include <boost/container/small_vector.hpp>
15#include "common/common_types.h" 15#include "common/common_types.h"
16#include "common/concepts.h"
16#include "common/swap.h" 17#include "common/swap.h"
17#include "core/hle/ipc.h" 18#include "core/hle/ipc.h"
18#include "core/hle/kernel/object.h" 19#include "core/hle/kernel/object.h"
@@ -193,23 +194,24 @@ public:
193 194
194 /* Helper function to write a buffer using the appropriate buffer descriptor 195 /* Helper function to write a buffer using the appropriate buffer descriptor
195 * 196 *
196 * @tparam ContiguousContainer an arbitrary container that satisfies the 197 * @tparam T an arbitrary container that satisfies the
197 * ContiguousContainer concept in the C++ standard library. 198 * ContiguousContainer concept in the C++ standard library or a trivially copyable type.
198 * 199 *
199 * @param container The container to write the data of into a buffer. 200 * @param data The container/data to write into a buffer.
200 * @param buffer_index The buffer in particular to write to. 201 * @param buffer_index The buffer in particular to write to.
201 */ 202 */
202 template <typename ContiguousContainer, 203 template <typename T, typename = std::enable_if_t<!std::is_pointer_v<T>>>
203 typename = std::enable_if_t<!std::is_pointer_v<ContiguousContainer>>> 204 std::size_t WriteBuffer(const T& data, std::size_t buffer_index = 0) const {
204 std::size_t WriteBuffer(const ContiguousContainer& container, 205 if constexpr (Common::IsSTLContainer<T>) {
205 std::size_t buffer_index = 0) const { 206 using ContiguousType = typename T::value_type;
206 using ContiguousType = typename ContiguousContainer::value_type; 207 static_assert(std::is_trivially_copyable_v<ContiguousType>,
207 208 "Container to WriteBuffer must contain trivially copyable objects");
208 static_assert(std::is_trivially_copyable_v<ContiguousType>, 209 return WriteBuffer(std::data(data), std::size(data) * sizeof(ContiguousType),
209 "Container to WriteBuffer must contain trivially copyable objects"); 210 buffer_index);
210 211 } else {
211 return WriteBuffer(std::data(container), std::size(container) * sizeof(ContiguousType), 212 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable");
212 buffer_index); 213 return WriteBuffer(&data, sizeof(T), buffer_index);
214 }
213 } 215 }
214 216
215 /// Helper function to get the size of the input buffer 217 /// Helper function to get the size of the input buffer
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index 8ac856ec3..63e4aeca0 100644
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -286,9 +286,7 @@ protected:
286 ProfileBase profile_base{}; 286 ProfileBase profile_base{};
287 ProfileData data{}; 287 ProfileData data{};
288 if (profile_manager.GetProfileBaseAndData(user_id, profile_base, data)) { 288 if (profile_manager.GetProfileBaseAndData(user_id, profile_base, data)) {
289 std::array<u8, sizeof(ProfileData)> raw_data; 289 ctx.WriteBuffer(data);
290 std::memcpy(raw_data.data(), &data, sizeof(ProfileData));
291 ctx.WriteBuffer(raw_data);
292 IPC::ResponseBuilder rb{ctx, 16}; 290 IPC::ResponseBuilder rb{ctx, 16};
293 rb.Push(RESULT_SUCCESS); 291 rb.Push(RESULT_SUCCESS);
294 rb.PushRaw(profile_base); 292 rb.PushRaw(profile_base);
@@ -333,7 +331,7 @@ protected:
333 std::vector<u8> buffer(size); 331 std::vector<u8> buffer(size);
334 image.ReadBytes(buffer.data(), buffer.size()); 332 image.ReadBytes(buffer.data(), buffer.size());
335 333
336 ctx.WriteBuffer(buffer.data(), buffer.size()); 334 ctx.WriteBuffer(buffer);
337 rb.Push<u32>(size); 335 rb.Push<u32>(size);
338 } 336 }
339 337
diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp
index d19513cbb..f1d81602c 100644
--- a/src/core/hle/service/audio/hwopus.cpp
+++ b/src/core/hle/service/audio/hwopus.cpp
@@ -92,7 +92,7 @@ private:
92 if (performance) { 92 if (performance) {
93 rb.Push<u64>(*performance); 93 rb.Push<u64>(*performance);
94 } 94 }
95 ctx.WriteBuffer(samples.data(), samples.size() * sizeof(s16)); 95 ctx.WriteBuffer(samples);
96 } 96 }
97 97
98 bool DecodeOpusData(u32& consumed, u32& sample_count, const std::vector<u8>& input, 98 bool DecodeOpusData(u32& consumed, u32& sample_count, const std::vector<u8>& input,
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp
index 603b64d4f..db0e06ca1 100644
--- a/src/core/hle/service/bcat/module.cpp
+++ b/src/core/hle/service/bcat/module.cpp
@@ -112,7 +112,7 @@ private:
112 void GetImpl(Kernel::HLERequestContext& ctx) { 112 void GetImpl(Kernel::HLERequestContext& ctx) {
113 LOG_DEBUG(Service_BCAT, "called"); 113 LOG_DEBUG(Service_BCAT, "called");
114 114
115 ctx.WriteBuffer(&impl, sizeof(DeliveryCacheProgressImpl)); 115 ctx.WriteBuffer(impl);
116 116
117 IPC::ResponseBuilder rb{ctx, 2}; 117 IPC::ResponseBuilder rb{ctx, 2};
118 rb.Push(RESULT_SUCCESS); 118 rb.Push(RESULT_SUCCESS);
diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp
index a41c73c48..c2737a365 100644
--- a/src/core/hle/service/es/es.cpp
+++ b/src/core/hle/service/es/es.cpp
@@ -160,7 +160,7 @@ private:
160 return; 160 return;
161 } 161 }
162 162
163 ctx.WriteBuffer(key.data(), key.size()); 163 ctx.WriteBuffer(key);
164 164
165 IPC::ResponseBuilder rb{ctx, 2}; 165 IPC::ResponseBuilder rb{ctx, 2};
166 rb.Push(RESULT_SUCCESS); 166 rb.Push(RESULT_SUCCESS);
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index 4b79eb81d..5e2d769a4 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -127,7 +127,7 @@ private:
127 const u32 array_size = rp.Pop<u32>(); 127 const u32 array_size = rp.Pop<u32>();
128 LOG_DEBUG(Service_NFP, "called, array_size={}", array_size); 128 LOG_DEBUG(Service_NFP, "called, array_size={}", array_size);
129 129
130 ctx.WriteBuffer(&device_handle, sizeof(device_handle)); 130 ctx.WriteBuffer(device_handle);
131 131
132 IPC::ResponseBuilder rb{ctx, 3}; 132 IPC::ResponseBuilder rb{ctx, 3};
133 rb.Push(RESULT_SUCCESS); 133 rb.Push(RESULT_SUCCESS);
@@ -220,7 +220,7 @@ private:
220 220
221 tag_info.protocol = 1; // TODO(ogniK): Figure out actual values 221 tag_info.protocol = 1; // TODO(ogniK): Figure out actual values
222 tag_info.tag_type = 2; 222 tag_info.tag_type = 2;
223 ctx.WriteBuffer(&tag_info, sizeof(TagInfo)); 223 ctx.WriteBuffer(tag_info);
224 rb.Push(RESULT_SUCCESS); 224 rb.Push(RESULT_SUCCESS);
225 } 225 }
226 226
@@ -237,7 +237,7 @@ private:
237 237
238 IPC::ResponseBuilder rb{ctx, 2}; 238 IPC::ResponseBuilder rb{ctx, 2};
239 auto amiibo = nfp_interface.GetAmiiboBuffer(); 239 auto amiibo = nfp_interface.GetAmiiboBuffer();
240 ctx.WriteBuffer(&amiibo.model_info, sizeof(amiibo.model_info)); 240 ctx.WriteBuffer(amiibo.model_info);
241 rb.Push(RESULT_SUCCESS); 241 rb.Push(RESULT_SUCCESS);
242 } 242 }
243 243
@@ -283,7 +283,7 @@ private:
283 283
284 CommonInfo common_info{}; 284 CommonInfo common_info{};
285 common_info.application_area_size = 0; 285 common_info.application_area_size = 0;
286 ctx.WriteBuffer(&common_info, sizeof(CommonInfo)); 286 ctx.WriteBuffer(common_info);
287 287
288 IPC::ResponseBuilder rb{ctx, 2}; 288 IPC::ResponseBuilder rb{ctx, 2};
289 rb.Push(RESULT_SUCCESS); 289 rb.Push(RESULT_SUCCESS);
diff --git a/src/core/hle/service/set/set.cpp b/src/core/hle/service/set/set.cpp
index 34fe2fd82..e64777668 100644
--- a/src/core/hle/service/set/set.cpp
+++ b/src/core/hle/service/set/set.cpp
@@ -106,7 +106,7 @@ void GetKeyCodeMapImpl(Kernel::HLERequestContext& ctx) {
106 106
107 IPC::ResponseBuilder rb{ctx, 2}; 107 IPC::ResponseBuilder rb{ctx, 2};
108 rb.Push(RESULT_SUCCESS); 108 rb.Push(RESULT_SUCCESS);
109 ctx.WriteBuffer(&layout, sizeof(KeyboardLayout)); 109 ctx.WriteBuffer(layout);
110} 110}
111} // Anonymous namespace 111} // Anonymous namespace
112 112
diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp
index 13e4b3818..ee4fa4b48 100644
--- a/src/core/hle/service/time/time.cpp
+++ b/src/core/hle/service/time/time.cpp
@@ -290,7 +290,7 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) {
290 290
291 IPC::ResponseBuilder rb{ctx, 2}; 291 IPC::ResponseBuilder rb{ctx, 2};
292 rb.Push(RESULT_SUCCESS); 292 rb.Push(RESULT_SUCCESS);
293 ctx.WriteBuffer(&clock_snapshot, sizeof(Clock::ClockSnapshot)); 293 ctx.WriteBuffer(clock_snapshot);
294} 294}
295 295
296void Module::Interface::GetClockSnapshotFromSystemClockContext(Kernel::HLERequestContext& ctx) { 296void Module::Interface::GetClockSnapshotFromSystemClockContext(Kernel::HLERequestContext& ctx) {
@@ -313,7 +313,7 @@ void Module::Interface::GetClockSnapshotFromSystemClockContext(Kernel::HLEReques
313 313
314 IPC::ResponseBuilder rb{ctx, 2}; 314 IPC::ResponseBuilder rb{ctx, 2};
315 rb.Push(RESULT_SUCCESS); 315 rb.Push(RESULT_SUCCESS);
316 ctx.WriteBuffer(&clock_snapshot, sizeof(Clock::ClockSnapshot)); 316 ctx.WriteBuffer(clock_snapshot);
317} 317}
318 318
319void Module::Interface::CalculateStandardUserSystemClockDifferenceByUser( 319void Module::Interface::CalculateStandardUserSystemClockDifferenceByUser(
diff --git a/src/core/hle/service/time/time_zone_service.cpp b/src/core/hle/service/time/time_zone_service.cpp
index db57ae069..ff3a10b3e 100644
--- a/src/core/hle/service/time/time_zone_service.cpp
+++ b/src/core/hle/service/time/time_zone_service.cpp
@@ -142,7 +142,7 @@ void ITimeZoneService::ToPosixTime(Kernel::HLERequestContext& ctx) {
142 IPC::ResponseBuilder rb{ctx, 3}; 142 IPC::ResponseBuilder rb{ctx, 3};
143 rb.Push(RESULT_SUCCESS); 143 rb.Push(RESULT_SUCCESS);
144 rb.PushRaw<u32>(1); // Number of times we're returning 144 rb.PushRaw<u32>(1); // Number of times we're returning
145 ctx.WriteBuffer(&posix_time, sizeof(s64)); 145 ctx.WriteBuffer(posix_time);
146} 146}
147 147
148void ITimeZoneService::ToPosixTimeWithMyRule(Kernel::HLERequestContext& ctx) { 148void ITimeZoneService::ToPosixTimeWithMyRule(Kernel::HLERequestContext& ctx) {
@@ -164,7 +164,7 @@ void ITimeZoneService::ToPosixTimeWithMyRule(Kernel::HLERequestContext& ctx) {
164 IPC::ResponseBuilder rb{ctx, 3}; 164 IPC::ResponseBuilder rb{ctx, 3};
165 rb.Push(RESULT_SUCCESS); 165 rb.Push(RESULT_SUCCESS);
166 rb.PushRaw<u32>(1); // Number of times we're returning 166 rb.PushRaw<u32>(1); // Number of times we're returning
167 ctx.WriteBuffer(&posix_time, sizeof(s64)); 167 ctx.WriteBuffer(posix_time);
168} 168}
169 169
170} // namespace Service::Time 170} // namespace Service::Time