aboutsummaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* General: Recover Prometheus project from harddrive failure Fernando Sahmkow2020-06-271-7/+4
| | | | | | | This commit: Implements CPU Interrupts, Replaces Cycle Timing for Host Timing, Reworks the Kernel's Scheduler, Introduce Idle State and Suspended State, Recreates the bootmanager, Initializes Multicore system.
* core: memory: Fix memory access on page boundaries.bunnei2020-04-171-6/+39
| | | | - Fixes Super Smash Bros. Ultimate.
* core: memory: Updates for new VMM.bunnei2020-04-171-100/+52
|
* core: memory: Move to Core::Memory namespace.bunnei2020-04-171-2/+2
| | | | - helpful to disambiguate Kernel::Memory namespace.
* Buffer Cache: Use vAddr instead of physical memory.Fernando Sahmkow2020-04-061-0/+115
|
* GPU: Setup Flush/Invalidate to use VAddr instead of CacheAddrFernando Sahmkow2020-04-061-6/+6
|
* core/memory: Create a special MapMemoryRegion for physical memory.Markus Wick2020-01-181-0/+11
| | | | This allows us to create a fastmem arena within the memory.cpp helpers.
* core/memory + arm/dynarmic: Use a global offset within our arm page table.Markus Wick2020-01-011-9/+16
| | | | | | This saves us two x64 instructions per load/store instruction. TODO: Clean up our memory code. We can use this optimization here as well.
* core/memory; Migrate over SetCurrentPageTable() to the Memory classLioncash2019-11-261-15/+16
| | | | | | | Now that literally every other API function is converted over to the Memory class, we can just move the file-local page table into the Memory implementation class, finally getting rid of global state within the memory code.
* core/memory: Migrate over GetPointerFromVMA() to the Memory classLioncash2019-11-261-36/+36
| | | | | | | | Now that everything else is migrated over, this is essentially just code relocation and conversion of a global accessor to the class member variable. All that remains is to migrate over the page table.
* core/memory: Migrate over Write{8, 16, 32, 64, Block} to the Memory classLioncash2019-11-261-92/+128
| | | | | | | | | The Write functions are used slightly less than the Read functions, which make these a bit nicer to move over. The only adjustments we really need to make here are to Dynarmic's exclusive monitor instance. We need to keep a reference to the currently active memory instance to perform exclusive read/write operations.
* core/memory: Migrate over Read{8, 16, 32, 64, Block} to the Memory classLioncash2019-11-261-96/+132
| | | | | | | | | | | | | | With all of the trivial parts of the memory interface moved over, we can get right into moving over the bits that are used. Note that this does require the use of GetInstance from the global system instance to be used within hle_ipc.cpp and the gdbstub. This is fine for the time being, as they both already rely on the global system instance in other functions. These will be removed in a change directed at both of these respectively. For now, it's sufficient, as it still accomplishes the goal of de-globalizing the memory code.
* core/memory: Migrate over ZeroBlock() and CopyBlock() to the Memory classLioncash2019-11-261-89/+110
| | | | | These currently aren't used anywhere in the codebase, so these are very trivial to move over to the Memory class.
* core/memory: Migrate over RasterizerMarkRegionCached() to the Memory classLioncash2019-11-261-63/+67
| | | | | This is only used within the accelerated rasterizer in two places, so this is also a very trivial migration.
* core/memory: Migrate over ReadCString() to the Memory classLioncash2019-11-261-14/+19
| | | | | This only had one usage spot, so this is fairly straightforward to convert over.
* core/memory: Migrate over GetPointer()Lioncash2019-11-261-15/+23
| | | | | With all of the interfaces ready for migration, it's trivial to migrate over GetPointer().
* core/memory: Move memory read/write implementation functions into an ↵Lioncash2019-11-261-97/+98
| | | | | | | | anonymous namespace These will eventually be migrated into the main Memory class, but for now, we put them in an anonymous namespace, so that the other functions that use them, can be migrated over separately.
* core/memory: Migrate over address checking functions to the new Memory classLioncash2019-11-261-20/+31
| | | | | | | | | A fairly straightforward migration. These member functions can just be mostly moved verbatim with minor changes. We already have the necessary plumbing in places that they're used. IsKernelVirtualAddress() can remain a non-member function, since it doesn't rely on class state in any form.
* core/memory: Migrate over memory mapping functions to the new Memory classLioncash2019-11-261-71/+106
| | | | | | Migrates all of the direct mapping facilities over to the new memory class. In the process, this also obsoletes the need for memory_setup.h, so we can remove it entirely from the project.
* core/memory: Introduce skeleton of Memory classLioncash2019-11-261-0/+12
| | | | | | | | | Currently, the main memory management code is one of the remaining places where we have global state. The next series of changes will aim to rectify this. This change simply introduces the main skeleton of the class that will contain all the necessary state.
* core: Remove Core::CurrentProcess()Lioncash2019-10-061-5/+5
| | | | | | This only encourages the use of the global system instance (which will be phased out long-term). Instead, we use the direct system function call directly to remove the appealing but discouraged short-hand.
* Core/Memory: Only FlushAndInvalidate GPU if the page is marked as ↵Fernando Sahmkow2019-09-181-2/+7
| | | | | | | RasterizerCachedMemory This commit avoids Invalidating and Flushing the GPU if the page is not marked as a RasterizerCache Page.
* memory: Remove unused includesLioncash2019-07-061-2/+0
| | | | | These aren't used within the central memory management code, so they can be removed.
* core/cpu_core_manager: Create threads separately from initialization.Lioncash2019-04-111-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Our initialization process is a little wonky than one would expect when it comes to code flow. We initialize the CPU last, as opposed to hardware, where the CPU obviously needs to be first, otherwise nothing else would work, and we have code that adds checks to get around this. For example, in the page table setting code, we check to see if the system is turned on before we even notify the CPU instances of a page table switch. This results in dead code (at the moment), because the only time a page table switch will occur is when the system is *not* running, preventing the emulated CPU instances from being notified of a page table switch in a convenient manner (technically the code path could be taken, but we don't emulate the process creation svc handlers yet). This moves the threads creation into its own member function of the core manager and restores a little order (and predictability) to our initialization process. Previously, in the multi-threaded cases, we'd kick off several threads before even the main kernel process was created and ready to execute (gross!). Now the initialization process is like so: Initialization: 1. Timers 2. CPU 3. Kernel 4. Filesystem stuff (kind of gross, but can be amended trivially) 5. Applet stuff (ditto in terms of being kind of gross) 6. Main process (will be moved into the loading step in a following change) 7. Telemetry (this should be initialized last in the future). 8. Services (4 and 5 should ideally be alongside this). 9. GDB (gross. Uses namespace scope state. Needs to be refactored into a class or booted altogether). 10. Renderer 11. GPU (will also have its threads created in a separate step in a following change). Which... isn't *ideal* per-se, however getting rid of the wonky intertwining of CPU state initialization out of this mix gets rid of most of the footguns when it comes to our initialization process.
* core/memory: Remove GetCurrentPageTable()Lioncash2019-04-071-4/+0
| | | | | Now that nothing actually touches the internal page table aside from the memory subsystem itself, we can remove the accessor to it.
* memory: Check that core is powered on before attempting to use GPU.bunnei2019-03-201-1/+1
| | | | | - GPU will be released on shutdown, before pages are unmapped. - On subsequent runs, current_page_table will be not nullptr, but GPU might not be valid yet.
* core: Move PageTable struct into Common.bunnei2019-03-161-74/+60
|
* memory: Simplify rasterizer cache operations.bunnei2019-03-161-60/+21
|
* gpu: Use host address for caching instead of guest address.bunnei2019-03-141-5/+8
|
* gpu: Move command processing to another thread.bunnei2019-03-061-4/+4
|
* Memory: don't lock hle mutex in memory read/writeWeiyi Wang2019-03-021-6/+0
| | | | The comment already invalidates itself: neither MMIO nor rasterizer cache belongsHLE kernel state. This mutex has a too large scope if MMIO or cache is included, which is prone to dead lock when multiple thread acquires these resource at the same time. If necessary, each MMIO component or rasterizer should have their own lock.
* Speed up memory page mapping (#2141)Annomatg2019-02-271-6/+11
| | | | - Memory::MapPages total samplecount was reduced from 4.6% to 1.06%. - From main menu into the game from 1.03% to 0.35%
* Fixed uninitialized memory due to missing returns in canaryDavid Marcec2018-12-191-0/+1
| | | | Functions which are suppose to crash on non canary builds usually don't return anything which lead to uninitialized memory being used.
* memory: Convert ASSERT into a DEBUG_ASSERT within GetPointerFromVMA()Lioncash2018-12-061-1/+1
| | | | | | Given memory should always be expected to be valid during normal execution, this should be a debug assertion, rather than a check in regular builds.
* vm_manager: Make vma_map privateLioncash2018-12-061-6/+5
| | | | | | | | | | | This was only ever public so that code could check whether or not a handle was valid or not. Instead of exposing the object directly and allowing external code to potentially mess with the map contents, we just provide a member function that allows checking whether or not a handle is valid. This makes all member variables of the VMManager class private except for the page table.
* Call shrink_to_fit after page-table vector resizing to cause crt to actually ↵heapo2018-12-051-0/+8
| | | | lower vector capacity. For 36-bit titles saves 800MB of commit.
* global: Use std::optional instead of boost::optional (#1578)Frederic L2018-10-301-1/+1
| | | | | | | | | | | | | | | | * get rid of boost::optional * Remove optional references * Use std::reference_wrapper for optional references * Fix clang format * Fix clang format part 2 * Adressed feedback * Fix clang format and MacOS build
* kernel/process: Make data member variables privateLioncash2018-09-301-7/+7
| | | | | | | 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.
* memory: Dehardcode the use of fixed memory range constantsLioncash2018-09-241-5/+7
| | | | | | | | The locations of these can actually vary depending on the address space layout, so we shouldn't be using these when determining where to map memory or be using them as offsets for calculations. This keeps all the memory ranges flexible and malleable based off of the virtual memory manager instance state.
* memory: Dehardcode the use of a 36-bit address spaceLioncash2018-09-241-2/+16
| | | | | Given games can also request a 32-bit or 39-bit address space, we shouldn't be hardcoding the address space range as 36-bit.
* Port #4182 from Citra: "Prefix all size_t with std::"fearlessTobi2018-09-151-27/+28
|
* gl_renderer: Cache textures, framebuffers, and shaders based on CPU address.bunnei2018-08-311-36/+15
|
* gpu: Make memory_manager privateLioncash2018-08-281-2/+2
| | | | | | | | | | Makes the class interface consistent and provides accessors for obtaining a reference to the memory manager instance. Given we also return references, this makes our more flimsy uses of const apparent, given const doesn't propagate through pointers in the way one would typically expect. This makes our mutable state more apparent in some places.
* renderer_base: Make Rasterizer() return the rasterizer by referenceLioncash2018-08-041-4/+4
| | | | | | | All calling code assumes that the rasterizer will be in a valid state, which is a totally fine assumption. The only way the rasterizer wouldn't be is if initialization is done incorrectly or fails, which is checked against in System::Init().
* video_core: Eliminate the g_renderer global variableLioncash2018-08-041-8/+10
| | | | | | | | | | | | | | We move the initialization of the renderer to the core class, while keeping the creation of it and any other specifics in video_core. This way we can ensure that the renderer is initialized and doesn't give unfettered access to the renderer. This also makes dependencies on types more explicit. For example, the GPU class doesn't need to depend on the existence of a renderer, it only needs to care about whether or not it has a rasterizer, but since it was accessing the global variable, it was also making the renderer a part of its dependency chain. By adjusting the interface, we can get rid of this dependency.
* memory: Remove unused GetSpecialHandlers() functionLioncash2018-08-031-16/+0
| | | | This is just unused code, so we may as well get rid of it.
* core/memory: Get rid of 3DS leftoversLioncash2018-08-031-106/+0
| | | | Removes leftover code from citra that isn't needed.
* Merge pull request #690 from lioncash/movebunnei2018-07-181-3/+5
|\ | | | | core/memory, core/hle/kernel: Use std::move where applicable
| * core/memory, core/hle/kernel: Use std::move where applicableLioncash2018-07-181-3/+5
| | | | | | | | Avoids pointless copies
* | core/memory: Remove unused function GetSpecialHandlers() and an unused ↵Lioncash2018-07-181-7/+0
|/ | | | variable in ZeroBlock()