mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-11-27 02:24:16 +01:00
kernel: simplify AddressSpaceInfo, update values
This commit is contained in:
parent
367e89f984
commit
96bd7ea42d
@ -23,86 +23,33 @@ constexpr std::array<KAddressSpaceInfo, 13> AddressSpaceInfos{{
|
|||||||
{ .bit_width = 32, .address = Size_Invalid, .size = 1_GiB , .type = KAddressSpaceInfo::Type::Heap, },
|
{ .bit_width = 32, .address = Size_Invalid, .size = 1_GiB , .type = KAddressSpaceInfo::Type::Heap, },
|
||||||
{ .bit_width = 36, .address = 128_MiB , .size = 2_GiB - 128_MiB, .type = KAddressSpaceInfo::Type::MapSmall, },
|
{ .bit_width = 36, .address = 128_MiB , .size = 2_GiB - 128_MiB, .type = KAddressSpaceInfo::Type::MapSmall, },
|
||||||
{ .bit_width = 36, .address = 2_GiB , .size = 64_GiB - 2_GiB , .type = KAddressSpaceInfo::Type::MapLarge, },
|
{ .bit_width = 36, .address = 2_GiB , .size = 64_GiB - 2_GiB , .type = KAddressSpaceInfo::Type::MapLarge, },
|
||||||
{ .bit_width = 36, .address = Size_Invalid, .size = 6_GiB , .type = KAddressSpaceInfo::Type::Heap, },
|
{ .bit_width = 36, .address = Size_Invalid, .size = 8_GiB , .type = KAddressSpaceInfo::Type::Heap, },
|
||||||
{ .bit_width = 36, .address = Size_Invalid, .size = 6_GiB , .type = KAddressSpaceInfo::Type::Alias, },
|
{ .bit_width = 36, .address = Size_Invalid, .size = 6_GiB , .type = KAddressSpaceInfo::Type::Alias, },
|
||||||
{ .bit_width = 39, .address = 128_MiB , .size = 512_GiB - 128_MiB, .type = KAddressSpaceInfo::Type::Map39Bit, },
|
{ .bit_width = 39, .address = 128_MiB , .size = 512_GiB - 128_MiB, .type = KAddressSpaceInfo::Type::Map39Bit, },
|
||||||
{ .bit_width = 39, .address = Size_Invalid, .size = 64_GiB , .type = KAddressSpaceInfo::Type::MapSmall },
|
{ .bit_width = 39, .address = Size_Invalid, .size = 64_GiB , .type = KAddressSpaceInfo::Type::MapSmall },
|
||||||
{ .bit_width = 39, .address = Size_Invalid, .size = 6_GiB , .type = KAddressSpaceInfo::Type::Heap, },
|
{ .bit_width = 39, .address = Size_Invalid, .size = 8_GiB , .type = KAddressSpaceInfo::Type::Heap, },
|
||||||
{ .bit_width = 39, .address = Size_Invalid, .size = 64_GiB , .type = KAddressSpaceInfo::Type::Alias, },
|
{ .bit_width = 39, .address = Size_Invalid, .size = 64_GiB , .type = KAddressSpaceInfo::Type::Alias, },
|
||||||
{ .bit_width = 39, .address = Size_Invalid, .size = 2_GiB , .type = KAddressSpaceInfo::Type::Stack, },
|
{ .bit_width = 39, .address = Size_Invalid, .size = 2_GiB , .type = KAddressSpaceInfo::Type::Stack, },
|
||||||
}};
|
}};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
constexpr bool IsAllowedIndexForAddress(std::size_t index) {
|
const KAddressSpaceInfo& GetAddressSpaceInfo(size_t width, KAddressSpaceInfo::Type type) {
|
||||||
return index < AddressSpaceInfos.size() && AddressSpaceInfos[index].address != Size_Invalid;
|
for (auto& info : AddressSpaceInfos) {
|
||||||
|
if (info.bit_width == width && info.type == type) {
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
using IndexArray =
|
|
||||||
std::array<std::size_t, static_cast<std::size_t>(KAddressSpaceInfo::Type::Count)>;
|
|
||||||
|
|
||||||
constexpr IndexArray AddressSpaceIndices32Bit{
|
|
||||||
0, 1, 0, 2, 0, 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr IndexArray AddressSpaceIndices36Bit{
|
|
||||||
4, 5, 4, 6, 4, 7,
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr IndexArray AddressSpaceIndices39Bit{
|
|
||||||
9, 8, 8, 10, 12, 11,
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr bool IsAllowed32BitType(KAddressSpaceInfo::Type type) {
|
|
||||||
return type < KAddressSpaceInfo::Type::Count && type != KAddressSpaceInfo::Type::Map39Bit &&
|
|
||||||
type != KAddressSpaceInfo::Type::Stack;
|
|
||||||
}
|
}
|
||||||
|
UNREACHABLE_MSG("Could not find AddressSpaceInfo");
|
||||||
constexpr bool IsAllowed36BitType(KAddressSpaceInfo::Type type) {
|
|
||||||
return type < KAddressSpaceInfo::Type::Count && type != KAddressSpaceInfo::Type::Map39Bit &&
|
|
||||||
type != KAddressSpaceInfo::Type::Stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr bool IsAllowed39BitType(KAddressSpaceInfo::Type type) {
|
|
||||||
return type < KAddressSpaceInfo::Type::Count && type != KAddressSpaceInfo::Type::MapLarge;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
u64 KAddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
|
uintptr_t KAddressSpaceInfo::GetAddressSpaceStart(size_t width, KAddressSpaceInfo::Type type) {
|
||||||
const std::size_t index{static_cast<std::size_t>(type)};
|
return GetAddressSpaceInfo(width, type).address;
|
||||||
switch (width) {
|
|
||||||
case 32:
|
|
||||||
ASSERT(IsAllowed32BitType(type));
|
|
||||||
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices32Bit[index]));
|
|
||||||
return AddressSpaceInfos[AddressSpaceIndices32Bit[index]].address;
|
|
||||||
case 36:
|
|
||||||
ASSERT(IsAllowed36BitType(type));
|
|
||||||
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices36Bit[index]));
|
|
||||||
return AddressSpaceInfos[AddressSpaceIndices36Bit[index]].address;
|
|
||||||
case 39:
|
|
||||||
ASSERT(IsAllowed39BitType(type));
|
|
||||||
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices39Bit[index]));
|
|
||||||
return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].address;
|
|
||||||
}
|
|
||||||
ASSERT(false);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t KAddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type) {
|
size_t KAddressSpaceInfo::GetAddressSpaceSize(size_t width, KAddressSpaceInfo::Type type) {
|
||||||
const std::size_t index{static_cast<std::size_t>(type)};
|
return GetAddressSpaceInfo(width, type).size;
|
||||||
switch (width) {
|
|
||||||
case 32:
|
|
||||||
ASSERT(IsAllowed32BitType(type));
|
|
||||||
return AddressSpaceInfos[AddressSpaceIndices32Bit[index]].size;
|
|
||||||
case 36:
|
|
||||||
ASSERT(IsAllowed36BitType(type));
|
|
||||||
return AddressSpaceInfos[AddressSpaceIndices36Bit[index]].size;
|
|
||||||
case 39:
|
|
||||||
ASSERT(IsAllowed39BitType(type));
|
|
||||||
return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].size;
|
|
||||||
}
|
|
||||||
ASSERT(false);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
Loading…
Reference in New Issue
Block a user