diff options
| author | bunnei <bunneidev@gmail.com> | 2018-03-16 20:06:27 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-03-16 20:06:27 -0400 | 
| commit | e7ba2a4447bb06146f23163e82689852bf83008e (patch) | |
| tree | 7ff83f9d4b4fd4df5f48333d07fb743e3c4531cb /src/core/hle/kernel | |
| parent | 07ae1f972d5f41f6d5287750f05596b0b29fb6bd (diff) | |
| parent | cc6f22e0e423527e9ddf374960fa29a472cea04a (diff) | |
Merge pull request #232 from bunnei/heap-fixes
Various heap fixes for libtransistor
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 42 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 38 | 
6 files changed, 63 insertions, 58 deletions
| diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index c77e58f3c..053bf4e17 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -33,10 +33,6 @@ enum class HandleType : u32 {      ServerSession,  }; -enum { -    DEFAULT_STACK_SIZE = 0x10000, -}; -  enum class ResetType {      OneShot,      Sticky, diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 9ca2374ea..3694afc60 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -117,11 +117,12 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) {  }  void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { -    // Allocate and map stack +    // Allocate and map the main thread stack +    // TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part +    // of the user address space.      vm_manager -        .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, -                        std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, -                        MemoryState::Heap) +        .MapMemoryBlock(Memory::STACK_VADDR, std::make_shared<std::vector<u8>>(stack_size, 0), 0, +                        stack_size, MemoryState::Mapped)          .Unwrap();      misc_memory_used += stack_size;      memory_region->used += stack_size; @@ -153,9 +154,9 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {      };      // Map CodeSet segments -    MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::Code); -    MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Static); -    MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Static); +    MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::CodeStatic); +    MapSegment(module_->rodata, VMAPermission::Read, MemoryState::CodeMutable); +    MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::CodeMutable);  }  VAddr Process::GetLinearHeapAreaAddress() const { @@ -182,6 +183,8 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per          // Initialize heap          heap_memory = std::make_shared<std::vector<u8>>();          heap_start = heap_end = target; +    } else { +        vm_manager.UnmapRange(heap_start, heap_end - heap_start);      }      // If necessary, expand backing vector to cover new heap extents. @@ -201,7 +204,7 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per                                                         size, MemoryState::Heap));      vm_manager.Reprotect(vma, perms); -    heap_used += size; +    heap_used = size;      memory_region->used += size;      return MakeResult<VAddr>(heap_end - size); @@ -288,7 +291,7 @@ ResultCode Process::MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size) {      CASCADE_RESULT(auto new_vma,                     vm_manager.MapMemoryBlock(dst_addr, backing_block, backing_block_offset, size, -                                             vma->second.meminfo_state)); +                                             MemoryState::Mapped));      // Protect mirror with permissions from old region      vm_manager.Reprotect(new_vma, vma->second.permissions);      // Remove permissions from old region diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 207583320..118ce3ee5 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -317,13 +317,13 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)          *result = Core::CurrentProcess()->allowed_thread_priority_mask;          break;      case GetInfoType::MapRegionBaseAddr: -        *result = vm_manager.GetMapRegionBaseAddr(); +        *result = Memory::MAP_REGION_VADDR;          break;      case GetInfoType::MapRegionSize: -        *result = vm_manager.GetAddressSpaceSize(); +        *result = Memory::MAP_REGION_SIZE;          break;      case GetInfoType::HeapRegionBaseAddr: -        *result = vm_manager.GetNewMapRegionBaseAddr() + vm_manager.GetNewMapRegionSize(); +        *result = Memory::HEAP_VADDR;          break;      case GetInfoType::HeapRegionSize:          *result = Memory::HEAP_SIZE; @@ -347,10 +347,10 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)          *result = vm_manager.GetAddressSpaceSize();          break;      case GetInfoType::NewMapRegionBaseAddr: -        *result = vm_manager.GetNewMapRegionBaseAddr(); +        *result = Memory::NEW_MAP_REGION_VADDR;          break;      case GetInfoType::NewMapRegionSize: -        *result = vm_manager.GetNewMapRegionSize(); +        *result = Memory::NEW_MAP_REGION_SIZE;          break;      case GetInfoType::IsVirtualAddressMemoryEnabled:          *result = Core::CurrentProcess()->is_virtual_address_memory_enabled; @@ -468,7 +468,7 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_i          memory_info->base_address = 0;          memory_info->permission = static_cast<u32>(VMAPermission::None);          memory_info->size = 0; -        memory_info->type = static_cast<u32>(MemoryState::Free); +        memory_info->type = static_cast<u32>(MemoryState::Unmapped);      } else {          memory_info->base_address = vma->second.base;          memory_info->permission = static_cast<u32>(vma->second.permissions); diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 2394620eb..a39c53db5 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -314,7 +314,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,          // TODO(Subv): Find the correct MemoryState for this region.          vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE,                                    linheap_memory, offset, Memory::PAGE_SIZE, -                                  MemoryState::ThreadLocalStorage); +                                  MemoryState::ThreadLocal);      }      // Mark the slot as used @@ -357,7 +357,7 @@ SharedPtr<Thread> SetupMainThread(VAddr entry_point, u32 priority,      // Initialize new "main" thread      auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0, -                                     Memory::HEAP_VADDR_END, owner_process); +                                     Memory::STACK_VADDR_END, owner_process);      SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index d5b36d71a..1c2f873aa 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -18,8 +18,26 @@ namespace Kernel {  static const char* GetMemoryStateName(MemoryState state) {      static const char* names[] = { -        "Free",   "Reserved",   "IO",      "Static", "Code",      "Private", -        "Shared", "Continuous", "Aliased", "Alias",  "AliasCode", "Locked", +        "Unmapped", +        "Io", +        "Normal", +        "CodeStatic", +        "CodeMutable", +        "Heap", +        "Shared", +        "Unknown1" +        "ModuleCodeStatic", +        "ModuleCodeMutable", +        "IpcBuffer0", +        "Mapped", +        "ThreadLocal", +        "TransferMemoryIsolated", +        "TransferMemory", +        "ProcessMemory", +        "Unknown2" +        "IpcBuffer1", +        "IpcBuffer3", +        "KernelStack",      };      return names[(int)state]; @@ -142,7 +160,7 @@ VMManager::VMAIter VMManager::Unmap(VMAIter vma_handle) {      VirtualMemoryArea& vma = vma_handle->second;      vma.type = VMAType::Free;      vma.permissions = VMAPermission::None; -    vma.meminfo_state = MemoryState::Free; +    vma.meminfo_state = MemoryState::Unmapped;      vma.backing_block = nullptr;      vma.offset = 0; @@ -166,6 +184,9 @@ ResultCode VMManager::UnmapRange(VAddr target, u64 size) {      }      ASSERT(FindVMA(target)->second.size >= size); + +    Core::CPU().UnmapMemory(target, size); +      return RESULT_SUCCESS;  } @@ -377,19 +398,4 @@ u64 VMManager::GetAddressSpaceSize() {      return MAX_ADDRESS;  } -VAddr VMManager::GetMapRegionBaseAddr() { -    LOG_WARNING(Kernel, "(STUBBED) called"); -    return Memory::HEAP_VADDR; -} - -VAddr VMManager::GetNewMapRegionBaseAddr() { -    LOG_WARNING(Kernel, "(STUBBED) called"); -    return 0x8000000; -} - -u64 VMManager::GetNewMapRegionSize() { -    LOG_WARNING(Kernel, "(STUBBED) called"); -    return 0x8000000; -} -  } // namespace Kernel diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 8de704a60..4d66146f6 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h @@ -41,15 +41,24 @@ enum class VMAPermission : u8 {  /// Set of values returned in MemoryInfo.state by svcQueryMemory.  enum class MemoryState : u32 { -    Free = 0, -    IO = 1, -    Normal = 2, -    Code = 3, -    Static = 4, -    Heap = 5, -    Shared = 6, -    Mapped = 6, -    ThreadLocalStorage = 12, +    Unmapped = 0x0, +    Io = 0x1, +    Normal = 0x2, +    CodeStatic = 0x3, +    CodeMutable = 0x4, +    Heap = 0x5, +    Shared = 0x6, +    ModuleCodeStatic = 0x8, +    ModuleCodeMutable = 0x9, +    IpcBuffer0 = 0xA, +    Mapped = 0xB, +    ThreadLocal = 0xC, +    TransferMemoryIsolated = 0xD, +    TransferMemory = 0xE, +    ProcessMemory = 0xF, +    IpcBuffer1 = 0x11, +    IpcBuffer3 = 0x12, +    KernelStack = 0x13,  };  /** @@ -66,7 +75,7 @@ struct VirtualMemoryArea {      VMAType type = VMAType::Free;      VMAPermission permissions = VMAPermission::None;      /// Tag returned by svcQueryMemory. Not otherwise used. -    MemoryState meminfo_state = MemoryState::Free; +    MemoryState meminfo_state = MemoryState::Unmapped;      // Settings for type = AllocatedMemoryBlock      /// Memory block backing this VMA. @@ -192,15 +201,6 @@ public:      /// Gets the total address space address size, used by svcGetInfo      u64 GetAddressSpaceSize(); -    /// Gets the map region base address, used by svcGetInfo -    VAddr GetMapRegionBaseAddr(); - -    /// Gets the base address for a new memory region, used by svcGetInfo -    VAddr GetNewMapRegionBaseAddr(); - -    /// Gets the size for a new memory region, used by svcGetInfo -    u64 GetNewMapRegionSize(); -      /// Each VMManager has its own page table, which is set as the main one when the owning process      /// is scheduled.      Memory::PageTable page_table; | 
