* 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>
62 lines
2.1 KiB
C++
62 lines
2.1 KiB
C++
#include <cstring>
|
|
|
|
#include "arm_defs.hpp"
|
|
#include "kernel.hpp"
|
|
|
|
/*
|
|
This file sets up an idle thread that's meant to run when no other OS thread can run.
|
|
It simply idles and constantly yields to check if there's any other thread that can run
|
|
The code for our idle thread looks like this
|
|
|
|
idle_thread_main:
|
|
// Sleep for 0 seconds with the SleepThread SVC, which just yields execution
|
|
mov r0, #0
|
|
mov r1, #0
|
|
svc SleepThread
|
|
|
|
b idle_thread_main
|
|
*/
|
|
|
|
using namespace KernelMemoryTypes;
|
|
|
|
static constexpr u8 idleThreadCode[] = {
|
|
0x00, 0x00, 0xA0, 0xE3, // mov r0, #0
|
|
0x00, 0x10, 0xA0, 0xE3, // mov r1, #0
|
|
0x0A, 0x00, 0x00, 0xEF, // svc SleepThread
|
|
0xFB, 0xFF, 0xFF, 0xEA // b idle_thread_main
|
|
};
|
|
|
|
// Set up an idle thread to run when no thread is able to run
|
|
void Kernel::setupIdleThread() {
|
|
Thread& t = threads[idleThreadIndex];
|
|
|
|
// Reserve some memory for the idle thread's code. We map this memory to vaddr 3FC00000 which shouldn't be accessed by applications
|
|
// We only allocate 4KB (1 page) because our idle code is pretty small
|
|
constexpr u32 codeAddress = 0x3FC00000;
|
|
if (!mem.allocMemory(codeAddress, 1, FcramRegion::Base, true, true, false, MemoryState::Locked)) {
|
|
Helpers::panic("Failed to setup idle thread");
|
|
}
|
|
|
|
// Copy idle thread code to the allocated FCRAM
|
|
mem.copyToVaddr(codeAddress, idleThreadCode, sizeof(idleThreadCode));
|
|
|
|
t.entrypoint = codeAddress;
|
|
t.initialSP = 0;
|
|
t.tlsBase = 0;
|
|
t.gprs[13] = 0; // Set SP & LR to 0 just in case. The idle thread should never access memory, but let's be safe
|
|
t.gprs[14] = 0;
|
|
t.gprs[15] = codeAddress;
|
|
t.cpsr = CPSR::UserMode;
|
|
t.fpscr = FPSCR::ThreadDefault;
|
|
|
|
// Our idle thread should have as low of a priority as possible, because, well, it's an idle thread.
|
|
// We handle this by giving it a priority of 0x40, which is lower than is actually allowed for user threads
|
|
// (High priority value = low priority). This is the same priority used in the retail kernel.
|
|
t.priority = 0x40;
|
|
t.status = ThreadStatus::Ready;
|
|
|
|
// Add idle thread to the list of thread indices
|
|
threadIndices.push_back(idleThreadIndex);
|
|
sortThreads();
|
|
}
|