summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/kernel.h4
-rw-r--r--src/core/hle/kernel/process.cpp21
-rw-r--r--src/core/hle/kernel/svc.cpp12
-rw-r--r--src/core/hle/kernel/thread.cpp4
-rw-r--r--src/core/hle/kernel/vm_manager.cpp42
-rw-r--r--src/core/hle/kernel/vm_manager.h38
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 {
33 ServerSession, 33 ServerSession,
34}; 34};
35 35
36enum {
37 DEFAULT_STACK_SIZE = 0x10000,
38};
39
40enum class ResetType { 36enum class ResetType {
41 OneShot, 37 OneShot,
42 Sticky, 38 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) {
117} 117}
118 118
119void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { 119void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
120 // Allocate and map stack 120 // Allocate and map the main thread stack
121 // TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part
122 // of the user address space.
121 vm_manager 123 vm_manager
122 .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, 124 .MapMemoryBlock(Memory::STACK_VADDR, std::make_shared<std::vector<u8>>(stack_size, 0), 0,
123 std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, 125 stack_size, MemoryState::Mapped)
124 MemoryState::Heap)
125 .Unwrap(); 126 .Unwrap();
126 misc_memory_used += stack_size; 127 misc_memory_used += stack_size;
127 memory_region->used += stack_size; 128 memory_region->used += stack_size;
@@ -153,9 +154,9 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
153 }; 154 };
154 155
155 // Map CodeSet segments 156 // Map CodeSet segments
156 MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::Code); 157 MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::CodeStatic);
157 MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Static); 158 MapSegment(module_->rodata, VMAPermission::Read, MemoryState::CodeMutable);
158 MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Static); 159 MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::CodeMutable);
159} 160}
160 161
161VAddr Process::GetLinearHeapAreaAddress() const { 162VAddr Process::GetLinearHeapAreaAddress() const {
@@ -182,6 +183,8 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per
182 // Initialize heap 183 // Initialize heap
183 heap_memory = std::make_shared<std::vector<u8>>(); 184 heap_memory = std::make_shared<std::vector<u8>>();
184 heap_start = heap_end = target; 185 heap_start = heap_end = target;
186 } else {
187 vm_manager.UnmapRange(heap_start, heap_end - heap_start);
185 } 188 }
186 189
187 // If necessary, expand backing vector to cover new heap extents. 190 // If necessary, expand backing vector to cover new heap extents.
@@ -201,7 +204,7 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per
201 size, MemoryState::Heap)); 204 size, MemoryState::Heap));
202 vm_manager.Reprotect(vma, perms); 205 vm_manager.Reprotect(vma, perms);
203 206
204 heap_used += size; 207 heap_used = size;
205 memory_region->used += size; 208 memory_region->used += size;
206 209
207 return MakeResult<VAddr>(heap_end - size); 210 return MakeResult<VAddr>(heap_end - size);
@@ -288,7 +291,7 @@ ResultCode Process::MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size) {
288 291
289 CASCADE_RESULT(auto new_vma, 292 CASCADE_RESULT(auto new_vma,
290 vm_manager.MapMemoryBlock(dst_addr, backing_block, backing_block_offset, size, 293 vm_manager.MapMemoryBlock(dst_addr, backing_block, backing_block_offset, size,
291 vma->second.meminfo_state)); 294 MemoryState::Mapped));
292 // Protect mirror with permissions from old region 295 // Protect mirror with permissions from old region
293 vm_manager.Reprotect(new_vma, vma->second.permissions); 296 vm_manager.Reprotect(new_vma, vma->second.permissions);
294 // Remove permissions from old region 297 // 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)
317 *result = Core::CurrentProcess()->allowed_thread_priority_mask; 317 *result = Core::CurrentProcess()->allowed_thread_priority_mask;
318 break; 318 break;
319 case GetInfoType::MapRegionBaseAddr: 319 case GetInfoType::MapRegionBaseAddr:
320 *result = vm_manager.GetMapRegionBaseAddr(); 320 *result = Memory::MAP_REGION_VADDR;
321 break; 321 break;
322 case GetInfoType::MapRegionSize: 322 case GetInfoType::MapRegionSize:
323 *result = vm_manager.GetAddressSpaceSize(); 323 *result = Memory::MAP_REGION_SIZE;
324 break; 324 break;
325 case GetInfoType::HeapRegionBaseAddr: 325 case GetInfoType::HeapRegionBaseAddr:
326 *result = vm_manager.GetNewMapRegionBaseAddr() + vm_manager.GetNewMapRegionSize(); 326 *result = Memory::HEAP_VADDR;
327 break; 327 break;
328 case GetInfoType::HeapRegionSize: 328 case GetInfoType::HeapRegionSize:
329 *result = Memory::HEAP_SIZE; 329 *result = Memory::HEAP_SIZE;
@@ -347,10 +347,10 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
347 *result = vm_manager.GetAddressSpaceSize(); 347 *result = vm_manager.GetAddressSpaceSize();
348 break; 348 break;
349 case GetInfoType::NewMapRegionBaseAddr: 349 case GetInfoType::NewMapRegionBaseAddr:
350 *result = vm_manager.GetNewMapRegionBaseAddr(); 350 *result = Memory::NEW_MAP_REGION_VADDR;
351 break; 351 break;
352 case GetInfoType::NewMapRegionSize: 352 case GetInfoType::NewMapRegionSize:
353 *result = vm_manager.GetNewMapRegionSize(); 353 *result = Memory::NEW_MAP_REGION_SIZE;
354 break; 354 break;
355 case GetInfoType::IsVirtualAddressMemoryEnabled: 355 case GetInfoType::IsVirtualAddressMemoryEnabled:
356 *result = Core::CurrentProcess()->is_virtual_address_memory_enabled; 356 *result = Core::CurrentProcess()->is_virtual_address_memory_enabled;
@@ -468,7 +468,7 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_i
468 memory_info->base_address = 0; 468 memory_info->base_address = 0;
469 memory_info->permission = static_cast<u32>(VMAPermission::None); 469 memory_info->permission = static_cast<u32>(VMAPermission::None);
470 memory_info->size = 0; 470 memory_info->size = 0;
471 memory_info->type = static_cast<u32>(MemoryState::Free); 471 memory_info->type = static_cast<u32>(MemoryState::Unmapped);
472 } else { 472 } else {
473 memory_info->base_address = vma->second.base; 473 memory_info->base_address = vma->second.base;
474 memory_info->permission = static_cast<u32>(vma->second.permissions); 474 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,
314 // TODO(Subv): Find the correct MemoryState for this region. 314 // TODO(Subv): Find the correct MemoryState for this region.
315 vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE, 315 vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE,
316 linheap_memory, offset, Memory::PAGE_SIZE, 316 linheap_memory, offset, Memory::PAGE_SIZE,
317 MemoryState::ThreadLocalStorage); 317 MemoryState::ThreadLocal);
318 } 318 }
319 319
320 // Mark the slot as used 320 // Mark the slot as used
@@ -357,7 +357,7 @@ SharedPtr<Thread> SetupMainThread(VAddr entry_point, u32 priority,
357 357
358 // Initialize new "main" thread 358 // Initialize new "main" thread
359 auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0, 359 auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0,
360 Memory::HEAP_VADDR_END, owner_process); 360 Memory::STACK_VADDR_END, owner_process);
361 361
362 SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); 362 SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
363 363
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 {
18 18
19static const char* GetMemoryStateName(MemoryState state) { 19static const char* GetMemoryStateName(MemoryState state) {
20 static const char* names[] = { 20 static const char* names[] = {
21 "Free", "Reserved", "IO", "Static", "Code", "Private", 21 "Unmapped",
22 "Shared", "Continuous", "Aliased", "Alias", "AliasCode", "Locked", 22 "Io",
23 "Normal",
24 "CodeStatic",
25 "CodeMutable",
26 "Heap",
27 "Shared",
28 "Unknown1"
29 "ModuleCodeStatic",
30 "ModuleCodeMutable",
31 "IpcBuffer0",
32 "Mapped",
33 "ThreadLocal",
34 "TransferMemoryIsolated",
35 "TransferMemory",
36 "ProcessMemory",
37 "Unknown2"
38 "IpcBuffer1",
39 "IpcBuffer3",
40 "KernelStack",
23 }; 41 };
24 42
25 return names[(int)state]; 43 return names[(int)state];
@@ -142,7 +160,7 @@ VMManager::VMAIter VMManager::Unmap(VMAIter vma_handle) {
142 VirtualMemoryArea& vma = vma_handle->second; 160 VirtualMemoryArea& vma = vma_handle->second;
143 vma.type = VMAType::Free; 161 vma.type = VMAType::Free;
144 vma.permissions = VMAPermission::None; 162 vma.permissions = VMAPermission::None;
145 vma.meminfo_state = MemoryState::Free; 163 vma.meminfo_state = MemoryState::Unmapped;
146 164
147 vma.backing_block = nullptr; 165 vma.backing_block = nullptr;
148 vma.offset = 0; 166 vma.offset = 0;
@@ -166,6 +184,9 @@ ResultCode VMManager::UnmapRange(VAddr target, u64 size) {
166 } 184 }
167 185
168 ASSERT(FindVMA(target)->second.size >= size); 186 ASSERT(FindVMA(target)->second.size >= size);
187
188 Core::CPU().UnmapMemory(target, size);
189
169 return RESULT_SUCCESS; 190 return RESULT_SUCCESS;
170} 191}
171 192
@@ -377,19 +398,4 @@ u64 VMManager::GetAddressSpaceSize() {
377 return MAX_ADDRESS; 398 return MAX_ADDRESS;
378} 399}
379 400
380VAddr VMManager::GetMapRegionBaseAddr() {
381 LOG_WARNING(Kernel, "(STUBBED) called");
382 return Memory::HEAP_VADDR;
383}
384
385VAddr VMManager::GetNewMapRegionBaseAddr() {
386 LOG_WARNING(Kernel, "(STUBBED) called");
387 return 0x8000000;
388}
389
390u64 VMManager::GetNewMapRegionSize() {
391 LOG_WARNING(Kernel, "(STUBBED) called");
392 return 0x8000000;
393}
394
395} // namespace Kernel 401} // 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 {
41 41
42/// Set of values returned in MemoryInfo.state by svcQueryMemory. 42/// Set of values returned in MemoryInfo.state by svcQueryMemory.
43enum class MemoryState : u32 { 43enum class MemoryState : u32 {
44 Free = 0, 44 Unmapped = 0x0,
45 IO = 1, 45 Io = 0x1,
46 Normal = 2, 46 Normal = 0x2,
47 Code = 3, 47 CodeStatic = 0x3,
48 Static = 4, 48 CodeMutable = 0x4,
49 Heap = 5, 49 Heap = 0x5,
50 Shared = 6, 50 Shared = 0x6,
51 Mapped = 6, 51 ModuleCodeStatic = 0x8,
52 ThreadLocalStorage = 12, 52 ModuleCodeMutable = 0x9,
53 IpcBuffer0 = 0xA,
54 Mapped = 0xB,
55 ThreadLocal = 0xC,
56 TransferMemoryIsolated = 0xD,
57 TransferMemory = 0xE,
58 ProcessMemory = 0xF,
59 IpcBuffer1 = 0x11,
60 IpcBuffer3 = 0x12,
61 KernelStack = 0x13,
53}; 62};
54 63
55/** 64/**
@@ -66,7 +75,7 @@ struct VirtualMemoryArea {
66 VMAType type = VMAType::Free; 75 VMAType type = VMAType::Free;
67 VMAPermission permissions = VMAPermission::None; 76 VMAPermission permissions = VMAPermission::None;
68 /// Tag returned by svcQueryMemory. Not otherwise used. 77 /// Tag returned by svcQueryMemory. Not otherwise used.
69 MemoryState meminfo_state = MemoryState::Free; 78 MemoryState meminfo_state = MemoryState::Unmapped;
70 79
71 // Settings for type = AllocatedMemoryBlock 80 // Settings for type = AllocatedMemoryBlock
72 /// Memory block backing this VMA. 81 /// Memory block backing this VMA.
@@ -192,15 +201,6 @@ public:
192 /// Gets the total address space address size, used by svcGetInfo 201 /// Gets the total address space address size, used by svcGetInfo
193 u64 GetAddressSpaceSize(); 202 u64 GetAddressSpaceSize();
194 203
195 /// Gets the map region base address, used by svcGetInfo
196 VAddr GetMapRegionBaseAddr();
197
198 /// Gets the base address for a new memory region, used by svcGetInfo
199 VAddr GetNewMapRegionBaseAddr();
200
201 /// Gets the size for a new memory region, used by svcGetInfo
202 u64 GetNewMapRegionSize();
203
204 /// Each VMManager has its own page table, which is set as the main one when the owning process 204 /// Each VMManager has its own page table, which is set as the main one when the owning process
205 /// is scheduled. 205 /// is scheduled.
206 Memory::PageTable page_table; 206 Memory::PageTable page_table;