diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 28 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_su.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_u0.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_u1.cpp | 2 |
6 files changed, 54 insertions, 3 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index c7c579aaf..7e8e87c33 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -395,16 +395,42 @@ struct BreakReason { | |||
| 395 | /// Break program execution | 395 | /// Break program execution |
| 396 | static void Break(u32 reason, u64 info1, u64 info2) { | 396 | static void Break(u32 reason, u64 info1, u64 info2) { |
| 397 | BreakReason break_reason{reason}; | 397 | BreakReason break_reason{reason}; |
| 398 | bool has_dumped_buffer{}; | ||
| 398 | 399 | ||
| 400 | const auto handle_debug_buffer = [&](VAddr addr, u64 sz) { | ||
| 401 | if (sz == 0 || addr == 0 || has_dumped_buffer) { | ||
| 402 | return; | ||
| 403 | } | ||
| 404 | |||
| 405 | // This typically is an error code so we're going to assume this is the case | ||
| 406 | if (sz == sizeof(u32)) { | ||
| 407 | LOG_CRITICAL(Debug_Emulated, "debug_buffer_err_code={:X}", Memory::Read32(addr)); | ||
| 408 | } else { | ||
| 409 | // We don't know what's in here so we'll hexdump it | ||
| 410 | std::vector<u8> debug_buffer(sz); | ||
| 411 | Memory::ReadBlock(addr, debug_buffer.data(), sz); | ||
| 412 | std::string hexdump; | ||
| 413 | for (std::size_t i = 0; i < debug_buffer.size(); i++) { | ||
| 414 | hexdump += fmt::format("{:02X} ", debug_buffer[i]); | ||
| 415 | if (i != 0 && i % 16 == 0) { | ||
| 416 | hexdump += '\n'; | ||
| 417 | } | ||
| 418 | } | ||
| 419 | LOG_CRITICAL(Debug_Emulated, "debug_buffer=\n{}", hexdump); | ||
| 420 | } | ||
| 421 | has_dumped_buffer = true; | ||
| 422 | }; | ||
| 399 | switch (break_reason.break_type) { | 423 | switch (break_reason.break_type) { |
| 400 | case BreakType::Panic: | 424 | case BreakType::Panic: |
| 401 | LOG_CRITICAL(Debug_Emulated, "Signalling debugger, PANIC! info1=0x{:016X}, info2=0x{:016X}", | 425 | LOG_CRITICAL(Debug_Emulated, "Signalling debugger, PANIC! info1=0x{:016X}, info2=0x{:016X}", |
| 402 | info1, info2); | 426 | info1, info2); |
| 427 | handle_debug_buffer(info1, info2); | ||
| 403 | break; | 428 | break; |
| 404 | case BreakType::AssertionFailed: | 429 | case BreakType::AssertionFailed: |
| 405 | LOG_CRITICAL(Debug_Emulated, | 430 | LOG_CRITICAL(Debug_Emulated, |
| 406 | "Signalling debugger, Assertion failed! info1=0x{:016X}, info2=0x{:016X}", | 431 | "Signalling debugger, Assertion failed! info1=0x{:016X}, info2=0x{:016X}", |
| 407 | info1, info2); | 432 | info1, info2); |
| 433 | handle_debug_buffer(info1, info2); | ||
| 408 | break; | 434 | break; |
| 409 | case BreakType::PreNROLoad: | 435 | case BreakType::PreNROLoad: |
| 410 | LOG_WARNING( | 436 | LOG_WARNING( |
| @@ -433,6 +459,7 @@ static void Break(u32 reason, u64 info1, u64 info2) { | |||
| 433 | Debug_Emulated, | 459 | Debug_Emulated, |
| 434 | "Signalling debugger, Unknown break reason {}, info1=0x{:016X}, info2=0x{:016X}", | 460 | "Signalling debugger, Unknown break reason {}, info1=0x{:016X}, info2=0x{:016X}", |
| 435 | static_cast<u32>(break_reason.break_type.Value()), info1, info2); | 461 | static_cast<u32>(break_reason.break_type.Value()), info1, info2); |
| 462 | handle_debug_buffer(info1, info2); | ||
| 436 | break; | 463 | break; |
| 437 | } | 464 | } |
| 438 | 465 | ||
| @@ -441,6 +468,7 @@ static void Break(u32 reason, u64 info1, u64 info2) { | |||
| 441 | Debug_Emulated, | 468 | Debug_Emulated, |
| 442 | "Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", | 469 | "Emulated program broke execution! reason=0x{:016X}, info1=0x{:016X}, info2=0x{:016X}", |
| 443 | reason, info1, info2); | 470 | reason, info1, info2); |
| 471 | handle_debug_buffer(info1, info2); | ||
| 444 | ASSERT(false); | 472 | ASSERT(false); |
| 445 | 473 | ||
| 446 | Core::CurrentProcess()->PrepareForTermination(); | 474 | Core::CurrentProcess()->PrepareForTermination(); |
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index c6437a671..8318eff5f 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp | |||
| @@ -242,6 +242,28 @@ void Module::Interface::GetBaasAccountManagerForApplication(Kernel::HLERequestCo | |||
| 242 | LOG_DEBUG(Service_ACC, "called"); | 242 | LOG_DEBUG(Service_ACC, "called"); |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | void Module::Interface::TrySelectUserWithoutInteraction(Kernel::HLERequestContext& ctx) { | ||
| 246 | LOG_DEBUG(Service_ACC, "called"); | ||
| 247 | // A u8 is passed into this function which we can safely ignore. It's to determine if we have | ||
| 248 | // access to use the network or not by the looks of it | ||
| 249 | IPC::ResponseBuilder rb{ctx, 6}; | ||
| 250 | if (profile_manager->GetUserCount() != 1) { | ||
| 251 | rb.Push(RESULT_SUCCESS); | ||
| 252 | rb.PushRaw<u128>(INVALID_UUID); | ||
| 253 | return; | ||
| 254 | } | ||
| 255 | auto user_list = profile_manager->GetAllUsers(); | ||
| 256 | if (user_list.empty()) { | ||
| 257 | rb.Push(ResultCode(-1)); // TODO(ogniK): Find the correct error code | ||
| 258 | rb.PushRaw<u128>(INVALID_UUID); | ||
| 259 | return; | ||
| 260 | } | ||
| 261 | |||
| 262 | // Select the first user we have | ||
| 263 | rb.Push(RESULT_SUCCESS); | ||
| 264 | rb.PushRaw<u128>(profile_manager->GetUser(0)->uuid); | ||
| 265 | } | ||
| 266 | |||
| 245 | Module::Interface::Interface(std::shared_ptr<Module> module, | 267 | Module::Interface::Interface(std::shared_ptr<Module> module, |
| 246 | std::shared_ptr<ProfileManager> profile_manager, const char* name) | 268 | std::shared_ptr<ProfileManager> profile_manager, const char* name) |
| 247 | : ServiceFramework(name), module(std::move(module)), | 269 | : ServiceFramework(name), module(std::move(module)), |
diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h index c7ed74351..89b2104fa 100644 --- a/src/core/hle/service/acc/acc.h +++ b/src/core/hle/service/acc/acc.h | |||
| @@ -27,6 +27,7 @@ public: | |||
| 27 | void InitializeApplicationInfo(Kernel::HLERequestContext& ctx); | 27 | void InitializeApplicationInfo(Kernel::HLERequestContext& ctx); |
| 28 | void GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx); | 28 | void GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx); |
| 29 | void IsUserRegistrationRequestPermitted(Kernel::HLERequestContext& ctx); | 29 | void IsUserRegistrationRequestPermitted(Kernel::HLERequestContext& ctx); |
| 30 | void TrySelectUserWithoutInteraction(Kernel::HLERequestContext& ctx); | ||
| 30 | 31 | ||
| 31 | protected: | 32 | protected: |
| 32 | std::shared_ptr<Module> module; | 33 | std::shared_ptr<Module> module; |
diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp index ad455c3a7..5e2030355 100644 --- a/src/core/hle/service/acc/acc_su.cpp +++ b/src/core/hle/service/acc/acc_su.cpp | |||
| @@ -17,7 +17,7 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 17 | {5, &ACC_SU::GetProfile, "GetProfile"}, | 17 | {5, &ACC_SU::GetProfile, "GetProfile"}, |
| 18 | {6, nullptr, "GetProfileDigest"}, | 18 | {6, nullptr, "GetProfileDigest"}, |
| 19 | {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, | 19 | {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, |
| 20 | {51, nullptr, "TrySelectUserWithoutInteraction"}, | 20 | {51, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, |
| 21 | {60, nullptr, "ListOpenContextStoredUsers"}, | 21 | {60, nullptr, "ListOpenContextStoredUsers"}, |
| 22 | {100, nullptr, "GetUserRegistrationNotifier"}, | 22 | {100, nullptr, "GetUserRegistrationNotifier"}, |
| 23 | {101, nullptr, "GetUserStateChangeNotifier"}, | 23 | {101, nullptr, "GetUserStateChangeNotifier"}, |
diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp index 72d4adf35..a4d705b45 100644 --- a/src/core/hle/service/acc/acc_u0.cpp +++ b/src/core/hle/service/acc/acc_u0.cpp | |||
| @@ -17,7 +17,7 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 17 | {5, &ACC_U0::GetProfile, "GetProfile"}, | 17 | {5, &ACC_U0::GetProfile, "GetProfile"}, |
| 18 | {6, nullptr, "GetProfileDigest"}, | 18 | {6, nullptr, "GetProfileDigest"}, |
| 19 | {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, | 19 | {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, |
| 20 | {51, nullptr, "TrySelectUserWithoutInteraction"}, | 20 | {51, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, |
| 21 | {60, nullptr, "ListOpenContextStoredUsers"}, | 21 | {60, nullptr, "ListOpenContextStoredUsers"}, |
| 22 | {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, | 22 | {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, |
| 23 | {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, | 23 | {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, |
diff --git a/src/core/hle/service/acc/acc_u1.cpp b/src/core/hle/service/acc/acc_u1.cpp index d480f08e5..8fffc93b5 100644 --- a/src/core/hle/service/acc/acc_u1.cpp +++ b/src/core/hle/service/acc/acc_u1.cpp | |||
| @@ -17,7 +17,7 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 17 | {5, &ACC_U1::GetProfile, "GetProfile"}, | 17 | {5, &ACC_U1::GetProfile, "GetProfile"}, |
| 18 | {6, nullptr, "GetProfileDigest"}, | 18 | {6, nullptr, "GetProfileDigest"}, |
| 19 | {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, | 19 | {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, |
| 20 | {51, nullptr, "TrySelectUserWithoutInteraction"}, | 20 | {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, |
| 21 | {60, nullptr, "ListOpenContextStoredUsers"}, | 21 | {60, nullptr, "ListOpenContextStoredUsers"}, |
| 22 | {100, nullptr, "GetUserRegistrationNotifier"}, | 22 | {100, nullptr, "GetUserRegistrationNotifier"}, |
| 23 | {101, nullptr, "GetUserStateChangeNotifier"}, | 23 | {101, nullptr, "GetUserStateChangeNotifier"}, |