Make regions public members of the memory class and drop the type enum

There isn't really much benefit in having a getter or an enum, so drop
it.
This commit is contained in:
Billy Laws 2020-07-06 12:03:32 +01:00 committed by ◱ PixelyIon
parent eadc016525
commit 7884a60679
5 changed files with 21 additions and 56 deletions

View File

@ -173,23 +173,6 @@ namespace skyline::kernel {
return std::nullopt; return std::nullopt;
} }
memory::Region MemoryManager::GetRegion(memory::Regions region) {
switch (region) {
case memory::Regions::Base:
return base;
case memory::Regions::Code:
return code;
case memory::Regions::Alias:
return alias;
case memory::Regions::Heap:
return heap;
case memory::Regions::Stack:
return stack;
case memory::Regions::TlsIo:
return tlsIo;
}
}
size_t MemoryManager::GetProgramSize() { size_t MemoryManager::GetProgramSize() {
size_t size = 0; size_t size = 0;

View File

@ -170,23 +170,10 @@ namespace skyline {
constexpr MemoryState CodeWritable = 0x00402015; constexpr MemoryState CodeWritable = 0x00402015;
}; };
/**
* @brief This enumerates all of the memory regions in the process address space
*/
enum class Regions {
Base, //!< The region representing the entire address space
Code, //!< The code region contains all of the loaded in code
Alias, //!< The alias region is reserved for allocating thread stack before 2.0.0
Heap, //!< The heap region is reserved for heap allocations
Stack, //!< The stack region is reserved for allocating thread stack after 2.0.0
TlsIo, //!< The TLS/IO region is reserved for allocating TLS and Device MMIO
};
/** /**
* @brief This struct is used to hold the location and size of a memory region * @brief This struct is used to hold the location and size of a memory region
*/ */
struct Region { struct Region {
Regions id; //!< The ID of the region
u64 address; //!< The base address of the region u64 address; //!< The base address of the region
u64 size; //!< The size of the region in bytes u64 size; //!< The size of the region in bytes
@ -265,12 +252,6 @@ namespace skyline {
private: private:
const DeviceState &state; //!< The state of the device const DeviceState &state; //!< The state of the device
std::vector<ChunkDescriptor> chunkList; //!< This vector holds all the chunk descriptors std::vector<ChunkDescriptor> chunkList; //!< This vector holds all the chunk descriptors
memory::Region base{memory::Regions::Base}; //!< The Region object for the entire address space
memory::Region code{memory::Regions::Code}; //!< The Region object for the code memory region
memory::Region alias{memory::Regions::Alias}; //!< The Region object for the alias memory region
memory::Region heap{memory::Regions::Heap}; //!< The Region object for the heap memory region
memory::Region stack{memory::Regions::Stack}; //!< The Region object for the stack memory region
memory::Region tlsIo{memory::Regions::TlsIo}; //!< The Region object for the TLS/IO memory region
/** /**
* @param address The address to find a chunk at * @param address The address to find a chunk at
@ -331,6 +312,13 @@ namespace skyline {
friend void svc::MapMemory(skyline::DeviceState &state); friend void svc::MapMemory(skyline::DeviceState &state);
memory::Region base{}; //!< The Region object for the entire address space
memory::Region code{}; //!< The Region object for the code memory region
memory::Region alias{}; //!< The Region object for the alias memory region
memory::Region heap{}; //!< The Region object for the heap memory region
memory::Region stack{}; //!< The Region object for the stack memory region
memory::Region tlsIo{}; //!< The Region object for the TLS/IO memory region
MemoryManager(const DeviceState &state); MemoryManager(const DeviceState &state);
/** /**
@ -339,12 +327,6 @@ namespace skyline {
*/ */
std::optional<DescriptorPack> Get(u64 address); std::optional<DescriptorPack> Get(u64 address);
/**
* @param region The region to retrieve
* @return A Region object for the specified region
*/
memory::Region GetRegion(memory::Regions region);
/** /**
* @brief The total amount of space in bytes occupied by all memory mappings * @brief The total amount of space in bytes occupied by all memory mappings
* @return The cumulative size of all memory mappings in bytes * @return The cumulative size of all memory mappings in bytes

View File

@ -88,7 +88,7 @@ namespace skyline::kernel::svc {
return; return;
} }
auto stack = state.os->memory.GetRegion(memory::Regions::Stack); auto stack = state.os->memory.stack;
if (!stack.IsInside(destination)) { if (!stack.IsInside(destination)) {
state.ctx->registers.w0 = constant::status::InvMemRange; state.ctx->registers.w0 = constant::status::InvMemRange;
state.logger->Warn("svcMapMemory: Destination not within stack region: Source: 0x{:X}, Destination: 0x{:X} (Size: 0x{:X} bytes)", source, destination, size); state.logger->Warn("svcMapMemory: Destination not within stack region: Source: 0x{:X}, Destination: 0x{:X} (Size: 0x{:X} bytes)", source, destination, size);
@ -137,7 +137,7 @@ namespace skyline::kernel::svc {
return; return;
} }
auto stack = state.os->memory.GetRegion(memory::Regions::Stack); auto stack = state.os->memory.stack;
if (!stack.IsInside(source)) { if (!stack.IsInside(source)) {
state.ctx->registers.w0 = constant::status::InvMemRange; state.ctx->registers.w0 = constant::status::InvMemRange;
state.logger->Warn("svcUnmapMemory: Source not within stack region: Source: 0x{:X}, Destination: 0x{:X} (Size: 0x{:X} bytes)", source, destination, size); state.logger->Warn("svcUnmapMemory: Source not within stack region: Source: 0x{:X}, Destination: 0x{:X} (Size: 0x{:X} bytes)", source, destination, size);
@ -195,7 +195,7 @@ namespace skyline::kernel::svc {
state.logger->Debug("svcQueryMemory: Address: 0x{:X}, Size: 0x{:X}, Type: 0x{:X}, Is Uncached: {}, Permissions: {}{}{}", memInfo.address, memInfo.size, memInfo.type, static_cast<bool>(descriptor->block.attributes.isUncached), descriptor->block.permission.r ? "R" : "-", descriptor->block.permission.w ? "W" : "-", descriptor->block.permission.x ? "X" : "-"); state.logger->Debug("svcQueryMemory: Address: 0x{:X}, Size: 0x{:X}, Type: 0x{:X}, Is Uncached: {}, Permissions: {}{}{}", memInfo.address, memInfo.size, memInfo.type, static_cast<bool>(descriptor->block.attributes.isUncached), descriptor->block.permission.r ? "R" : "-", descriptor->block.permission.w ? "W" : "-", descriptor->block.permission.x ? "X" : "-");
} else { } else {
auto region = state.os->memory.GetRegion(memory::Regions::Base); auto region = state.os->memory.base;
auto baseEnd = region.address + region.size; auto baseEnd = region.address + region.size;
memInfo = { memInfo = {
@ -645,19 +645,19 @@ namespace skyline::kernel::svc {
break; break;
case constant::infoState::AliasRegionBaseAddr: case constant::infoState::AliasRegionBaseAddr:
out = state.os->memory.GetRegion(memory::Regions::Alias).address; out = state.os->memory.alias.address;
break; break;
case constant::infoState::AliasRegionSize: case constant::infoState::AliasRegionSize:
out = state.os->memory.GetRegion(memory::Regions::Alias).size; out = state.os->memory.alias.size;
break; break;
case constant::infoState::HeapRegionBaseAddr: case constant::infoState::HeapRegionBaseAddr:
out = state.os->memory.GetRegion(memory::Regions::Heap).address; out = state.os->memory.heap.address;
break; break;
case constant::infoState::HeapRegionSize: case constant::infoState::HeapRegionSize:
out = state.os->memory.GetRegion(memory::Regions::Heap).size; out = state.os->memory.heap.size;
break; break;
case constant::infoState::TotalMemoryAvailable: case constant::infoState::TotalMemoryAvailable:
@ -669,19 +669,19 @@ namespace skyline::kernel::svc {
break; break;
case constant::infoState::AddressSpaceBaseAddr: case constant::infoState::AddressSpaceBaseAddr:
out = state.os->memory.GetRegion(memory::Regions::Base).address; out = state.os->memory.base.address;
break; break;
case constant::infoState::AddressSpaceSize: case constant::infoState::AddressSpaceSize:
out = state.os->memory.GetRegion(memory::Regions::Base).size; out = state.os->memory.base.size;
break; break;
case constant::infoState::StackRegionBaseAddr: case constant::infoState::StackRegionBaseAddr:
out = state.os->memory.GetRegion(memory::Regions::Stack).address; out = state.os->memory.stack.address;
break; break;
case constant::infoState::StackRegionSize: case constant::infoState::StackRegionSize:
out = state.os->memory.GetRegion(memory::Regions::Stack).size; out = state.os->memory.stack.size;
break; break;
case constant::infoState::PersonalMmHeapSize: case constant::infoState::PersonalMmHeapSize:

View File

@ -39,7 +39,7 @@ namespace skyline::kernel::type {
u64 address; u64 address;
if (tlsPages.empty()) { if (tlsPages.empty()) {
auto region = state.os->memory.GetRegion(memory::Regions::TlsIo); auto region = state.os->memory.tlsIo;
address = region.size ? region.address : 0; address = region.size ? region.address : 0;
} else { } else {
address = (*(tlsPages.end() - 1))->address + PAGE_SIZE; address = (*(tlsPages.end() - 1))->address + PAGE_SIZE;
@ -57,7 +57,7 @@ namespace skyline::kernel::type {
void KProcess::InitializeMemory() { void KProcess::InitializeMemory() {
constexpr size_t DefHeapSize = 0x200000; // The default amount of heap constexpr size_t DefHeapSize = 0x200000; // The default amount of heap
heap = NewHandle<KPrivateMemory>(state.os->memory.GetRegion(memory::Regions::Heap).address, DefHeapSize, memory::Permission{true, true, false}, memory::states::Heap).item; heap = NewHandle<KPrivateMemory>(state.os->memory.heap.address, DefHeapSize, memory::Permission{true, true, false}, memory::states::Heap).item;
threads[pid]->tls = GetTlsSlot(); threads[pid]->tls = GetTlsSlot();
} }