summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--externals/CMakeLists.txt5
m---------externals/dynarmic0
m---------externals/oaknut0
-rw-r--r--src/core/hle/service/cmif_serialization.h50
-rw-r--r--src/core/hle/service/mii/mii.cpp15
-rw-r--r--src/core/hle/service/sockets/sockets.h1
-rw-r--r--src/core/hle/service/sockets/sockets_translate.cpp2
8 files changed, 56 insertions, 21 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index eb26fbfd8..f4b64544f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -322,6 +322,10 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
322 find_package(xbyak 6 CONFIG) 322 find_package(xbyak 6 CONFIG)
323endif() 323endif()
324 324
325if (ARCHITECTURE_arm64)
326 find_package(oaknut 2.0.1 CONFIG)
327endif()
328
325if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) 329if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
326 find_package(dynarmic 6.4.0 CONFIG) 330 find_package(dynarmic 6.4.0 CONFIG)
327endif() 331endif()
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 42355716c..d49a2e43e 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -14,16 +14,17 @@ set(BUILD_SHARED_LIBS OFF)
14# Skip install rules for all externals 14# Skip install rules for all externals
15set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) 15set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
16 16
17# xbyak 17# Xbyak (also used by Dynarmic, so needs to be added first)
18if ((ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) AND NOT TARGET xbyak::xbyak) 18if ((ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) AND NOT TARGET xbyak::xbyak)
19 add_subdirectory(xbyak) 19 add_subdirectory(xbyak)
20endif() 20endif()
21 21
22# Dynarmic 22# Oaknut (also used by Dynarmic, so needs to be added first)
23if (ARCHITECTURE_arm64 AND NOT TARGET merry::oaknut) 23if (ARCHITECTURE_arm64 AND NOT TARGET merry::oaknut)
24 add_subdirectory(oaknut) 24 add_subdirectory(oaknut)
25endif() 25endif()
26 26
27# Dynarmic
27if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) AND NOT TARGET dynarmic::dynarmic) 28if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) AND NOT TARGET dynarmic::dynarmic)
28 set(DYNARMIC_IGNORE_ASSERTS ON) 29 set(DYNARMIC_IGNORE_ASSERTS ON)
29 add_subdirectory(dynarmic) 30 add_subdirectory(dynarmic)
diff --git a/externals/dynarmic b/externals/dynarmic
Subproject 0df09e2f6b61c2d7ad2f2053d4f020a5c33e037 Subproject ca0e264f4f962e29baa23a3282ce484625866b9
diff --git a/externals/oaknut b/externals/oaknut
Subproject 918bd94f025d6a2de13978468351598997ae390 Subproject 9d091109deb445bc6e9289c6195a282b7c993d4
diff --git a/src/core/hle/service/cmif_serialization.h b/src/core/hle/service/cmif_serialization.h
index 9ee26400d..5eabf51fe 100644
--- a/src/core/hle/service/cmif_serialization.h
+++ b/src/core/hle/service/cmif_serialization.h
@@ -122,14 +122,14 @@ struct RequestLayout {
122 u32 domain_interface_count; 122 u32 domain_interface_count;
123}; 123};
124 124
125template <ArgumentType Type1, ArgumentType Type2, typename MethodArguments, size_t PrevAlign = 1, size_t DataOffset = 0, size_t ArgIndex = 0> 125template <typename MethodArguments, size_t PrevAlign = 1, size_t DataOffset = 0, size_t ArgIndex = 0>
126constexpr u32 GetArgumentRawDataSize() { 126constexpr u32 GetInRawDataSize() {
127 if constexpr (ArgIndex >= std::tuple_size_v<MethodArguments>) { 127 if constexpr (ArgIndex >= std::tuple_size_v<MethodArguments>) {
128 return static_cast<u32>(DataOffset); 128 return static_cast<u32>(DataOffset);
129 } else { 129 } else {
130 using ArgType = std::tuple_element_t<ArgIndex, MethodArguments>; 130 using ArgType = std::tuple_element_t<ArgIndex, MethodArguments>;
131 131
132 if constexpr (ArgumentTraits<ArgType>::Type == Type1 || ArgumentTraits<ArgType>::Type == Type2) { 132 if constexpr (ArgumentTraits<ArgType>::Type == ArgumentType::InData || ArgumentTraits<ArgType>::Type == ArgumentType::InProcessId) {
133 constexpr size_t ArgAlign = alignof(ArgType); 133 constexpr size_t ArgAlign = alignof(ArgType);
134 constexpr size_t ArgSize = sizeof(ArgType); 134 constexpr size_t ArgSize = sizeof(ArgType);
135 135
@@ -138,9 +138,33 @@ constexpr u32 GetArgumentRawDataSize() {
138 constexpr size_t ArgOffset = Common::AlignUp(DataOffset, ArgAlign); 138 constexpr size_t ArgOffset = Common::AlignUp(DataOffset, ArgAlign);
139 constexpr size_t ArgEnd = ArgOffset + ArgSize; 139 constexpr size_t ArgEnd = ArgOffset + ArgSize;
140 140
141 return GetArgumentRawDataSize<Type1, Type2, MethodArguments, ArgAlign, ArgEnd, ArgIndex + 1>(); 141 return GetInRawDataSize<MethodArguments, ArgAlign, ArgEnd, ArgIndex + 1>();
142 } else {
143 return GetInRawDataSize<MethodArguments, PrevAlign, DataOffset, ArgIndex + 1>();
144 }
145 }
146}
147
148template <typename MethodArguments, size_t PrevAlign = 1, size_t DataOffset = 0, size_t ArgIndex = 0>
149constexpr u32 GetOutRawDataSize() {
150 if constexpr (ArgIndex >= std::tuple_size_v<MethodArguments>) {
151 return static_cast<u32>(DataOffset);
152 } else {
153 using ArgType = std::tuple_element_t<ArgIndex, MethodArguments>;
154
155 if constexpr (ArgumentTraits<ArgType>::Type == ArgumentType::OutData) {
156 using RawArgType = typename ArgType::Type;
157 constexpr size_t ArgAlign = alignof(RawArgType);
158 constexpr size_t ArgSize = sizeof(RawArgType);
159
160 static_assert(PrevAlign <= ArgAlign, "Output argument is not ordered by alignment");
161
162 constexpr size_t ArgOffset = Common::AlignUp(DataOffset, ArgAlign);
163 constexpr size_t ArgEnd = ArgOffset + ArgSize;
164
165 return GetOutRawDataSize<MethodArguments, ArgAlign, ArgEnd, ArgIndex + 1>();
142 } else { 166 } else {
143 return GetArgumentRawDataSize<Type1, Type2, MethodArguments, PrevAlign, DataOffset, ArgIndex + 1>(); 167 return GetOutRawDataSize<MethodArguments, PrevAlign, DataOffset, ArgIndex + 1>();
144 } 168 }
145 } 169 }
146} 170}
@@ -165,7 +189,7 @@ constexpr RequestLayout GetNonDomainReplyInLayout() {
165 return RequestLayout{ 189 return RequestLayout{
166 .copy_handle_count = GetArgumentTypeCount<ArgumentType::InCopyHandle, MethodArguments>(), 190 .copy_handle_count = GetArgumentTypeCount<ArgumentType::InCopyHandle, MethodArguments>(),
167 .move_handle_count = 0, 191 .move_handle_count = 0,
168 .cmif_raw_data_size = GetArgumentRawDataSize<ArgumentType::InData, ArgumentType::InProcessId, MethodArguments>(), 192 .cmif_raw_data_size = GetInRawDataSize<MethodArguments>(),
169 .domain_interface_count = 0, 193 .domain_interface_count = 0,
170 }; 194 };
171} 195}
@@ -175,7 +199,7 @@ constexpr RequestLayout GetDomainReplyInLayout() {
175 return RequestLayout{ 199 return RequestLayout{
176 .copy_handle_count = GetArgumentTypeCount<ArgumentType::InCopyHandle, MethodArguments>(), 200 .copy_handle_count = GetArgumentTypeCount<ArgumentType::InCopyHandle, MethodArguments>(),
177 .move_handle_count = 0, 201 .move_handle_count = 0,
178 .cmif_raw_data_size = GetArgumentRawDataSize<ArgumentType::InData, ArgumentType::InProcessId, MethodArguments>(), 202 .cmif_raw_data_size = GetInRawDataSize<MethodArguments>(),
179 .domain_interface_count = GetArgumentTypeCount<ArgumentType::InInterface, MethodArguments>(), 203 .domain_interface_count = GetArgumentTypeCount<ArgumentType::InInterface, MethodArguments>(),
180 }; 204 };
181} 205}
@@ -185,7 +209,7 @@ constexpr RequestLayout GetNonDomainReplyOutLayout() {
185 return RequestLayout{ 209 return RequestLayout{
186 .copy_handle_count = GetArgumentTypeCount<ArgumentType::OutCopyHandle, MethodArguments>(), 210 .copy_handle_count = GetArgumentTypeCount<ArgumentType::OutCopyHandle, MethodArguments>(),
187 .move_handle_count = GetArgumentTypeCount<ArgumentType::OutMoveHandle, MethodArguments>() + GetArgumentTypeCount<ArgumentType::OutInterface, MethodArguments>(), 211 .move_handle_count = GetArgumentTypeCount<ArgumentType::OutMoveHandle, MethodArguments>() + GetArgumentTypeCount<ArgumentType::OutInterface, MethodArguments>(),
188 .cmif_raw_data_size = GetArgumentRawDataSize<ArgumentType::OutData, ArgumentType::OutData, MethodArguments>(), 212 .cmif_raw_data_size = GetOutRawDataSize<MethodArguments>(),
189 .domain_interface_count = 0, 213 .domain_interface_count = 0,
190 }; 214 };
191} 215}
@@ -195,7 +219,7 @@ constexpr RequestLayout GetDomainReplyOutLayout() {
195 return RequestLayout{ 219 return RequestLayout{
196 .copy_handle_count = GetArgumentTypeCount<ArgumentType::OutCopyHandle, MethodArguments>(), 220 .copy_handle_count = GetArgumentTypeCount<ArgumentType::OutCopyHandle, MethodArguments>(),
197 .move_handle_count = GetArgumentTypeCount<ArgumentType::OutMoveHandle, MethodArguments>(), 221 .move_handle_count = GetArgumentTypeCount<ArgumentType::OutMoveHandle, MethodArguments>(),
198 .cmif_raw_data_size = GetArgumentRawDataSize<ArgumentType::OutData, ArgumentType::OutData, MethodArguments>(), 222 .cmif_raw_data_size = GetOutRawDataSize<MethodArguments>(),
199 .domain_interface_count = GetArgumentTypeCount<ArgumentType::OutInterface, MethodArguments>(), 223 .domain_interface_count = GetArgumentTypeCount<ArgumentType::OutInterface, MethodArguments>(),
200 }; 224 };
201} 225}
@@ -337,13 +361,15 @@ void WriteOutArgument(bool is_domain, CallArguments& args, u8* raw_data, HLERequ
337 using ArgType = std::tuple_element_t<ArgIndex, MethodArguments>; 361 using ArgType = std::tuple_element_t<ArgIndex, MethodArguments>;
338 362
339 if constexpr (ArgumentTraits<ArgType>::Type == ArgumentType::OutData) { 363 if constexpr (ArgumentTraits<ArgType>::Type == ArgumentType::OutData) {
340 constexpr size_t ArgAlign = alignof(ArgType); 364 using RawArgType = decltype(std::get<ArgIndex>(args).raw);
341 constexpr size_t ArgSize = sizeof(ArgType); 365 constexpr size_t ArgAlign = alignof(RawArgType);
366 constexpr size_t ArgSize = sizeof(RawArgType);
342 367
343 static_assert(PrevAlign <= ArgAlign, "Output argument is not ordered by alignment"); 368 static_assert(PrevAlign <= ArgAlign, "Output argument is not ordered by alignment");
344 static_assert(!RawDataFinished, "All output interface arguments must appear after raw data"); 369 static_assert(!RawDataFinished, "All output interface arguments must appear after raw data");
345 static_assert(!std::is_pointer_v<ArgType>, "Output raw data must not be a pointer"); 370 static_assert(!std::is_pointer_v<ArgType>, "Output raw data must not be a pointer");
346 static_assert(std::is_trivially_copyable_v<decltype(std::get<ArgIndex>(args).raw)>, "Output raw data must be trivially copyable"); 371 static_assert(!std::is_pointer_v<RawArgType>, "Output raw data must not be a pointer");
372 static_assert(std::is_trivially_copyable_v<RawArgType>, "Output raw data must be trivially copyable");
347 373
348 constexpr size_t ArgOffset = Common::AlignUp(DataOffset, ArgAlign); 374 constexpr size_t ArgOffset = Common::AlignUp(DataOffset, ArgAlign);
349 constexpr size_t ArgEnd = ArgOffset + ArgSize; 375 constexpr size_t ArgEnd = ArgOffset + ArgSize;
diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp
index b4d16fed5..efb7f6e32 100644
--- a/src/core/hle/service/mii/mii.cpp
+++ b/src/core/hle/service/mii/mii.cpp
@@ -111,7 +111,8 @@ private:
111 R_RETURN(result); 111 R_RETURN(result);
112 } 112 }
113 113
114 Result UpdateLatest(Out<CharInfo> out_char_info, CharInfo& char_info, SourceFlag source_flag) { 114 Result UpdateLatest(Out<CharInfo> out_char_info, const CharInfo& char_info,
115 SourceFlag source_flag) {
115 LOG_INFO(Service_Mii, "called with source_flag={}", source_flag); 116 LOG_INFO(Service_Mii, "called with source_flag={}", source_flag);
116 117
117 R_RETURN(manager->UpdateLatest(metadata, *out_char_info, char_info, source_flag)); 118 R_RETURN(manager->UpdateLatest(metadata, *out_char_info, char_info, source_flag));
@@ -159,7 +160,7 @@ private:
159 R_RETURN(result); 160 R_RETURN(result);
160 } 161 }
161 162
162 Result UpdateLatest1(Out<StoreData> out_store_data, StoreData& store_data, 163 Result UpdateLatest1(Out<StoreData> out_store_data, const StoreData& store_data,
163 SourceFlag source_flag) { 164 SourceFlag source_flag) {
164 LOG_INFO(Service_Mii, "called with source_flag={}", source_flag); 165 LOG_INFO(Service_Mii, "called with source_flag={}", source_flag);
165 R_UNLESS(is_system, ResultPermissionDenied); 166 R_UNLESS(is_system, ResultPermissionDenied);
@@ -243,7 +244,7 @@ private:
243 R_SUCCEED(); 244 R_SUCCEED();
244 } 245 }
245 246
246 Result GetIndex(Out<s32> out_index, CharInfo& char_info) { 247 Result GetIndex(Out<s32> out_index, const CharInfo& char_info) {
247 LOG_DEBUG(Service_Mii, "called"); 248 LOG_DEBUG(Service_Mii, "called");
248 249
249 R_RETURN(manager->GetIndex(metadata, char_info, *out_index)); 250 R_RETURN(manager->GetIndex(metadata, char_info, *out_index));
@@ -257,25 +258,25 @@ private:
257 R_SUCCEED(); 258 R_SUCCEED();
258 } 259 }
259 260
260 Result Convert(Out<CharInfo> out_char_info, Ver3StoreData& mii_v3) { 261 Result Convert(Out<CharInfo> out_char_info, const Ver3StoreData& mii_v3) {
261 LOG_INFO(Service_Mii, "called"); 262 LOG_INFO(Service_Mii, "called");
262 263
263 R_RETURN(manager->ConvertV3ToCharInfo(*out_char_info, mii_v3)); 264 R_RETURN(manager->ConvertV3ToCharInfo(*out_char_info, mii_v3));
264 } 265 }
265 266
266 Result ConvertCoreDataToCharInfo(Out<CharInfo> out_char_info, CoreData& core_data) { 267 Result ConvertCoreDataToCharInfo(Out<CharInfo> out_char_info, const CoreData& core_data) {
267 LOG_INFO(Service_Mii, "called"); 268 LOG_INFO(Service_Mii, "called");
268 269
269 R_RETURN(manager->ConvertCoreDataToCharInfo(*out_char_info, core_data)); 270 R_RETURN(manager->ConvertCoreDataToCharInfo(*out_char_info, core_data));
270 } 271 }
271 272
272 Result ConvertCharInfoToCoreData(Out<CoreData> out_core_data, CharInfo& char_info) { 273 Result ConvertCharInfoToCoreData(Out<CoreData> out_core_data, const CharInfo& char_info) {
273 LOG_INFO(Service_Mii, "called"); 274 LOG_INFO(Service_Mii, "called");
274 275
275 R_RETURN(manager->ConvertCharInfoToCoreData(*out_core_data, char_info)); 276 R_RETURN(manager->ConvertCharInfoToCoreData(*out_core_data, char_info));
276 } 277 }
277 278
278 Result Append(CharInfo& char_info) { 279 Result Append(const CharInfo& char_info) {
279 LOG_INFO(Service_Mii, "called"); 280 LOG_INFO(Service_Mii, "called");
280 281
281 R_RETURN(manager->Append(metadata, char_info)); 282 R_RETURN(manager->Append(metadata, char_info));
diff --git a/src/core/hle/service/sockets/sockets.h b/src/core/hle/service/sockets/sockets.h
index f86af01a4..f3ea31bde 100644
--- a/src/core/hle/service/sockets/sockets.h
+++ b/src/core/hle/service/sockets/sockets.h
@@ -24,6 +24,7 @@ enum class Errno : u32 {
24 CONNRESET = 104, 24 CONNRESET = 104,
25 NOTCONN = 107, 25 NOTCONN = 107,
26 TIMEDOUT = 110, 26 TIMEDOUT = 110,
27 CONNREFUSED = 111,
27 INPROGRESS = 115, 28 INPROGRESS = 115,
28}; 29};
29 30
diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp
index aed05250c..21bb3e776 100644
--- a/src/core/hle/service/sockets/sockets_translate.cpp
+++ b/src/core/hle/service/sockets/sockets_translate.cpp
@@ -25,6 +25,8 @@ Errno Translate(Network::Errno value) {
25 return Errno::MFILE; 25 return Errno::MFILE;
26 case Network::Errno::PIPE: 26 case Network::Errno::PIPE:
27 return Errno::PIPE; 27 return Errno::PIPE;
28 case Network::Errno::CONNREFUSED:
29 return Errno::CONNREFUSED;
28 case Network::Errno::NOTCONN: 30 case Network::Errno::NOTCONN:
29 return Errno::NOTCONN; 31 return Errno::NOTCONN;
30 case Network::Errno::TIMEDOUT: 32 case Network::Errno::TIMEDOUT: