Browse Source

[arm] remove vtable bounce hack

Signed-off-by: lizzie <lizzie@eden-emu.dev>
lizzie 6 days ago
parent
commit
e41e84fab9
  1. 2
      src/common/settings.h
  2. 16
      src/core/hle/kernel/physical_core.cpp
  3. 4
      src/qt_common/config/shared_translation.cpp
  4. 4
      src/yuzu/configuration/configure_cpu.cpp

2
src/common/settings.h

@ -287,8 +287,6 @@ struct Values {
true, true,
&use_custom_cpu_ticks}; &use_custom_cpu_ticks};
SwitchableSetting<bool> vtable_bouncing{linkage, true, "vtable_bouncing", Category::Cpu};
Setting<bool> cpuopt_page_tables{linkage, true, "cpuopt_page_tables", Category::CpuDebug}; Setting<bool> cpuopt_page_tables{linkage, true, "cpuopt_page_tables", Category::CpuDebug};
Setting<bool> cpuopt_block_linking{linkage, true, "cpuopt_block_linking", Category::CpuDebug}; Setting<bool> cpuopt_block_linking{linkage, true, "cpuopt_block_linking", Category::CpuDebug};
Setting<bool> cpuopt_return_stack_buffer{linkage, true, "cpuopt_return_stack_buffer", Setting<bool> cpuopt_return_stack_buffer{linkage, true, "cpuopt_return_stack_buffer",

16
src/core/hle/kernel/physical_core.cpp

@ -103,26 +103,12 @@ void PhysicalCore::RunThread(Kernel::KThread* thread) {
const bool data_abort = True(hr & Core::HaltReason::DataAbort); const bool data_abort = True(hr & Core::HaltReason::DataAbort);
const bool interrupt = True(hr & Core::HaltReason::BreakLoop); const bool interrupt = True(hr & Core::HaltReason::BreakLoop);
bool may_abort = true; // Ignore aborting virtual functions (for debugging)
if (prefetch_abort && ::Settings::values.vtable_bouncing) {
auto& lock = m_kernel.GlobalSchedulerContext().SchedulerLock();
lock.Lock();
Kernel::Svc::ThreadContext ctx;
interface->GetContext(ctx);
LOG_WARNING(Core_ARM, "vtable bouncing {:016X}", ctx.lr);
ctx.pc = ctx.lr;
ctx.r[0] = 0;
interface->SetContext(ctx);
lock.Unlock();
may_abort = false;
}
// Since scheduling may occur here, we cannot use any cached // Since scheduling may occur here, we cannot use any cached
// state after returning from calls we make. // state after returning from calls we make.
// Notify the debugger and go to sleep if a breakpoint was hit, // Notify the debugger and go to sleep if a breakpoint was hit,
// or if the thread is unable to continue for any reason. // or if the thread is unable to continue for any reason.
if (breakpoint || (prefetch_abort && may_abort)) {
if (breakpoint || prefetch_abort) {
if (breakpoint) { if (breakpoint) {
interface->RewindBreakpointInstruction(); interface->RewindBreakpointInstruction();
} }

4
src/qt_common/config/shared_translation.cpp

@ -105,10 +105,6 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
"cause deadlocks. A range of 77-21000 is recommended.")); "cause deadlocks. A range of 77-21000 is recommended."));
INSERT(Settings, cpu_backend, tr("Backend:"), QString()); INSERT(Settings, cpu_backend, tr("Backend:"), QString());
INSERT(Settings, vtable_bouncing, tr("Virtual Table Bouncing"),
tr("Bounces (by emulating a 0-valued return) any functions that triggers a prefetch "
"abort"));
// Cpu Debug // Cpu Debug
// Cpu Unsafe // Cpu Unsafe

4
src/yuzu/configuration/configure_cpu.cpp

@ -76,9 +76,7 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) {
} else if (setting->Id() == Settings::values.cpu_backend.Id()) { } else if (setting->Id() == Settings::values.cpu_backend.Id()) {
backend_layout->addWidget(widget); backend_layout->addWidget(widget);
backend_combobox = widget->combobox; backend_combobox = widget->combobox;
} else if (setting->Id() == Settings::values.fast_cpu_time.Id() ||
setting->Id() == Settings::values.vtable_bouncing.Id() ||
setting->Id() == Settings::values.cpu_ticks.Id()) {
} else if (setting->Id() == Settings::values.fast_cpu_time.Id() || setting->Id() == Settings::values.cpu_ticks.Id()) {
ui->general_layout->addWidget(widget); ui->general_layout->addWidget(widget);
} else { } else {
// Presently, all other settings here are unsafe checkboxes // Presently, all other settings here are unsafe checkboxes

Loading…
Cancel
Save