|
|
|
@ -2,15 +2,12 @@
|
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
|
|
// This file references various implementation details from Atmosphere, an open-source firmware for
|
|
|
|
|
// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
|
|
|
|
|
|
|
|
|
|
#include <array>
|
|
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
|
#include "core/hle/kernel/memory/address_space_info.h"
|
|
|
|
|
#include "core/hle/kernel/k_address_space_info.h"
|
|
|
|
|
|
|
|
|
|
namespace Kernel::Memory {
|
|
|
|
|
namespace Kernel {
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
@ -28,20 +25,20 @@ enum : u64 {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
|
constexpr std::array<AddressSpaceInfo, 13> AddressSpaceInfos{{
|
|
|
|
|
{ .bit_width = 32, .address = Size_2_MB , .size = Size_1_GB - Size_2_MB , .type = AddressSpaceInfo::Type::Is32Bit, },
|
|
|
|
|
{ .bit_width = 32, .address = Size_1_GB , .size = Size_4_GB - Size_1_GB , .type = AddressSpaceInfo::Type::Small64Bit, },
|
|
|
|
|
{ .bit_width = 32, .address = Invalid , .size = Size_1_GB , .type = AddressSpaceInfo::Type::Heap, },
|
|
|
|
|
{ .bit_width = 32, .address = Invalid , .size = Size_1_GB , .type = AddressSpaceInfo::Type::Alias, },
|
|
|
|
|
{ .bit_width = 36, .address = Size_128_MB, .size = Size_2_GB - Size_128_MB, .type = AddressSpaceInfo::Type::Is32Bit, },
|
|
|
|
|
{ .bit_width = 36, .address = Size_2_GB , .size = Size_64_GB - Size_2_GB , .type = AddressSpaceInfo::Type::Small64Bit, },
|
|
|
|
|
{ .bit_width = 36, .address = Invalid , .size = Size_6_GB , .type = AddressSpaceInfo::Type::Heap, },
|
|
|
|
|
{ .bit_width = 36, .address = Invalid , .size = Size_6_GB , .type = AddressSpaceInfo::Type::Alias, },
|
|
|
|
|
{ .bit_width = 39, .address = Size_128_MB, .size = Size_512_GB - Size_128_MB, .type = AddressSpaceInfo::Type::Large64Bit, },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_64_GB , .type = AddressSpaceInfo::Type::Is32Bit },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_6_GB , .type = AddressSpaceInfo::Type::Heap, },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_64_GB , .type = AddressSpaceInfo::Type::Alias, },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_2_GB , .type = AddressSpaceInfo::Type::Stack, },
|
|
|
|
|
constexpr std::array<KAddressSpaceInfo, 13> AddressSpaceInfos{{
|
|
|
|
|
{ .bit_width = 32, .address = Size_2_MB , .size = Size_1_GB - Size_2_MB , .type = KAddressSpaceInfo::Type::MapSmall, },
|
|
|
|
|
{ .bit_width = 32, .address = Size_1_GB , .size = Size_4_GB - Size_1_GB , .type = KAddressSpaceInfo::Type::MapLarge, },
|
|
|
|
|
{ .bit_width = 32, .address = Invalid , .size = Size_1_GB , .type = KAddressSpaceInfo::Type::Heap, },
|
|
|
|
|
{ .bit_width = 32, .address = Invalid , .size = Size_1_GB , .type = KAddressSpaceInfo::Type::Alias, },
|
|
|
|
|
{ .bit_width = 36, .address = Size_128_MB, .size = Size_2_GB - Size_128_MB, .type = KAddressSpaceInfo::Type::MapSmall, },
|
|
|
|
|
{ .bit_width = 36, .address = Size_2_GB , .size = Size_64_GB - Size_2_GB , .type = KAddressSpaceInfo::Type::MapLarge, },
|
|
|
|
|
{ .bit_width = 36, .address = Invalid , .size = Size_6_GB , .type = KAddressSpaceInfo::Type::Heap, },
|
|
|
|
|
{ .bit_width = 36, .address = Invalid , .size = Size_6_GB , .type = KAddressSpaceInfo::Type::Alias, },
|
|
|
|
|
{ .bit_width = 39, .address = Size_128_MB, .size = Size_512_GB - Size_128_MB, .type = KAddressSpaceInfo::Type::Map39Bit, },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_64_GB , .type = KAddressSpaceInfo::Type::MapSmall },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_6_GB , .type = KAddressSpaceInfo::Type::Heap, },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_64_GB , .type = KAddressSpaceInfo::Type::Alias, },
|
|
|
|
|
{ .bit_width = 39, .address = Invalid , .size = Size_2_GB , .type = KAddressSpaceInfo::Type::Stack, },
|
|
|
|
|
}};
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
@ -49,7 +46,8 @@ constexpr bool IsAllowedIndexForAddress(std::size_t index) {
|
|
|
|
|
return index < AddressSpaceInfos.size() && AddressSpaceInfos[index].address != Invalid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using IndexArray = std::array<std::size_t, static_cast<std::size_t>(AddressSpaceInfo::Type::Count)>;
|
|
|
|
|
using IndexArray =
|
|
|
|
|
std::array<std::size_t, static_cast<std::size_t>(KAddressSpaceInfo::Type::Count)>;
|
|
|
|
|
|
|
|
|
|
constexpr IndexArray AddressSpaceIndices32Bit{
|
|
|
|
|
0, 1, 0, 2, 0, 3,
|
|
|
|
@ -63,23 +61,23 @@ constexpr IndexArray AddressSpaceIndices39Bit{
|
|
|
|
|
9, 8, 8, 10, 12, 11,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
constexpr bool IsAllowed32BitType(AddressSpaceInfo::Type type) {
|
|
|
|
|
return type < AddressSpaceInfo::Type::Count && type != AddressSpaceInfo::Type::Large64Bit &&
|
|
|
|
|
type != AddressSpaceInfo::Type::Stack;
|
|
|
|
|
constexpr bool IsAllowed32BitType(KAddressSpaceInfo::Type type) {
|
|
|
|
|
return type < KAddressSpaceInfo::Type::Count && type != KAddressSpaceInfo::Type::Map39Bit &&
|
|
|
|
|
type != KAddressSpaceInfo::Type::Stack;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constexpr bool IsAllowed36BitType(AddressSpaceInfo::Type type) {
|
|
|
|
|
return type < AddressSpaceInfo::Type::Count && type != AddressSpaceInfo::Type::Large64Bit &&
|
|
|
|
|
type != AddressSpaceInfo::Type::Stack;
|
|
|
|
|
constexpr bool IsAllowed36BitType(KAddressSpaceInfo::Type type) {
|
|
|
|
|
return type < KAddressSpaceInfo::Type::Count && type != KAddressSpaceInfo::Type::Map39Bit &&
|
|
|
|
|
type != KAddressSpaceInfo::Type::Stack;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constexpr bool IsAllowed39BitType(AddressSpaceInfo::Type type) {
|
|
|
|
|
return type < AddressSpaceInfo::Type::Count && type != AddressSpaceInfo::Type::Small64Bit;
|
|
|
|
|
constexpr bool IsAllowed39BitType(KAddressSpaceInfo::Type type) {
|
|
|
|
|
return type < KAddressSpaceInfo::Type::Count && type != KAddressSpaceInfo::Type::MapLarge;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
u64 AddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
|
|
|
|
|
u64 KAddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
|
|
|
|
|
const std::size_t index{static_cast<std::size_t>(type)};
|
|
|
|
|
switch (width) {
|
|
|
|
|
case 32:
|
|
|
|
@ -99,7 +97,7 @@ u64 AddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type) {
|
|
|
|
|
std::size_t KAddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type) {
|
|
|
|
|
const std::size_t index{static_cast<std::size_t>(type)};
|
|
|
|
|
switch (width) {
|
|
|
|
|
case 32:
|
|
|
|
@ -116,4 +114,4 @@ std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Kernel::Memory
|
|
|
|
|
} // namespace Kernel
|