summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md3
-rw-r--r--README.md4
-rw-r--r--appveyor.yml2
m---------externals/boost0
-rw-r--r--src/common/file_util.cpp18
-rw-r--r--src/common/x64/cpu_detect.cpp12
-rw-r--r--src/core/file_sys/archive_extsavedata.cpp2
-rw-r--r--src/core/file_sys/archive_sdmc.cpp2
-rw-r--r--src/core/file_sys/archive_sdmcwriteonly.cpp2
-rw-r--r--src/core/file_sys/archive_source_sd_savedata.cpp2
-rw-r--r--src/core/hle/service/cfg/cfg.cpp31
-rw-r--r--src/core/hle/svc.cpp20
-rw-r--r--src/core/loader/loader.cpp2
-rw-r--r--src/core/loader/ncch.cpp9
14 files changed, 71 insertions, 38 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 55f520cb4..f0b012ed9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,7 +1,6 @@
1# Reporting Issues 1# Reporting Issues
2 2
3**The issue tracker is not a support forum.** Unless you can provide precise *technical information* regarding an issue, you *should not post in it*. If you need support, first read the [FAQ](https://github.com/citra-emu/citra/wiki/FAQ) and then either visit our IRC channel, [our forum](https://community.citra-emu.org) 3**The issue tracker is not a support forum.** Unless you can provide precise *technical information* regarding an issue, you *should not post in it*. If you need support, first read the [FAQ](https://github.com/citra-emu/citra/wiki/FAQ) and then either visit our IRC channel, [our forum](https://community.citra-emu.org) or ask in a general emulation forum such as [/r/emulation](https://www.reddit.com/r/emulation/). If you post support questions, generic messages to the developers or vague reports without technical details, they will be closed and locked.
4.citra-emu.org/) or ask in a general emulation forum such as [/r/emulation](https://www.reddit.com/r/emulation/). If you post support questions, generic messages to the developers or vague reports without technical details, they will be closed and locked.
5 4
6If you believe you have a valid issue report, please post text or a screenshot from the log (the console window that opens alongside Citra) and build version (hex string visible in the titlebar and zip filename), as well as your hardware and software information if applicable. 5If you believe you have a valid issue report, please post text or a screenshot from the log (the console window that opens alongside Citra) and build version (hex string visible in the titlebar and zip filename), as well as your hardware and software information if applicable.
7 6
diff --git a/README.md b/README.md
index 461d2e3a7..df1d0b4eb 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Citra Emulator
7 7
8Citra is an experimental open-source Nintendo 3DS emulator/debugger written in C++. It is written with portability in mind, with builds actively maintained for Windows, Linux and macOS. Citra only emulates a subset of 3DS hardware, and therefore is generally only useful for running/debugging homebrew applications. At this time, Citra is even able to boot several commercial games! Most of these do not run to a playable state, but we are working every day to advance the project forward. 8Citra is an experimental open-source Nintendo 3DS emulator/debugger written in C++. It is written with portability in mind, with builds actively maintained for Windows, Linux and macOS. Citra only emulates a subset of 3DS hardware, and therefore is generally only useful for running/debugging homebrew applications. At this time, Citra is even able to boot several commercial games! Most of these do not run to a playable state, but we are working every day to advance the project forward.
9 9
10Citra is licensed under the GPLv2 (or any later version). Refer to the license.txt file included. Please read the [FAQ](https://citra-emu.org/wikis/faq) before getting started with the project. 10Citra is licensed under the GPLv2 (or any later version). Refer to the license.txt file included. Please read the [FAQ](https://citra-emu.org/wiki/FAQ/) before getting started with the project.
11 11
12Check out our [website](https://citra-emu.org/)! 12Check out our [website](https://citra-emu.org/)!
13 13
@@ -27,7 +27,7 @@ If you want to contribute please take a look at the [Contributor's Guide](CONTRI
27 27
28 28
29### Support 29### Support
30We happily accept monetary donations, or donated games and hardware. Please see our [donations page](https://citra-emu.org/page/donate) for more information on how you can contribute to Citra. Any donations received will go towards things like: 30We happily accept monetary donations, or donated games and hardware. Please see our [donations page](https://citra-emu.org/donate/) for more information on how you can contribute to Citra. Any donations received will go towards things like:
31* 3DS consoles for developers to explore the hardware 31* 3DS consoles for developers to explore the hardware
32* 3DS games for testing 32* 3DS games for testing
33* Any equipment required for homebrew 33* Any equipment required for homebrew
diff --git a/appveyor.yml b/appveyor.yml
index c07559479..2a4a15d40 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -20,6 +20,8 @@ install:
20 - git submodule update --init --recursive 20 - git submodule update --init --recursive
21 21
22before_build: 22before_build:
23 # Xamarin log spam workaround
24 - del "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets"
23 - mkdir build 25 - mkdir build
24 - cd build 26 - cd build
25 - cmake -G "Visual Studio 14 2015 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 .. 27 - cmake -G "Visual Studio 14 2015 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 ..
diff --git a/externals/boost b/externals/boost
Subproject f005c955f8147a29667aa0b65257abc3dd520b0 Subproject 351972396392c97a659b9a02f34ce9269293d21
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index df234c225..5ab036b34 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -118,8 +118,7 @@ bool IsDirectory(const std::string& filename) {
118#endif 118#endif
119 119
120 if (result < 0) { 120 if (result < 0) {
121 LOG_WARNING(Common_Filesystem, "stat failed on %s: %s", filename.c_str(), 121 LOG_DEBUG(Common_Filesystem, "stat failed on %s: %s", filename.c_str(), GetLastErrorMsg());
122 GetLastErrorMsg());
123 return false; 122 return false;
124 } 123 }
125 124
@@ -129,12 +128,12 @@ bool IsDirectory(const std::string& filename) {
129// Deletes a given filename, return true on success 128// Deletes a given filename, return true on success
130// Doesn't supports deleting a directory 129// Doesn't supports deleting a directory
131bool Delete(const std::string& filename) { 130bool Delete(const std::string& filename) {
132 LOG_INFO(Common_Filesystem, "file %s", filename.c_str()); 131 LOG_TRACE(Common_Filesystem, "file %s", filename.c_str());
133 132
134 // Return true because we care about the file no 133 // Return true because we care about the file no
135 // being there, not the actual delete. 134 // being there, not the actual delete.
136 if (!Exists(filename)) { 135 if (!Exists(filename)) {
137 LOG_WARNING(Common_Filesystem, "%s does not exist", filename.c_str()); 136 LOG_DEBUG(Common_Filesystem, "%s does not exist", filename.c_str());
138 return true; 137 return true;
139 } 138 }
140 139
@@ -169,8 +168,7 @@ bool CreateDir(const std::string& path) {
169 return true; 168 return true;
170 DWORD error = GetLastError(); 169 DWORD error = GetLastError();
171 if (error == ERROR_ALREADY_EXISTS) { 170 if (error == ERROR_ALREADY_EXISTS) {
172 LOG_WARNING(Common_Filesystem, "CreateDirectory failed on %s: already exists", 171 LOG_DEBUG(Common_Filesystem, "CreateDirectory failed on %s: already exists", path.c_str());
173 path.c_str());
174 return true; 172 return true;
175 } 173 }
176 LOG_ERROR(Common_Filesystem, "CreateDirectory failed on %s: %i", path.c_str(), error); 174 LOG_ERROR(Common_Filesystem, "CreateDirectory failed on %s: %i", path.c_str(), error);
@@ -182,7 +180,7 @@ bool CreateDir(const std::string& path) {
182 int err = errno; 180 int err = errno;
183 181
184 if (err == EEXIST) { 182 if (err == EEXIST) {
185 LOG_WARNING(Common_Filesystem, "mkdir failed on %s: already exists", path.c_str()); 183 LOG_DEBUG(Common_Filesystem, "mkdir failed on %s: already exists", path.c_str());
186 return true; 184 return true;
187 } 185 }
188 186
@@ -197,7 +195,7 @@ bool CreateFullPath(const std::string& fullPath) {
197 LOG_TRACE(Common_Filesystem, "path %s", fullPath.c_str()); 195 LOG_TRACE(Common_Filesystem, "path %s", fullPath.c_str());
198 196
199 if (FileUtil::Exists(fullPath)) { 197 if (FileUtil::Exists(fullPath)) {
200 LOG_WARNING(Common_Filesystem, "path exists %s", fullPath.c_str()); 198 LOG_DEBUG(Common_Filesystem, "path exists %s", fullPath.c_str());
201 return true; 199 return true;
202 } 200 }
203 201
@@ -229,7 +227,7 @@ bool CreateFullPath(const std::string& fullPath) {
229 227
230// Deletes a directory filename, returns true on success 228// Deletes a directory filename, returns true on success
231bool DeleteDir(const std::string& filename) { 229bool DeleteDir(const std::string& filename) {
232 LOG_INFO(Common_Filesystem, "directory %s", filename.c_str()); 230 LOG_TRACE(Common_Filesystem, "directory %s", filename.c_str());
233 231
234 // check if a directory 232 // check if a directory
235 if (!FileUtil::IsDirectory(filename)) { 233 if (!FileUtil::IsDirectory(filename)) {
@@ -693,6 +691,8 @@ const std::string& GetUserPath(const unsigned int DirIDX, const std::string& new
693 paths[D_USER_IDX] = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; 691 paths[D_USER_IDX] = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
694 if (!FileUtil::IsDirectory(paths[D_USER_IDX])) { 692 if (!FileUtil::IsDirectory(paths[D_USER_IDX])) {
695 paths[D_USER_IDX] = AppDataRoamingDirectory() + DIR_SEP EMU_DATA_DIR DIR_SEP; 693 paths[D_USER_IDX] = AppDataRoamingDirectory() + DIR_SEP EMU_DATA_DIR DIR_SEP;
694 } else {
695 LOG_INFO(Common_Filesystem, "Using the local user directory");
696 } 696 }
697 697
698 paths[D_CONFIG_IDX] = paths[D_USER_IDX] + CONFIG_DIR DIR_SEP; 698 paths[D_CONFIG_IDX] = paths[D_USER_IDX] + CONFIG_DIR DIR_SEP;
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index 370ae2c80..2cb3ab9cc 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -8,9 +8,9 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "cpu_detect.h" 9#include "cpu_detect.h"
10 10
11namespace Common { 11#ifdef _MSC_VER
12 12#include <intrin.h>
13#ifndef _MSC_VER 13#else
14 14
15#if defined(__DragonFly__) || defined(__FreeBSD__) 15#if defined(__DragonFly__) || defined(__FreeBSD__)
16// clang-format off 16// clang-format off
@@ -37,13 +37,15 @@ static inline void __cpuid(int info[4], int function_id) {
37} 37}
38 38
39#define _XCR_XFEATURE_ENABLED_MASK 0 39#define _XCR_XFEATURE_ENABLED_MASK 0
40static u64 _xgetbv(u32 index) { 40static inline u64 _xgetbv(u32 index) {
41 u32 eax, edx; 41 u32 eax, edx;
42 __asm__ __volatile__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(index)); 42 __asm__ __volatile__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(index));
43 return ((u64)edx << 32) | eax; 43 return ((u64)edx << 32) | eax;
44} 44}
45 45
46#endif // ifndef _MSC_VER 46#endif // _MSC_VER
47
48namespace Common {
47 49
48// Detects the various CPU features 50// Detects the various CPU features
49static CPUCaps Detect() { 51static CPUCaps Detect() {
diff --git a/src/core/file_sys/archive_extsavedata.cpp b/src/core/file_sys/archive_extsavedata.cpp
index dd2fb167f..f454e7840 100644
--- a/src/core/file_sys/archive_extsavedata.cpp
+++ b/src/core/file_sys/archive_extsavedata.cpp
@@ -173,7 +173,7 @@ Path ConstructExtDataBinaryPath(u32 media_type, u32 high, u32 low) {
173ArchiveFactory_ExtSaveData::ArchiveFactory_ExtSaveData(const std::string& mount_location, 173ArchiveFactory_ExtSaveData::ArchiveFactory_ExtSaveData(const std::string& mount_location,
174 bool shared) 174 bool shared)
175 : shared(shared), mount_point(GetExtDataContainerPath(mount_location, shared)) { 175 : shared(shared), mount_point(GetExtDataContainerPath(mount_location, shared)) {
176 LOG_INFO(Service_FS, "Directory %s set as base for ExtSaveData.", mount_point.c_str()); 176 LOG_DEBUG(Service_FS, "Directory %s set as base for ExtSaveData.", mount_point.c_str());
177} 177}
178 178
179bool ArchiveFactory_ExtSaveData::Initialize() { 179bool ArchiveFactory_ExtSaveData::Initialize() {
diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp
index 72ff05c65..679909d06 100644
--- a/src/core/file_sys/archive_sdmc.cpp
+++ b/src/core/file_sys/archive_sdmc.cpp
@@ -306,7 +306,7 @@ u64 SDMCArchive::GetFreeBytes() const {
306 306
307ArchiveFactory_SDMC::ArchiveFactory_SDMC(const std::string& sdmc_directory) 307ArchiveFactory_SDMC::ArchiveFactory_SDMC(const std::string& sdmc_directory)
308 : sdmc_directory(sdmc_directory) { 308 : sdmc_directory(sdmc_directory) {
309 LOG_INFO(Service_FS, "Directory %s set as SDMC.", sdmc_directory.c_str()); 309 LOG_DEBUG(Service_FS, "Directory %s set as SDMC.", sdmc_directory.c_str());
310} 310}
311 311
312bool ArchiveFactory_SDMC::Initialize() { 312bool ArchiveFactory_SDMC::Initialize() {
diff --git a/src/core/file_sys/archive_sdmcwriteonly.cpp b/src/core/file_sys/archive_sdmcwriteonly.cpp
index 2aafc9b1d..244aef48a 100644
--- a/src/core/file_sys/archive_sdmcwriteonly.cpp
+++ b/src/core/file_sys/archive_sdmcwriteonly.cpp
@@ -32,7 +32,7 @@ ResultVal<std::unique_ptr<DirectoryBackend>> SDMCWriteOnlyArchive::OpenDirectory
32 32
33ArchiveFactory_SDMCWriteOnly::ArchiveFactory_SDMCWriteOnly(const std::string& mount_point) 33ArchiveFactory_SDMCWriteOnly::ArchiveFactory_SDMCWriteOnly(const std::string& mount_point)
34 : sdmc_directory(mount_point) { 34 : sdmc_directory(mount_point) {
35 LOG_INFO(Service_FS, "Directory %s set as SDMCWriteOnly.", sdmc_directory.c_str()); 35 LOG_DEBUG(Service_FS, "Directory %s set as SDMCWriteOnly.", sdmc_directory.c_str());
36} 36}
37 37
38bool ArchiveFactory_SDMCWriteOnly::Initialize() { 38bool ArchiveFactory_SDMCWriteOnly::Initialize() {
diff --git a/src/core/file_sys/archive_source_sd_savedata.cpp b/src/core/file_sys/archive_source_sd_savedata.cpp
index e01357891..f31a68038 100644
--- a/src/core/file_sys/archive_source_sd_savedata.cpp
+++ b/src/core/file_sys/archive_source_sd_savedata.cpp
@@ -39,7 +39,7 @@ std::string GetSaveDataMetadataPath(const std::string& mount_location, u64 progr
39 39
40ArchiveSource_SDSaveData::ArchiveSource_SDSaveData(const std::string& sdmc_directory) 40ArchiveSource_SDSaveData::ArchiveSource_SDSaveData(const std::string& sdmc_directory)
41 : mount_point(GetSaveDataContainerPath(sdmc_directory)) { 41 : mount_point(GetSaveDataContainerPath(sdmc_directory)) {
42 LOG_INFO(Service_FS, "Directory %s set as SaveData.", mount_point.c_str()); 42 LOG_DEBUG(Service_FS, "Directory %s set as SaveData.", mount_point.c_str());
43} 43}
44 44
45ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveSource_SDSaveData::Open(u64 program_id) { 45ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveSource_SDSaveData::Open(u64 program_id) {
diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp
index 6f13cde27..4ddb1bc90 100644
--- a/src/core/hle/service/cfg/cfg.cpp
+++ b/src/core/hle/service/cfg/cfg.cpp
@@ -3,6 +3,8 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm> 5#include <algorithm>
6#include <array>
7#include <cryptopp/sha.h>
6#include "common/file_util.h" 8#include "common/file_util.h"
7#include "common/logging/log.h" 9#include "common/logging/log.h"
8#include "common/string_util.h" 10#include "common/string_util.h"
@@ -176,14 +178,29 @@ void SecureInfoGetRegion(Service::Interface* self) {
176} 178}
177 179
178void GenHashConsoleUnique(Service::Interface* self) { 180void GenHashConsoleUnique(Service::Interface* self) {
179 u32* cmd_buff = Kernel::GetCommandBuffer(); 181 IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x03, 1, 0);
180 u32 app_id_salt = cmd_buff[1]; 182 const u32 app_id_salt = rp.Pop<u32>() & 0x000FFFFF;
181 183
182 cmd_buff[1] = RESULT_SUCCESS.raw; 184 IPC::RequestBuilder rb = rp.MakeBuilder(3, 0);
183 cmd_buff[2] = 0x33646D6F ^ (app_id_salt & 0xFFFFF); // 3dmoo hash 185
184 cmd_buff[3] = 0x6F534841 ^ (app_id_salt & 0xFFFFF); 186 std::array<u8, 12> buffer;
187 const ResultCode result = GetConfigInfoBlock(ConsoleUniqueID2BlockID, 8, 2, buffer.data());
188 rb.Push(result);
189 if (result.IsSuccess()) {
190 std::memcpy(&buffer[8], &app_id_salt, sizeof(u32));
191 std::array<u8, CryptoPP::SHA256::DIGESTSIZE> hash;
192 CryptoPP::SHA256().CalculateDigest(hash.data(), buffer.data(), sizeof(buffer));
193 u32 low, high;
194 memcpy(&low, &hash[hash.size() - 8], sizeof(u32));
195 memcpy(&high, &hash[hash.size() - 4], sizeof(u32));
196 rb.Push(low);
197 rb.Push(high);
198 } else {
199 rb.Push<u32>(0);
200 rb.Push<u32>(0);
201 }
185 202
186 LOG_WARNING(Service_CFG, "(STUBBED) called app_id_salt=0x%X", app_id_salt); 203 LOG_DEBUG(Service_CFG, "called app_id_salt=0x%X", app_id_salt);
187} 204}
188 205
189void GetRegionCanadaUSA(Service::Interface* self) { 206void GetRegionCanadaUSA(Service::Interface* self) {
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 1baa80671..4e0c3fb8b 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -556,11 +556,21 @@ static ResultCode CreateThread(Kernel::Handle* out_handle, s32 priority, u32 ent
556 break; 556 break;
557 } 557 }
558 558
559 if (processor_id == THREADPROCESSORID_1 || processor_id == THREADPROCESSORID_ALL || 559 if (processor_id == THREADPROCESSORID_ALL) {
560 (processor_id == THREADPROCESSORID_DEFAULT && 560 LOG_INFO(Kernel_SVC,
561 Kernel::g_current_process->ideal_processor == THREADPROCESSORID_1)) { 561 "Newly created thread is allowed to be run in any Core, unimplemented.");
562 LOG_WARNING(Kernel_SVC, 562 }
563 "Newly created thread is allowed to be run in the SysCore, unimplemented."); 563
564 if (processor_id == THREADPROCESSORID_DEFAULT &&
565 Kernel::g_current_process->ideal_processor == THREADPROCESSORID_1) {
566 LOG_WARNING(
567 Kernel_SVC,
568 "Newly created thread is allowed to be run in the SysCore (Core1), unimplemented.");
569 }
570
571 if (processor_id == THREADPROCESSORID_1) {
572 LOG_ERROR(Kernel_SVC,
573 "Newly created thread must run in the SysCore (Core1), unimplemented.");
564 } 574 }
565 575
566 CASCADE_RESULT(SharedPtr<Thread> thread, Kernel::Thread::Create(name, entry_point, priority, 576 CASCADE_RESULT(SharedPtr<Thread> thread, Kernel::Thread::Create(name, entry_point, priority,
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
index 147bf8591..be719d74c 100644
--- a/src/core/loader/loader.cpp
+++ b/src/core/loader/loader.cpp
@@ -139,7 +139,7 @@ std::unique_ptr<AppLoader> GetLoader(const std::string& filename) {
139 type = filename_type; 139 type = filename_type;
140 } 140 }
141 141
142 LOG_INFO(Loader, "Loading file %s as %s...", filename.c_str(), GetFileTypeString(type)); 142 LOG_DEBUG(Loader, "Loading file %s as %s...", filename.c_str(), GetFileTypeString(type));
143 143
144 return GetFileLoader(std::move(file), type, filename_filename, filename); 144 return GetFileLoader(std::move(file), type, filename_filename, filename);
145} 145}
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index 98b8259d9..1a4e3efa8 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm> 5#include <algorithm>
6#include <cinttypes>
6#include <cstring> 7#include <cstring>
7#include <memory> 8#include <memory>
8#include "common/logging/log.h" 9#include "common/logging/log.h"
@@ -253,7 +254,7 @@ ResultStatus AppLoader_NCCH::LoadExeFS() {
253 254
254 // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)... 255 // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
255 if (MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) { 256 if (MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) {
256 LOG_WARNING(Loader, "Only loading the first (bootable) NCCH within the NCSD file!"); 257 LOG_DEBUG(Loader, "Only loading the first (bootable) NCCH within the NCSD file!");
257 ncch_offset = 0x4000; 258 ncch_offset = 0x4000;
258 file.Seek(ncch_offset, SEEK_SET); 259 file.Seek(ncch_offset, SEEK_SET);
259 file.ReadBytes(&ncch_header, sizeof(NCCH_Header)); 260 file.ReadBytes(&ncch_header, sizeof(NCCH_Header));
@@ -277,8 +278,8 @@ ResultStatus AppLoader_NCCH::LoadExeFS() {
277 priority = exheader_header.arm11_system_local_caps.priority; 278 priority = exheader_header.arm11_system_local_caps.priority;
278 resource_limit_category = exheader_header.arm11_system_local_caps.resource_limit_category; 279 resource_limit_category = exheader_header.arm11_system_local_caps.resource_limit_category;
279 280
280 LOG_INFO(Loader, "Name: %s", exheader_header.codeset_info.name); 281 LOG_DEBUG(Loader, "Name: %s", exheader_header.codeset_info.name);
281 LOG_INFO(Loader, "Program ID: %016llX", ncch_header.program_id); 282 LOG_DEBUG(Loader, "Program ID: %016" PRIX64, ncch_header.program_id);
282 LOG_DEBUG(Loader, "Code compressed: %s", is_compressed ? "yes" : "no"); 283 LOG_DEBUG(Loader, "Code compressed: %s", is_compressed ? "yes" : "no");
283 LOG_DEBUG(Loader, "Entry point: 0x%08X", entry_point); 284 LOG_DEBUG(Loader, "Entry point: 0x%08X", entry_point);
284 LOG_DEBUG(Loader, "Code size: 0x%08X", code_size); 285 LOG_DEBUG(Loader, "Code size: 0x%08X", code_size);
@@ -336,6 +337,8 @@ ResultStatus AppLoader_NCCH::Load() {
336 if (result != ResultStatus::Success) 337 if (result != ResultStatus::Success)
337 return result; 338 return result;
338 339
340 LOG_INFO(Loader, "Program ID: %016" PRIX64, ncch_header.program_id);
341
339 is_loaded = true; // Set state to loaded 342 is_loaded = true; // Set state to loaded
340 343
341 result = LoadExec(); // Load the executable into memory for booting 344 result = LoadExec(); // Load the executable into memory for booting