summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGPUCode <geoster3d@gmail.com>2023-11-19 10:21:53 +0100
committert895 <clombardo169@gmail.com>2023-11-25 06:47:35 +0100
commit6de2edcca1624982e99a72741d4fa289dc9d7551 (patch)
tree8c355b39a6f71e333ccc2f929816ce96e40d3f2c /src
parentandroid: Add cpu bakend gui toggle (diff)
downloadyuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.tar
yuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.tar.gz
yuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.tar.bz2
yuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.tar.lz
yuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.tar.xz
yuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.tar.zst
yuzu-6de2edcca1624982e99a72741d4fa289dc9d7551.zip
Diffstat (limited to 'src')
-rw-r--r--src/common/host_memory.cpp3
-rw-r--r--src/common/settings.h2
-rw-r--r--src/common/signal_chain.h4
-rw-r--r--src/core/arm/nce/arm_nce.cpp5
-rw-r--r--src/core/arm/nce/patch.cpp5
-rw-r--r--src/core/arm/nce/patch.h16
-rw-r--r--src/core/core.cpp1
-rw-r--r--src/core/hle/kernel/k_page_table_base.cpp2
-rw-r--r--src/core/hle/kernel/k_process.h4
-rw-r--r--src/core/loader/nro.cpp6
-rw-r--r--src/core/loader/nso.cpp15
11 files changed, 29 insertions, 34 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp
index 8a869e558..f14077750 100644
--- a/src/common/host_memory.cpp
+++ b/src/common/host_memory.cpp
@@ -409,11 +409,14 @@ static void* ChooseVirtualBase(size_t virtual_size) {
return MAP_FAILED;
}
+
#else
+
static void* ChooseVirtualBase(size_t virtual_size) {
return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
}
+
#endif
class HostMemory::Impl {
diff --git a/src/common/settings.h b/src/common/settings.h
index 648e0be0d..fea639ee3 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -181,7 +181,7 @@ struct Values {
// Cpu
SwitchableSetting<CpuBackend, true> cpu_backend{
- linkage, CpuBackend::Nce, CpuBackend::Dynarmic,
+ linkage, CpuBackend::Dynarmic, CpuBackend::Dynarmic,
#ifdef ARCHITECTURE_arm64
CpuBackend::Nce,
#else
diff --git a/src/common/signal_chain.h b/src/common/signal_chain.h
index e3bfe6882..8d06a1bd1 100644
--- a/src/common/signal_chain.h
+++ b/src/common/signal_chain.h
@@ -10,8 +10,8 @@
namespace Common {
// Android's ART overrides sigaction with its own wrapper. This is problematic for SIGSEGV
-// in particular, because ARTs handler access TPIDR_EL0, so this extracts the libc version
-// and calls it directly.
+// in particular, because ART's handler accesses tpidr_el0, which conflicts with NCE.
+// This extracts the libc symbol and calls it directly.
int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact);
} // namespace Common
diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp
index 511248a0d..fd82f3b0e 100644
--- a/src/core/arm/nce/arm_nce.cpp
+++ b/src/core/arm/nce/arm_nce.cpp
@@ -4,7 +4,6 @@
#include <cinttypes>
#include <memory>
-#include "common/scope_exit.h"
#include "common/signal_chain.h"
#include "core/arm/nce/arm_nce.h"
#include "core/arm/nce/patch.h"
@@ -32,7 +31,7 @@ static_assert(offsetof(NativeExecutionParameters, magic) == TpidrEl0TlsMagic);
fpsimd_context* GetFloatingPointState(mcontext_t& host_ctx) {
_aarch64_ctx* header = reinterpret_cast<_aarch64_ctx*>(&host_ctx.__reserved);
while (header->magic != FPSIMD_MAGIC) {
- header = reinterpret_cast<_aarch64_ctx*>((char*)header + header->size);
+ header = reinterpret_cast<_aarch64_ctx*>(reinterpret_cast<char*>(header) + header->size);
}
return reinterpret_cast<fpsimd_context*>(header);
}
@@ -124,7 +123,7 @@ bool ARM_NCE::HandleGuestFault(GuestContext* guest_ctx, void* raw_info, void* ra
// Forcibly mark the context as locked. We are still running.
// We may race with SignalInterrupt here:
- // - If we lose the race, then SignalInterrupt will send us a signal which are masking,
+ // - If we lose the race, then SignalInterrupt will send us a signal we are masking,
// and it will do nothing when it is unmasked, as we have already left guest code.
// - If we win the race, then SignalInterrupt will wait for us to unlock first.
auto& thread_params = guest_ctx->parent->running_thread->GetNativeExecutionParameters();
diff --git a/src/core/arm/nce/patch.cpp b/src/core/arm/nce/patch.cpp
index c79399c2b..bc4b73634 100644
--- a/src/core/arm/nce/patch.cpp
+++ b/src/core/arm/nce/patch.cpp
@@ -100,7 +100,7 @@ void Patcher::RelocateAndCopy(Common::ProcessAddress load_base,
const Kernel::CodeSet::Segment& code,
Kernel::PhysicalMemory& program_image,
EntryTrampolines* out_trampolines) {
- const size_t patch_size = SectionSize();
+ const size_t patch_size = GetSectionSize();
const size_t image_size = program_image.size();
// Retrieve text segment data.
@@ -180,7 +180,7 @@ void Patcher::RelocateAndCopy(Common::ProcessAddress load_base,
}
}
-size_t Patcher::SectionSize() const noexcept {
+size_t Patcher::GetSectionSize() const noexcept {
return Common::AlignUp(m_patch_instructions.size() * sizeof(u32), Core::Memory::YUZU_PAGESIZE);
}
@@ -256,7 +256,6 @@ void Patcher::WriteSaveContext() {
}
void Patcher::WriteSvcTrampoline(ModuleDestLabel module_dest, u32 svc_id) {
- LOG_ERROR(Core_ARM, "Patching SVC {:#x} at {:#x}", svc_id, module_dest - 4);
// We are about to start saving state, so we need to lock the context.
this->LockContext();
diff --git a/src/core/arm/nce/patch.h b/src/core/arm/nce/patch.h
index b727d4e48..dcce1bfc6 100644
--- a/src/core/arm/nce/patch.h
+++ b/src/core/arm/nce/patch.h
@@ -7,23 +7,17 @@
#include <unordered_map>
#include <vector>
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wshorten-64-to-32"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshorten-64-to-32"
#include <oaknut/code_block.hpp>
#include <oaknut/oaknut.hpp>
-#pragma clang diagnostic pop
+#pragma GCC diagnostic pop
#include "common/common_types.h"
#include "core/hle/kernel/code_set.h"
#include "core/hle/kernel/k_typed_address.h"
#include "core/hle/kernel/physical_memory.h"
-#include <signal.h>
-
-namespace Core {
-struct GuestContext;
-}
-
namespace Core::NCE {
enum class PatchMode : u32 {
@@ -45,9 +39,9 @@ public:
const Kernel::CodeSet::Segment& code);
void RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code,
Kernel::PhysicalMemory& program_image, EntryTrampolines* out_trampolines);
- size_t SectionSize() const noexcept;
+ size_t GetSectionSize() const noexcept;
- [[nodiscard]] PatchMode Mode() const noexcept {
+ [[nodiscard]] PatchMode GetPatchMode() const noexcept {
return mode;
}
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 408479019..14d6c8c27 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -137,6 +137,7 @@ struct System::Impl {
void Initialize(System& system) {
device_memory = std::make_unique<Core::DeviceMemory>();
+
is_multicore = Settings::values.use_multi_core.GetValue();
extended_memory_layout =
Settings::values.memory_layout_mode.GetValue() != Settings::MemoryLayout::Memory_4Gb;
diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp
index f2ffc39c1..f7f1e8a3b 100644
--- a/src/core/hle/kernel/k_page_table_base.cpp
+++ b/src/core/hle/kernel/k_page_table_base.cpp
@@ -96,9 +96,11 @@ constexpr Common::MemoryPermission ConvertToMemoryPermission(KMemoryPermission p
if (True(perm & KMemoryPermission::UserWrite)) {
perms |= Common::MemoryPermission::Write;
}
+#ifdef ARCHITECTURE_arm64
if (True(perm & KMemoryPermission::UserExecute)) {
perms |= Common::MemoryPermission::Execute;
}
+#endif
return perms;
}
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h
index 7b97d452b..e5f796ac7 100644
--- a/src/core/hle/kernel/k_process.h
+++ b/src/core/hle/kernel/k_process.h
@@ -472,10 +472,6 @@ public:
return m_post_handlers;
}
- KernelCore& GetKernel() noexcept {
- return m_kernel;
- }
-
public:
// Attempts to insert a watchpoint into a free slot. Returns false if none are available.
bool InsertWatchpoint(KProcessAddress addr, u64 size, DebugWatchpointType type);
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 76ff38041..49d4d7e43 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -204,7 +204,7 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process,
#ifdef ARCHITECTURE_arm64
const auto& code = codeset.CodeSegment();
- // NROs are always 64-bit programs.
+ // NROs always have a 39-bit address space.
Settings::SetNceEnabled(true);
// Create NCE patcher
@@ -215,12 +215,12 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process,
patch.PatchText(program_image, code);
// We only support PostData patching for NROs.
- ASSERT(patch.Mode() == Core::NCE::PatchMode::PostData);
+ ASSERT(patch.GetPatchMode() == Core::NCE::PatchMode::PostData);
// Update patch section.
auto& patch_segment = codeset.PatchSegment();
patch_segment.addr = image_size;
- patch_segment.size = static_cast<u32>(patch.SectionSize());
+ patch_segment.size = static_cast<u32>(patch.GetSectionSize());
// Add patch section size to the module size.
image_size += patch_segment.size;
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 34b10ef2e..1ad2e917c 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -94,8 +94,8 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core::
// Allocate some space at the beginning if we are patching in PreText mode.
const size_t module_start = [&]() -> size_t {
#ifdef ARCHITECTURE_arm64
- if (patch && patch->Mode() == Core::NCE::PatchMode::PreText) {
- return patch->SectionSize();
+ if (patch && patch->GetPatchMode() == Core::NCE::PatchMode::PreText) {
+ return patch->GetSectionSize();
}
#endif
return 0;
@@ -158,24 +158,25 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core::
#ifdef ARCHITECTURE_arm64
// If we are computing the process code layout and using nce backend, patch.
const auto& code = codeset.CodeSegment();
- if (patch && patch->Mode() == Core::NCE::PatchMode::None) {
+ if (patch && patch->GetPatchMode() == Core::NCE::PatchMode::None) {
// Patch SVCs and MRS calls in the guest code
patch->PatchText(program_image, code);
// Add patch section size to the module size.
- image_size += patch->SectionSize();
+ image_size += patch->GetSectionSize();
} else if (patch) {
// Relocate code patch and copy to the program_image.
patch->RelocateAndCopy(load_base, code, program_image, &process.GetPostHandlers());
// Update patch section.
auto& patch_segment = codeset.PatchSegment();
- patch_segment.addr = patch->Mode() == Core::NCE::PatchMode::PreText ? 0 : image_size;
- patch_segment.size = static_cast<u32>(patch->SectionSize());
+ patch_segment.addr =
+ patch->GetPatchMode() == Core::NCE::PatchMode::PreText ? 0 : image_size;
+ patch_segment.size = static_cast<u32>(patch->GetSectionSize());
// Add patch section size to the module size. In PreText mode image_size
// already contains the patch segment as part of module_start.
- if (patch->Mode() == Core::NCE::PatchMode::PostData) {
+ if (patch->GetPatchMode() == Core::NCE::PatchMode::PostData) {
image_size += patch_segment.size;
}
}