diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/core.cpp | 8 | ||||
| -rw-r--r-- | src/core/core.h | 4 | ||||
| -rw-r--r-- | src/core/file_sys/directory.h | 4 | ||||
| -rw-r--r-- | src/core/file_sys/patch_manager.cpp | 56 | ||||
| -rw-r--r-- | src/core/file_sys/patch_manager.h | 5 | ||||
| -rw-r--r-- | src/core/file_sys/savedata_factory.cpp | 8 | ||||
| -rw-r--r-- | src/core/file_sys/savedata_factory.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 20 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 26 | ||||
| -rw-r--r-- | src/core/hle/service/aoc/aoc_u.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.cpp | 11 | ||||
| -rw-r--r-- | src/core/loader/loader.h | 10 | ||||
| -rw-r--r-- | src/core/loader/nsp.cpp | 7 | ||||
| -rw-r--r-- | src/core/loader/nsp.h | 1 | ||||
| -rw-r--r-- | src/core/loader/xci.cpp | 7 | ||||
| -rw-r--r-- | src/core/loader/xci.h | 1 | ||||
| -rw-r--r-- | src/core/memory.cpp | 11 | ||||
| -rw-r--r-- | src/core/settings.h | 5 | ||||
| -rw-r--r-- | src/core/telemetry_session.cpp | 12 | 
22 files changed, 170 insertions, 55 deletions
| diff --git a/src/core/core.cpp b/src/core/core.cpp index 795fabc65..ce7851538 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -8,6 +8,7 @@  #include <thread>  #include <utility> +#include "common/file_util.h"  #include "common/logging/log.h"  #include "common/string_util.h"  #include "core/arm/exclusive_monitor.h" @@ -40,7 +41,6 @@ namespace Core {  /*static*/ System System::s_instance; -namespace {  FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,                                           const std::string& path) {      // To account for split 00+01+etc files. @@ -69,11 +69,13 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,          return FileSys::ConcatenatedVfsFile::MakeConcatenatedFile(concat, dir->GetName());      } +    if (FileUtil::IsDirectory(path)) +        return vfs->OpenFile(path + "/" + "main", FileSys::Mode::Read); +      return vfs->OpenFile(path, FileSys::Mode::Read);  } -} // Anonymous namespace -  struct System::Impl { +      Cpu& CurrentCpuCore() {          return cpu_core_manager.GetCurrentCore();      } diff --git a/src/core/core.h b/src/core/core.h index be71bd437..71031dfcf 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -9,6 +9,7 @@  #include <string>  #include "common/common_types.h" +#include "core/file_sys/vfs_types.h"  #include "core/hle/kernel/object.h"  namespace Core::Frontend { @@ -55,6 +56,9 @@ class TelemetrySession;  struct PerfStatsResults; +FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, +                                         const std::string& path); +  class System {  public:      System(const System&) = delete; diff --git a/src/core/file_sys/directory.h b/src/core/file_sys/directory.h index 12bb90ec8..6690aa575 100644 --- a/src/core/file_sys/directory.h +++ b/src/core/file_sys/directory.h @@ -29,8 +29,8 @@ struct Entry {          filename[copy_size] = '\0';      } -    char filename[0x300]; -    INSERT_PADDING_BYTES(4); +    char filename[0x301]; +    INSERT_PADDING_BYTES(3);      EntryType type;      INSERT_PADDING_BYTES(3);      u64 file_size; diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 6b14e08be..ecdc21c87 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -56,6 +56,10 @@ PatchManager::PatchManager(u64 title_id) : title_id(title_id) {}  PatchManager::~PatchManager() = default; +u64 PatchManager::GetTitleID() const { +    return title_id; +} +  VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {      LOG_INFO(Loader, "Patching ExeFS for title_id={:016X}", title_id); @@ -73,11 +77,15 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {      const auto installed = Service::FileSystem::GetUnionContents(); +    const auto& disabled = Settings::values.disabled_addons[title_id]; +    const auto update_disabled = +        std::find(disabled.begin(), disabled.end(), "Update") != disabled.end(); +      // Game Updates      const auto update_tid = GetUpdateTitleID(title_id);      const auto update = installed.GetEntry(update_tid, ContentRecordType::Program); -    if (update != nullptr && update->GetExeFS() != nullptr && +    if (!update_disabled && update != nullptr && update->GetExeFS() != nullptr &&          update->GetStatus() == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS) {          LOG_INFO(Loader, "    ExeFS: Update ({}) applied successfully",                   FormatTitleVersion(installed.GetEntryVersion(update_tid).value_or(0))); @@ -95,6 +103,9 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {          std::vector<VirtualDir> layers;          layers.reserve(patch_dirs.size() + 1);          for (const auto& subdir : patch_dirs) { +            if (std::find(disabled.begin(), disabled.end(), subdir->GetName()) != disabled.end()) +                continue; +              auto exefs_dir = subdir->GetSubdirectory("exefs");              if (exefs_dir != nullptr)                  layers.push_back(std::move(exefs_dir)); @@ -111,11 +122,16 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {      return exefs;  } -static std::vector<VirtualFile> CollectPatches(const std::vector<VirtualDir>& patch_dirs, -                                               const std::string& build_id) { +std::vector<VirtualFile> PatchManager::CollectPatches(const std::vector<VirtualDir>& patch_dirs, +                                                      const std::string& build_id) const { +    const auto& disabled = Settings::values.disabled_addons[title_id]; +      std::vector<VirtualFile> out;      out.reserve(patch_dirs.size());      for (const auto& subdir : patch_dirs) { +        if (std::find(disabled.begin(), disabled.end(), subdir->GetName()) != disabled.end()) +            continue; +          auto exefs_dir = subdir->GetSubdirectory("exefs");          if (exefs_dir != nullptr) {              for (const auto& file : exefs_dir->GetFiles()) { @@ -228,6 +244,7 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t          return;      } +    const auto& disabled = Settings::values.disabled_addons[title_id];      auto patch_dirs = load_dir->GetSubdirectories();      std::sort(patch_dirs.begin(), patch_dirs.end(),                [](const VirtualDir& l, const VirtualDir& r) { return l->GetName() < r->GetName(); }); @@ -237,6 +254,9 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t      layers.reserve(patch_dirs.size() + 1);      layers_ext.reserve(patch_dirs.size() + 1);      for (const auto& subdir : patch_dirs) { +        if (std::find(disabled.begin(), disabled.end(), subdir->GetName()) != disabled.end()) +            continue; +          auto romfs_dir = subdir->GetSubdirectory("romfs");          if (romfs_dir != nullptr)              layers.push_back(std::move(romfs_dir)); @@ -282,7 +302,12 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content      // Game Updates      const auto update_tid = GetUpdateTitleID(title_id);      const auto update = installed.GetEntryRaw(update_tid, type); -    if (update != nullptr) { + +    const auto& disabled = Settings::values.disabled_addons[title_id]; +    const auto update_disabled = +        std::find(disabled.begin(), disabled.end(), "Update") != disabled.end(); + +    if (!update_disabled && update != nullptr) {          const auto new_nca = std::make_shared<NCA>(update, romfs, ivfc_offset);          if (new_nca->GetStatus() == Loader::ResultStatus::Success &&              new_nca->GetRomFS() != nullptr) { @@ -290,7 +315,7 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content                       FormatTitleVersion(installed.GetEntryVersion(update_tid).value_or(0)));              romfs = new_nca->GetRomFS();          } -    } else if (update_raw != nullptr) { +    } else if (!update_disabled && update_raw != nullptr) {          const auto new_nca = std::make_shared<NCA>(update_raw, romfs, ivfc_offset);          if (new_nca->GetStatus() == Loader::ResultStatus::Success &&              new_nca->GetRomFS() != nullptr) { @@ -320,25 +345,30 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam      VirtualFile update_raw) const {      std::map<std::string, std::string, std::less<>> out;      const auto installed = Service::FileSystem::GetUnionContents(); +    const auto& disabled = Settings::values.disabled_addons[title_id];      // Game Updates      const auto update_tid = GetUpdateTitleID(title_id);      PatchManager update{update_tid};      auto [nacp, discard_icon_file] = update.GetControlMetadata(); +    const auto update_disabled = +        std::find(disabled.begin(), disabled.end(), "Update") != disabled.end(); +    const auto update_label = update_disabled ? "[D] Update" : "Update"; +      if (nacp != nullptr) { -        out.insert_or_assign("Update", nacp->GetVersionString()); +        out.insert_or_assign(update_label, nacp->GetVersionString());      } else {          if (installed.HasEntry(update_tid, ContentRecordType::Program)) {              const auto meta_ver = installed.GetEntryVersion(update_tid);              if (meta_ver.value_or(0) == 0) { -                out.insert_or_assign("Update", ""); +                out.insert_or_assign(update_label, "");              } else {                  out.insert_or_assign( -                    "Update", FormatTitleVersion(*meta_ver, TitleVersionFormat::ThreeElements)); +                    update_label, FormatTitleVersion(*meta_ver, TitleVersionFormat::ThreeElements));              }          } else if (update_raw != nullptr) { -            out.insert_or_assign("Update", "PACKED"); +            out.insert_or_assign(update_label, "PACKED");          }      } @@ -378,7 +408,9 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam              if (types.empty())                  continue; -            out.insert_or_assign(mod->GetName(), types); +            const auto mod_disabled = +                std::find(disabled.begin(), disabled.end(), mod->GetName()) != disabled.end(); +            out.insert_or_assign(mod_disabled ? "[D] " + mod->GetName() : mod->GetName(), types);          }      } @@ -401,7 +433,9 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam          list += fmt::format("{}", dlc_match.back().title_id & 0x7FF); -        out.insert_or_assign("DLC", std::move(list)); +        const auto dlc_disabled = +            std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end(); +        out.insert_or_assign(dlc_disabled ? "[D] DLC" : "DLC", std::move(list));      }      return out; diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 7d168837f..b8a1652fd 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -30,6 +30,8 @@ public:      explicit PatchManager(u64 title_id);      ~PatchManager(); +    u64 GetTitleID() const; +      // Currently tracked ExeFS patches:      // - Game Updates      VirtualDir PatchExeFS(VirtualDir exefs) const; @@ -63,6 +65,9 @@ public:      std::pair<std::unique_ptr<NACP>, VirtualFile> ParseControlNCA(const NCA& nca) const;  private: +    std::vector<VirtualFile> CollectPatches(const std::vector<VirtualDir>& patch_dirs, +                                            const std::string& build_id) const; +      u64 title_id;  }; diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 5434f2149..bd50fedc7 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -18,7 +18,11 @@ std::string SaveDataDescriptor::DebugInfo() const {                         static_cast<u8>(type), title_id, user_id[1], user_id[0], save_id);  } -SaveDataFactory::SaveDataFactory(VirtualDir save_directory) : dir(std::move(save_directory)) {} +SaveDataFactory::SaveDataFactory(VirtualDir save_directory) : dir(std::move(save_directory)) { +    // Delete all temporary storages +    // On hardware, it is expected that temporary storage be empty at first use. +    dir->DeleteSubdirectoryRecursive("temp"); +}  SaveDataFactory::~SaveDataFactory() = default; @@ -120,6 +124,8 @@ std::string SaveDataFactory::GetFullPath(SaveDataSpaceId space, SaveDataType typ      case SaveDataType::TemporaryStorage:          return fmt::format("{}{:016X}/{:016X}{:016X}/{:016X}", out, 0, user_id[1], user_id[0],                             title_id); +    case SaveDataType::CacheStorage: +        return fmt::format("{}save/cache/{:016X}", out, title_id);      default:          ASSERT_MSG(false, "Unrecognized SaveDataType: {:02X}", static_cast<u8>(type));      } diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h index 2a0088040..bd4919610 100644 --- a/src/core/file_sys/savedata_factory.h +++ b/src/core/file_sys/savedata_factory.h @@ -17,8 +17,10 @@ namespace FileSys {  enum class SaveDataSpaceId : u8 {      NandSystem = 0,      NandUser = 1, -    SdCard = 2, +    SdCardSystem = 2,      TemporaryStorage = 3, +    SdCardUser = 4, +    ProperSystem = 100,  };  enum class SaveDataType : u8 { diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 211bf6686..c817fb449 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -66,6 +66,7 @@ ResultCode Process::ClearSignalState() {  void Process::LoadFromMetadata(const FileSys::ProgramMetadata& metadata) {      program_id = metadata.GetTitleID(); +    ideal_processor = metadata.GetMainThreadCore();      is_64bit_process = metadata.Is64BitProgram();      vm_manager.Reset(metadata.GetAddressSpaceType());  } diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index 0494581f5..d1ca60125 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp @@ -39,15 +39,15 @@ SharedPtr<SharedMemory> SharedMemory::Create(KernelCore& kernel, SharedPtr<Proce                  shared_memory->backing_block.get());          }      } else { -        auto& vm_manager = shared_memory->owner_process->VMManager(); +        const auto& vm_manager = shared_memory->owner_process->VMManager();          // The memory is already available and mapped in the owner process. -        auto vma = vm_manager.FindVMA(address); -        ASSERT_MSG(vma != vm_manager.vma_map.end(), "Invalid memory address"); +        const auto vma = vm_manager.FindVMA(address); +        ASSERT_MSG(vm_manager.IsValidHandle(vma), "Invalid memory address");          ASSERT_MSG(vma->second.backing_block, "Backing block doesn't exist for address");          // The returned VMA might be a bigger one encompassing the desired address. -        auto vma_offset = address - vma->first; +        const auto vma_offset = address - vma->first;          ASSERT_MSG(vma_offset + size <= vma->second.size,                     "Shared memory exceeds bounds of mapped block"); diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 84df2040e..f43c7201c 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -239,7 +239,7 @@ static ResultCode SetMemoryPermission(VAddr addr, u64 size, u32 prot) {      }      const VMManager::VMAHandle iter = vm_manager.FindVMA(addr); -    if (iter == vm_manager.vma_map.end()) { +    if (!vm_manager.IsValidHandle(iter)) {          LOG_ERROR(Kernel_SVC, "Unable to find VMA for address=0x{:016X}", addr);          return ERR_INVALID_ADDRESS_STATE;      } @@ -1077,19 +1077,23 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_i                    process_handle);          return ERR_INVALID_HANDLE;      } -    auto vma = process->VMManager().FindVMA(addr); + +    const auto& vm_manager = process->VMManager(); +    const auto vma = vm_manager.FindVMA(addr); +      memory_info->attributes = 0; -    if (vma == process->VMManager().vma_map.end()) { -        memory_info->base_address = 0; -        memory_info->permission = static_cast<u32>(VMAPermission::None); -        memory_info->size = 0; -        memory_info->type = static_cast<u32>(MemoryState::Unmapped); -    } else { +    if (vm_manager.IsValidHandle(vma)) {          memory_info->base_address = vma->second.base;          memory_info->permission = static_cast<u32>(vma->second.permissions);          memory_info->size = vma->second.size;          memory_info->type = static_cast<u32>(vma->second.meminfo_state); +    } else { +        memory_info->base_address = 0; +        memory_info->permission = static_cast<u32>(VMAPermission::None); +        memory_info->size = 0; +        memory_info->type = static_cast<u32>(MemoryState::Unmapped);      } +      return RESULT_SUCCESS;  } diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index 100f8f6bf..6187993ce 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -87,6 +87,10 @@ VMManager::VMAHandle VMManager::FindVMA(VAddr target) const {      }  } +bool VMManager::IsValidHandle(VMAHandle handle) const { +    return handle != vma_map.cend(); +} +  ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target,                                                            std::shared_ptr<std::vector<u8>> block,                                                            std::size_t offset, u64 size, diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index d522404fe..a12419d1e 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h @@ -113,16 +113,10 @@ struct VirtualMemoryArea {   *  - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/   */  class VMManager final { +    using VMAMap = std::map<VAddr, VirtualMemoryArea>; +  public: -    /** -     * A map covering the entirety of the managed address space, keyed by the `base` field of each -     * VMA. It must always be modified by splitting or merging VMAs, so that the invariant -     * `elem.base + elem.size == next.base` is preserved, and mergeable regions must always be -     * merged when possible so that no two similar and adjacent regions exist that have not been -     * merged. -     */ -    std::map<VAddr, VirtualMemoryArea> vma_map; -    using VMAHandle = decltype(vma_map)::const_iterator; +    using VMAHandle = VMAMap::const_iterator;      VMManager();      ~VMManager(); @@ -133,6 +127,9 @@ public:      /// Finds the VMA in which the given address is included in, or `vma_map.end()`.      VMAHandle FindVMA(VAddr target) const; +    /// Indicates whether or not the given handle is within the VMA map. +    bool IsValidHandle(VMAHandle handle) const; +      // TODO(yuriks): Should these functions actually return the handle?      /** @@ -281,7 +278,7 @@ public:      Memory::PageTable page_table;  private: -    using VMAIter = decltype(vma_map)::iterator; +    using VMAIter = VMAMap::iterator;      /// Converts a VMAHandle to a mutable VMAIter.      VMAIter StripIterConstness(const VMAHandle& iter); @@ -328,6 +325,15 @@ private:      /// Clears out the page table      void ClearPageTable(); +    /** +     * A map covering the entirety of the managed address space, keyed by the `base` field of each +     * VMA. It must always be modified by splitting or merging VMAs, so that the invariant +     * `elem.base + elem.size == next.base` is preserved, and mergeable regions must always be +     * merged when possible so that no two similar and adjacent regions exist that have not been +     * merged. +     */ +    VMAMap vma_map; +      u32 address_space_width = 0;      VAddr address_space_base = 0;      VAddr address_space_end = 0; diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index 0417fdb92..b506bc3dd 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp @@ -20,6 +20,7 @@  #include "core/hle/service/aoc/aoc_u.h"  #include "core/hle/service/filesystem/filesystem.h"  #include "core/loader/loader.h" +#include "core/settings.h"  namespace Service::AOC { @@ -76,6 +77,13 @@ void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {      rb.Push(RESULT_SUCCESS);      const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID(); + +    const auto& disabled = Settings::values.disabled_addons[current]; +    if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) { +        rb.Push<u32>(0); +        return; +    } +      rb.Push<u32>(static_cast<u32>(          std::count_if(add_on_content.begin(), add_on_content.end(),                        [current](u64 tid) { return CheckAOCTitleIDMatchesBase(tid, current); }))); @@ -96,6 +104,10 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {              out.push_back(static_cast<u32>(add_on_content[i] & 0x7FF));      } +    const auto& disabled = Settings::values.disabled_addons[current]; +    if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) +        out = {}; +      if (out.size() < offset) {          IPC::ResponseBuilder rb{ctx, 2};          // TODO(DarkLordZach): Find the correct error code. diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index d2ffd5776..63fa48133 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp @@ -796,9 +796,18 @@ void FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId(Kernel::HLERequestContext&  void FSP_SRV::GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx) {      LOG_WARNING(Service_FS, "(STUBBED) called"); +    enum class LogMode : u32 { +        Off, +        Log, +        RedirectToSdCard, +        LogToSdCard = Log | RedirectToSdCard, +    }; + +    // Given we always want to receive logging information, +    // we always specify logging as enabled.      IPC::ResponseBuilder rb{ctx, 3};      rb.Push(RESULT_SUCCESS); -    rb.Push<u32>(5); +    rb.PushEnum(LogMode::Log);  }  void FSP_SRV::OpenDataStorageByCurrentProcess(Kernel::HLERequestContext& ctx) { diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 5390ab9ee..0838e303b 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -12,6 +12,7 @@  #include <vector>  #include "common/common_types.h" +#include "core/file_sys/control_metadata.h"  #include "core/file_sys/vfs.h"  namespace Kernel { @@ -243,6 +244,15 @@ public:          return ResultStatus::ErrorNotImplemented;      } +    /** +     * Get the developer of the application +     * @param developer Reference to store the application developer into +     * @return ResultStatus result of function +     */ +    virtual ResultStatus ReadDeveloper(std::string& developer) { +        return ResultStatus::ErrorNotImplemented; +    } +  protected:      FileSys::VirtualFile file;      bool is_loaded = false; diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp index 080d89904..b4ab88ae8 100644 --- a/src/core/loader/nsp.cpp +++ b/src/core/loader/nsp.cpp @@ -151,4 +151,11 @@ ResultStatus AppLoader_NSP::ReadTitle(std::string& title) {      title = nacp_file->GetApplicationName();      return ResultStatus::Success;  } + +ResultStatus AppLoader_NSP::ReadDeveloper(std::string& developer) { +    if (nacp_file == nullptr) +        return ResultStatus::ErrorNoControl; +    developer = nacp_file->GetDeveloperName(); +    return ResultStatus::Success; +}  } // namespace Loader diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h index 9ed8a59cf..2b1e0719b 100644 --- a/src/core/loader/nsp.h +++ b/src/core/loader/nsp.h @@ -43,6 +43,7 @@ public:      ResultStatus ReadProgramId(u64& out_program_id) override;      ResultStatus ReadIcon(std::vector<u8>& buffer) override;      ResultStatus ReadTitle(std::string& title) override; +    ResultStatus ReadDeveloper(std::string& developer) override;  private:      std::unique_ptr<FileSys::NSP> nsp; diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp index 461607c95..bd5a83b49 100644 --- a/src/core/loader/xci.cpp +++ b/src/core/loader/xci.cpp @@ -120,4 +120,11 @@ ResultStatus AppLoader_XCI::ReadTitle(std::string& title) {      title = nacp_file->GetApplicationName();      return ResultStatus::Success;  } + +ResultStatus AppLoader_XCI::ReadDeveloper(std::string& developer) { +    if (nacp_file == nullptr) +        return ResultStatus::ErrorNoControl; +    developer = nacp_file->GetDeveloperName(); +    return ResultStatus::Success; +}  } // namespace Loader diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h index ded5bb88a..15d1b1a23 100644 --- a/src/core/loader/xci.h +++ b/src/core/loader/xci.h @@ -43,6 +43,7 @@ public:      ResultStatus ReadProgramId(u64& out_program_id) override;      ResultStatus ReadIcon(std::vector<u8>& buffer) override;      ResultStatus ReadTitle(std::string& title) override; +    ResultStatus ReadDeveloper(std::string& developer) override;  private:      std::unique_ptr<FileSys::XCI> xci; diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 41fd2a6a0..643afdee8 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -125,14 +125,13 @@ void RemoveDebugHook(PageTable& page_table, VAddr base, u64 size, MemoryHookPoin   * using a VMA from the current process   */  static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) { -    u8* direct_pointer = nullptr; - -    auto& vm_manager = process.VMManager(); +    const auto& vm_manager = process.VMManager(); -    auto it = vm_manager.FindVMA(vaddr); -    ASSERT(it != vm_manager.vma_map.end()); +    const auto it = vm_manager.FindVMA(vaddr); +    DEBUG_ASSERT(vm_manager.IsValidHandle(it)); -    auto& vma = it->second; +    u8* direct_pointer = nullptr; +    const auto& vma = it->second;      switch (vma.type) {      case Kernel::VMAType::AllocatedMemoryBlock:          direct_pointer = vma.backing_block->data() + vma.offset; diff --git a/src/core/settings.h b/src/core/settings.h index a0c5fd447..de01b05c0 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -6,8 +6,10 @@  #include <array>  #include <atomic> +#include <map>  #include <optional>  #include <string> +#include <vector>  #include "common/common_types.h"  namespace Settings { @@ -411,6 +413,9 @@ struct Values {      std::string web_api_url;      std::string yuzu_username;      std::string yuzu_token; + +    // Add-Ons +    std::map<u64, std::vector<std::string>> disabled_addons;  } extern values;  void Apply(); diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp index a3b08c740..09ed74d78 100644 --- a/src/core/telemetry_session.cpp +++ b/src/core/telemetry_session.cpp @@ -103,13 +103,8 @@ bool VerifyLogin(const std::string& username, const std::string& token) {  TelemetrySession::TelemetrySession() {  #ifdef ENABLE_WEB_SERVICE -    if (Settings::values.enable_telemetry) { -        backend = std::make_unique<WebService::TelemetryJson>(Settings::values.web_api_url, -                                                              Settings::values.yuzu_username, -                                                              Settings::values.yuzu_token); -    } else { -        backend = std::make_unique<Telemetry::NullVisitor>(); -    } +    backend = std::make_unique<WebService::TelemetryJson>( +        Settings::values.web_api_url, Settings::values.yuzu_username, Settings::values.yuzu_token);  #else      backend = std::make_unique<Telemetry::NullVisitor>();  #endif @@ -180,7 +175,8 @@ TelemetrySession::~TelemetrySession() {      // This is just a placeholder to wrap up the session once the core completes and this is      // destroyed. This will be moved elsewhere once we are actually doing real I/O with the service.      field_collection.Accept(*backend); -    backend->Complete(); +    if (Settings::values.enable_telemetry) +        backend->Complete();      backend = nullptr;  } | 
