* Memory: Rework FCRAM management entirely Disables a lot of functionality... but I didn't want to commit too much to this commit Also reworks virtual memory management somewhat (but needs more work) * Accurately handle MemoryState for virtual memory Previously all non-free blocks were marked as Reserved * Memory: Consolidate state and permission changes Can now use a single function to change either state, permissions, or both Also merge vmem blocks that have the same state and permissions * Memory: Fix double reset for FCRAM manager Fix minor bug with permission tracking * Memory: Implement Protect operation in ControlMemory * Memory: Implement Unmap in ControlMemory Also do a sanity check to make sure the memory region is free for linear allocations * Memory: Make TLS only 0x200 bytes for each thread Also move TLS to Base region * RO: Unmap CROs when unloaded Thanks @noumidev * Kernel: Return used app memory for Commit ResourceLimit Not quite correct, but nothing to be done until process management is improved Also remove the stack limit for CXIs (thanks amogus) * Kernel: Report used app memory for GetProcessInfo 2 Not really correct, but it should be accurate for applications at least * Formatting changes * Initial fastmem support * PCSX2 fastmem depression * Move away from PCSX2 fastmem * Add enum_flag_ops.hpp * Finally building on Windows * Almost got a PoC * Fix arm64 builds * This somehow works * This also works... * Properly fix fastmem * Add free region manager * Update boost * Add ScopeExit * Comment out asserts on Linux/Mac/Android * Comment out ASSERT_MSG asserts too * Fix derp * Attempt to fix Android * Disable fastmem on Android * Fix Android again maybe pt 2 * android pls * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * Update host_memory.cpp * Properly reset memory arena on reset * Proper ashmem code for Android * more * Add temporary Android buildjet script for faster prototype builds * Fix fastmem (again) * Clean up shared memory * Remove Android BuildJet runner * a * Revert "a" This reverts commit 5443ad6f2a794c19c9b1a1567ca1c7f58eed78cd. * Re-add ELF support * Re-add 3DSX support * GetSystemInfo, GetProcessInfo: Memory sizes should be in bytes * Update Boost * Update metal-cpp * Fix metal renderer compilation * Fix fastmem mapping * Clean up fastmem code * Fix oopsie again * Emulator: Reorder struct * Kernel types: Cleanup * Cleanup * More cleanup * Make invalid mprotects warn instead of panicking * Add setting for toggling fastmem * More cleanup * Properly initialize BSS to zeroes * Remove unused code * Formatting * Cleanup * Memory/CRO: Workaround for Pokemon XY * NCSD loader: Fix BSS (again) * NCSD loader: Fix BSS (again) (again) * More memory fixes * Memory: Remove unused code * FS: Warn on unimplemented functions instead of panic * Update software_keyboard.cpp * Libretro: Add fastmem option * FRD: Stub SaveLocalAccountData --------- Co-authored-by: PSI-Rockin <PSI-Rockin@users.noreply.github.com>
65 lines
1.9 KiB
C++
65 lines
1.9 KiB
C++
#ifdef CPU_DYNARMIC
|
|
#include "cpu_dynarmic.hpp"
|
|
|
|
#include "arm_defs.hpp"
|
|
#include "emulator.hpp"
|
|
|
|
CPU::CPU(Memory& mem, Kernel& kernel, Emulator& emu) : mem(mem), emu(emu), scheduler(emu.getScheduler()), env(mem, kernel, emu.getScheduler()) {
|
|
cp15 = std::make_shared<CP15>();
|
|
mem.setCPUTicks(getTicksRef());
|
|
|
|
Dynarmic::A32::UserConfig config;
|
|
config.arch_version = Dynarmic::A32::ArchVersion::v6K;
|
|
config.callbacks = &env;
|
|
config.coprocessors[15] = cp15;
|
|
config.define_unpredictable_behaviour = true;
|
|
config.global_monitor = &exclusiveMonitor;
|
|
config.processor_id = 0;
|
|
|
|
if (mem.isFastmemEnabled()) {
|
|
config.fastmem_pointer = u64(mem.getFastmemArenaBase());
|
|
} else {
|
|
config.fastmem_pointer = std::nullopt;
|
|
}
|
|
|
|
jit = std::make_unique<Dynarmic::A32::Jit>(config);
|
|
}
|
|
|
|
void CPU::reset() {
|
|
setCPSR(CPSR::UserMode);
|
|
setFPSCR(FPSCR::MainThreadDefault);
|
|
|
|
cp15->reset();
|
|
cp15->setTLSBase(VirtualAddrs::TLSBase); // Set cp15 TLS pointer to the main thread's thread-local storage
|
|
jit->Reset();
|
|
jit->ClearCache();
|
|
jit->Regs().fill(0);
|
|
jit->ExtRegs().fill(0);
|
|
}
|
|
|
|
void CPU::runFrame() {
|
|
emu.frameDone = false;
|
|
|
|
while (!emu.frameDone) {
|
|
// Run CPU until the next scheduler event
|
|
env.ticksLeft = scheduler.nextTimestamp - scheduler.currentTimestamp;
|
|
|
|
execute:
|
|
const auto exitReason = jit->Run();
|
|
|
|
// Handle any scheduler events that need handling.
|
|
emu.pollScheduler();
|
|
|
|
if (static_cast<u32>(exitReason) != 0) [[unlikely]] {
|
|
// Cache invalidation needs to exit the JIT so it returns a CacheInvalidation HaltReason. In our case, we just go back to executing
|
|
// The goto might be terrible but it does guarantee that this does not recursively call run and crash, instead getting optimized to a jump
|
|
if (Dynarmic::Has(exitReason, Dynarmic::HaltReason::CacheInvalidation)) {
|
|
goto execute;
|
|
} else {
|
|
Helpers::panic("Exit reason: %d\nPC: %08X", static_cast<u32>(exitReason), getReg(15));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif // CPU_DYNARMIC
|