aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/process.h
AgeCommit message (Collapse)Author
2019-07-18Merge pull request #2687 from lioncash/tls-processbunnei
kernel/process: Allocate the process' TLS region during initialization
2019-07-07address review commentaryMichael Scire
2019-07-07Implement MapPhysicalMemory/UnmapPhysicalMemoryMichael Scire
This implements svcMapPhysicalMemory/svcUnmapPhysicalMemory for Yuzu, which can be used to map memory at a desired address by games since 3.0.0. It also properly parses SystemResourceSize from NPDM, and makes information available via svcGetInfo. This is needed for games like Super Smash Bros. and Diablo 3 -- this PR's implementation does not run into the "ASCII reads" issue mentioned in the comments of #2626, which was caused by the following bugs in Yuzu's memory management that this PR also addresses: * Yuzu's memory coalescing does not properly merge blocks. This results in a polluted address space/svcQueryMemory results that would be impossible to replicate on hardware, which can lead to game code making the wrong assumptions about memory layout. * This implements better merging for AllocatedMemoryBlocks. * Yuzu's implementation of svcMirrorMemory unprotected the entire virtual memory range containing the range being mirrored. This could lead to games attempting to map data at that unprotected range/attempting to access that range after yuzu improperly unmapped it. * This PR fixes it by simply calling ReprotectRange instead of Reprotect.
2019-07-07kernel/process: Allocate the process' TLS region during initializationLioncash
Prior to execution within a process beginning, the process establishes its own TLS region for uses (as far as I can tell) related to exception handling. Now that TLS creation was decoupled from threads themselves, we can add this behavior to our Process class. This is also good, as it allows us to remove a stub within svcGetInfo, namely querying the address of that region.
2019-07-07kernel/process: Move main thread stack allocation to its own functionLioncash
Keeps this particular set of behavior isolated to its own function.
2019-07-03kernel/process: Default initialize all member variablesLioncash
Ensures a Process instance is always created with a deterministic initial state.
2019-07-03kernel/process: Decouple TLS handling from threadsLioncash
Extracts out all of the thread local storage management from thread instances themselves and makes the owning process handle the management of the memory. This brings the memory management slightly more in line with how the kernel handles these allocations. Furthermore, this also makes the TLS page management a little more readable compared to the lingering implementation that was carried over from Citra.
2019-06-10kernel: Differentiate kernel and user processes when picking IDZach Hilman
This allows kernel internal type processes to be assigned IDs in the KIP range while userland processes are assigned in the user range.
2019-06-09Merge pull request #2571 from lioncash/refZach Hilman
kernel/process: Make Create()'s name parameter be taken by value
2019-06-09kernel/process: Make Create()'s name parameter be taken by valueLioncash
Makes the interface more flexible in terms of how Create() may be called, while still allowing the parameter itself to be moved into.
2019-06-09kernel/svc: Implement ↵Lioncash
TotalMemoryUsedWithoutMmHeap/TotalMemoryAvailableWithoutMmHeap Given we don't currently implement the personal heap yet, the existing memory querying functions are essentially doing what the memory querying types introduced in 6.0.0 do. So, we can build the necessary machinery over the top of those and just use them as part of info types.
2019-06-05kernel/process: Remove unused boost header includeLioncash
Boost headers typically include a lot of other headers, so removing this can prevent a bit of unnecessary compiler churn when building.
2019-04-11core/core: Move process execution start to System's Load()Lioncash
This gives us significantly more control over where in the initialization process we start execution of the main process. Previously we were running the main process before the CPU or GPU threads were initialized (not good). This amends execution to start after all of our threads are properly set up.
2019-04-11kernel: Make handle type declarations constexprLioncash
Some objects declare their handle type as const, while others declare it as constexpr. This makes the const ones constexpr for consistency, and prevent unexpected compilation errors if these happen to be attempted to be used within a constexpr context.
2019-04-03Merge pull request #2314 from lioncash/constbunnei
kernel/thread: Minor interface cleanup
2019-04-02kernel/svc: Implement svcGetThreadListLioncash
Similarly like svcGetProcessList, this retrieves the list of threads from the current process. In the kernel itself, a process instance maintains a list of threads, which are used within this function. Threads are registered to a process' thread list at thread initialization, and unregistered from the list upon thread destruction (if said thread has a non-null owning process). We assert on the debug event case, as we currently don't implement kernel debug objects.
2019-04-01kernel/wait_object: Make ShouldWait() take thread members by pointer-to-constLioncash
Given this is intended as a querying function, it doesn't make sense to allow the implementer to modify the state of the given thread.
2019-03-28kernel/process: Report total physical memory used to svcGetInfoLioncash
Reports the (mostly) correct size through svcGetInfo now for queries to total used physical memory. This still doesn't correctly handle memory allocated via svcMapPhysicalMemory, however, we don't currently handle that case anyways.
2019-03-28kernel/process: Store the total size of the code memory loadedLioncash
This will be necessary to properly report the used memory size in svcGetInfo.
2019-03-28kernel/process: Store the main thread stack size to a data memberLioncash
This will be necessary in order to properly report memory usage within svcGetInfo.
2019-03-28kernel/process: Make Run's stack size parameter a u64Lioncash
This will make operating with the process-related SVC commands much nicer in the future (the parameter representing the stack size in svcStartProcess is a 64-bit value).
2019-03-24kernel/process: Remove unused AddressMapping structLioncash
Another leftover from citra that's now no longer necessary.
2019-03-21Merge pull request #2234 from lioncash/mutexbunnei
core/hle/kernel: Make Mutex a per-process class.
2019-03-20kernel: Move CodeSet structure to its own source filesLioncash
Given this is utilized by the loaders, this allows avoiding inclusion of the kernel process definitions where avoidable. This also keeps the loading format for all executable data separate from the kernel objects.
2019-03-14core/hle/kernel: Make Mutex a per-process class.Lioncash
Makes it an instantiable class like it is in the actual kernel. This will also allow removing reliance on global accessors in a following change, now that we can encapsulate a reference to the system instance in the class.
2019-03-12kernel/process: Remove use of global system accessorsLioncash
Now that we pass in a reference to the system instance, we can utilize it to eliminate the global accessors in Process-related code.
2019-03-07kernel: Make the address arbiter instance per-processLioncash
Now that we have the address arbiter extracted to its own class, we can fix an innaccuracy with the kernel. Said inaccuracy being that there isn't only one address arbiter. Each process instance contains its own AddressArbiter instance in the actual kernel. This fixes that and gets rid of another long-standing issue that could arise when attempting to create more than one process.
2018-12-31core/kernel: Remove unnecessary inclusionsLioncash
Gets rid of a few unnecessary header dependencies in some source files.
2018-12-30kernel/process: Rename GetAllowedProcessorMask() and ↵Lioncash
GetAllowedThreadPriorityMask() Makes them consistent with their kernel capability counterparts.
2018-12-30Merge pull request #1956 from lioncash/process-threadSebastian Valle
kernel/process: Start the main thread using the specified ideal core
2018-12-27kernel: Rename 'default' CPU core to 'ideal' coreLioncash
This makes the naming more closely match its meaning. It's just a preferred core, not a required default core. This also makes the usages of this term consistent across the thread and process implementations.
2018-12-27kernel/process: Remove most allocation functions from Process' interfaceLioncash
In all cases that these functions are needed, the VMManager can just be retrieved and used instead of providing the same functions in Process' interface. This also makes it a little nicer dependency-wise, since it gets rid of cases where the VMManager interface was being used, and then switched over to using the interface for a Process instance. Instead, it makes all accesses uniform and uses the VMManager instance for all necessary tasks. All the basic memory mapping functions did was forward to the Process' VMManager instance anyways.
2018-12-27Merge pull request #1928 from lioncash/capsbunnei
kernel: Handle kernel capability descriptors
2018-12-21kernel/process: Hook up the process capability parser to the process itselfLioncash
While we're at it, we can also toss out the leftover capability parsing from Citra.
2018-12-18kernel/kernel: Use correct initial PID for userland Process instancesLioncash
Starts the process ID counter off at 81, which is what the kernel itself checks against internally when creating processes. It's actually supposed to panic if the PID is less than 81 for a userland process.
2018-12-18kernel/process: Make process_id a 64-bit valueLioncash
In the actual kernel, this is a 64-bit value, so we shouldn't be using a 32-bit type to handle it.
2018-12-12vm_manager: Amend MemoryState enum membersLioncash
Amends the MemoryState enum to use the same values like the actual kernel does. Also provides the necessary operators to operate on them. This will be necessary in the future for implementing svcSetMemoryAttribute, as memory block state is checked before applying the attribute.
2018-12-04kernel/process: Make Process a WaitObjectLioncash
Process instances can be waited upon for state changes. This is also utilized by svcResetSignal, which will be modified in an upcoming change. This simply puts all of the WaitObject related machinery in place.
2018-12-04kernel/svc: Implement the resource limit svcGetInfo optionLioncash
Allows a process to register the resource limit as part of its handle table.
2018-11-20kernel/process: Move <random> include to the cpp fileLioncash
<random> isn't necesary directly within the header and can be placed in the cpp file where its needed. Avoids propagating random generation utilities via a header file.
2018-11-15process: Make MirrorMemory take state to map new memory asZach Hilman
Credits to Subv
2018-11-14Merge pull request #1679 from DarkLordZach/deterministic-rng-2bunnei
svc: Use proper random entropy generation algorithm
2018-11-13kernel/process: Migrate heap-related memory management out of the process ↵Lioncash
class and into the vm manager Avoids a breach of responsibilities in the interface and keeps the direct code for memory management within the VMManager class.
2018-11-13svc: Use proper random entropy generation algorithmZach Hilman
2018-10-26svc: Implement svcGetInfo command 0xF0000002Lioncash
This retrieves: if (curr_thread == handle_thread) { result = total_thread_ticks + (hardware_tick_count - last_context_switch_ticks); } else if (curr_thread == handle_thread && sub_id == current_core_index) { result = hardware_tick_count - last_context_switch_ticks; }
2018-10-20kernel/process: Make the handle table per-processLioncash
In the kernel, there isn't a singular handle table that everything gets tossed into or used, rather, each process gets its own handle table that it uses. This currently isn't an issue for us, since we only execute one process at the moment, but we may as well get this out of the way so it's not a headache later on.
2018-10-13svc: Implement svcGetProcessInfoLioncash
A fairly basic service function, which only appears to currently support retrieving the process state. This also alters the ProcessStatus enum to contain all of the values that a kernel process seems to be able of reporting with regards to state.
2018-10-12kernel/process: Make CodeSet a regular non-inherited objectLioncash
These only exist to ferry data into a Process instance and end up going out of scope quite early. Because of this, we can just make it a plain struct for holding things and just std::move it into the relevant function. There's no need to make this inherit from the kernel's Object type.
2018-09-30kernel/process: Add a data member to determine if a process is 64-bit or not.Lioncash
This will be necessary for the implementation of svcGetThreadContext(), as the kernel checks whether or not the process that owns the thread that has it context being retrieved is a 64-bit or 32-bit process. If the process is 32-bit, then the upper 15 general-purpose registers and upper 16 vector registers are cleared to zero (as AArch32 only has 15 GPRs and 16 128-bit vector registers. not 31 general-purpose registers and 32 128-bit vector registers like AArch64).
2018-09-30kernel/process: Make data member variables privateLioncash
Makes the public interface consistent in terms of how accesses are done on a process object. It also makes it slightly nicer to reason about the logic of the process class, as we don't want to expose everything to external code.