diff options
| -rw-r--r-- | CONTRIBUTING.md | 3 | ||||
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | appveyor.yml | 2 | ||||
| m--------- | externals/boost | 0 | ||||
| -rw-r--r-- | src/common/file_util.cpp | 18 | ||||
| -rw-r--r-- | src/common/x64/cpu_detect.cpp | 12 | ||||
| -rw-r--r-- | src/core/file_sys/archive_extsavedata.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/archive_sdmc.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/archive_sdmcwriteonly.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/archive_source_sd_savedata.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/cfg/cfg.cpp | 31 | ||||
| -rw-r--r-- | src/core/hle/svc.cpp | 20 | ||||
| -rw-r--r-- | src/core/loader/loader.cpp | 2 | ||||
| -rw-r--r-- | src/core/loader/ncch.cpp | 9 |
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 | ||
| 6 | If 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. | 5 | If 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 | ||
| @@ -7,7 +7,7 @@ Citra Emulator | |||
| 7 | 7 | ||
| 8 | Citra 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. | 8 | Citra 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 | ||
| 10 | Citra 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. | 10 | Citra 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 | ||
| 12 | Check out our [website](https://citra-emu.org/)! | 12 | Check 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 |
| 30 | We 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: | 30 | We 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 | ||
| 22 | before_build: | 22 | before_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 |
| 131 | bool Delete(const std::string& filename) { | 130 | bool 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 |
| 231 | bool DeleteDir(const std::string& filename) { | 229 | bool 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 | ||
| 11 | namespace 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 |
| 40 | static u64 _xgetbv(u32 index) { | 40 | static 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 | |||
| 48 | namespace Common { | ||
| 47 | 49 | ||
| 48 | // Detects the various CPU features | 50 | // Detects the various CPU features |
| 49 | static CPUCaps Detect() { | 51 | static 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) { | |||
| 173 | ArchiveFactory_ExtSaveData::ArchiveFactory_ExtSaveData(const std::string& mount_location, | 173 | ArchiveFactory_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 | ||
| 179 | bool ArchiveFactory_ExtSaveData::Initialize() { | 179 | bool 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 | ||
| 307 | ArchiveFactory_SDMC::ArchiveFactory_SDMC(const std::string& sdmc_directory) | 307 | ArchiveFactory_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 | ||
| 312 | bool ArchiveFactory_SDMC::Initialize() { | 312 | bool 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 | ||
| 33 | ArchiveFactory_SDMCWriteOnly::ArchiveFactory_SDMCWriteOnly(const std::string& mount_point) | 33 | ArchiveFactory_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 | ||
| 38 | bool ArchiveFactory_SDMCWriteOnly::Initialize() { | 38 | bool 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 | ||
| 40 | ArchiveSource_SDSaveData::ArchiveSource_SDSaveData(const std::string& sdmc_directory) | 40 | ArchiveSource_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 | ||
| 45 | ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveSource_SDSaveData::Open(u64 program_id) { | 45 | ResultVal<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 | ||
| 178 | void GenHashConsoleUnique(Service::Interface* self) { | 180 | void 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 | ||
| 189 | void GetRegionCanadaUSA(Service::Interface* self) { | 206 | void 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 |