Merge pull request #4327 from lioncash/desig2
address_space_info: Make use of designated initializers
This commit is contained in:
commit
104c523d3d
|
@ -29,38 +29,37 @@ enum : u64 {
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
constexpr std::array<AddressSpaceInfo, 13> AddressSpaceInfos{{
|
constexpr std::array<AddressSpaceInfo, 13> AddressSpaceInfos{{
|
||||||
{ 32 /*bit_width*/, Size_2_MB /*addr*/, Size_1_GB - Size_2_MB /*size*/, AddressSpaceInfo::Type::Is32Bit, },
|
{ .bit_width = 32, .address = Size_2_MB , .size = Size_1_GB - Size_2_MB , .type = AddressSpaceInfo::Type::Is32Bit, },
|
||||||
{ 32 /*bit_width*/, Size_1_GB /*addr*/, Size_4_GB - Size_1_GB /*size*/, AddressSpaceInfo::Type::Small64Bit, },
|
{ .bit_width = 32, .address = Size_1_GB , .size = Size_4_GB - Size_1_GB , .type = AddressSpaceInfo::Type::Small64Bit, },
|
||||||
{ 32 /*bit_width*/, Invalid /*addr*/, Size_1_GB /*size*/, AddressSpaceInfo::Type::Heap, },
|
{ .bit_width = 32, .address = Invalid , .size = Size_1_GB , .type = AddressSpaceInfo::Type::Heap, },
|
||||||
{ 32 /*bit_width*/, Invalid /*addr*/, Size_1_GB /*size*/, AddressSpaceInfo::Type::Alias, },
|
{ .bit_width = 32, .address = Invalid , .size = Size_1_GB , .type = AddressSpaceInfo::Type::Alias, },
|
||||||
{ 36 /*bit_width*/, Size_128_MB /*addr*/, Size_2_GB - Size_128_MB /*size*/, AddressSpaceInfo::Type::Is32Bit, },
|
{ .bit_width = 36, .address = Size_128_MB, .size = Size_2_GB - Size_128_MB, .type = AddressSpaceInfo::Type::Is32Bit, },
|
||||||
{ 36 /*bit_width*/, Size_2_GB /*addr*/, Size_64_GB - Size_2_GB /*size*/, AddressSpaceInfo::Type::Small64Bit, },
|
{ .bit_width = 36, .address = Size_2_GB , .size = Size_64_GB - Size_2_GB , .type = AddressSpaceInfo::Type::Small64Bit, },
|
||||||
{ 36 /*bit_width*/, Invalid /*addr*/, Size_6_GB /*size*/, AddressSpaceInfo::Type::Heap, },
|
{ .bit_width = 36, .address = Invalid , .size = Size_6_GB , .type = AddressSpaceInfo::Type::Heap, },
|
||||||
{ 36 /*bit_width*/, Invalid /*addr*/, Size_6_GB /*size*/, AddressSpaceInfo::Type::Alias, },
|
{ .bit_width = 36, .address = Invalid , .size = Size_6_GB , .type = AddressSpaceInfo::Type::Alias, },
|
||||||
{ 39 /*bit_width*/, Size_128_MB /*addr*/, Size_512_GB - Size_128_MB /*size*/, AddressSpaceInfo::Type::Large64Bit, },
|
{ .bit_width = 39, .address = Size_128_MB, .size = Size_512_GB - Size_128_MB, .type = AddressSpaceInfo::Type::Large64Bit, },
|
||||||
{ 39 /*bit_width*/, Invalid /*addr*/, Size_64_GB /*size*/, AddressSpaceInfo::Type::Is32Bit },
|
{ .bit_width = 39, .address = Invalid , .size = Size_64_GB , .type = AddressSpaceInfo::Type::Is32Bit },
|
||||||
{ 39 /*bit_width*/, Invalid /*addr*/, Size_6_GB /*size*/, AddressSpaceInfo::Type::Heap, },
|
{ .bit_width = 39, .address = Invalid , .size = Size_6_GB , .type = AddressSpaceInfo::Type::Heap, },
|
||||||
{ 39 /*bit_width*/, Invalid /*addr*/, Size_64_GB /*size*/, AddressSpaceInfo::Type::Alias, },
|
{ .bit_width = 39, .address = Invalid , .size = Size_64_GB , .type = AddressSpaceInfo::Type::Alias, },
|
||||||
{ 39 /*bit_width*/, Invalid /*addr*/, Size_2_GB /*size*/, AddressSpaceInfo::Type::Stack, },
|
{ .bit_width = 39, .address = Invalid , .size = Size_2_GB , .type = AddressSpaceInfo::Type::Stack, },
|
||||||
}};
|
}};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
constexpr bool IsAllowedIndexForAddress(std::size_t index) {
|
constexpr bool IsAllowedIndexForAddress(std::size_t index) {
|
||||||
return index < std::size(AddressSpaceInfos) && AddressSpaceInfos[index].GetAddress() != Invalid;
|
return index < AddressSpaceInfos.size() && AddressSpaceInfos[index].address != Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr 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>(AddressSpaceInfo::Type::Count)>;
|
||||||
AddressSpaceIndices32Bit{
|
|
||||||
|
constexpr IndexArray AddressSpaceIndices32Bit{
|
||||||
0, 1, 0, 2, 0, 3,
|
0, 1, 0, 2, 0, 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr std::array<std::size_t, static_cast<std::size_t>(AddressSpaceInfo::Type::Count)>
|
constexpr IndexArray AddressSpaceIndices36Bit{
|
||||||
AddressSpaceIndices36Bit{
|
|
||||||
4, 5, 4, 6, 4, 7,
|
4, 5, 4, 6, 4, 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr std::array<std::size_t, static_cast<std::size_t>(AddressSpaceInfo::Type::Count)>
|
constexpr IndexArray AddressSpaceIndices39Bit{
|
||||||
AddressSpaceIndices39Bit{
|
|
||||||
9, 8, 8, 10, 12, 11,
|
9, 8, 8, 10, 12, 11,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,37 +79,37 @@ constexpr bool IsAllowed39BitType(AddressSpaceInfo::Type type) {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
u64 AddressSpaceInfo::GetAddressSpaceStart(std::size_t width, AddressSpaceInfo::Type type) {
|
u64 AddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
|
||||||
const std::size_t index{static_cast<std::size_t>(type)};
|
const std::size_t index{static_cast<std::size_t>(type)};
|
||||||
switch (width) {
|
switch (width) {
|
||||||
case 32:
|
case 32:
|
||||||
ASSERT(IsAllowed32BitType(type));
|
ASSERT(IsAllowed32BitType(type));
|
||||||
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices32Bit[index]));
|
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices32Bit[index]));
|
||||||
return AddressSpaceInfos[AddressSpaceIndices32Bit[index]].GetAddress();
|
return AddressSpaceInfos[AddressSpaceIndices32Bit[index]].address;
|
||||||
case 36:
|
case 36:
|
||||||
ASSERT(IsAllowed36BitType(type));
|
ASSERT(IsAllowed36BitType(type));
|
||||||
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices36Bit[index]));
|
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices36Bit[index]));
|
||||||
return AddressSpaceInfos[AddressSpaceIndices36Bit[index]].GetAddress();
|
return AddressSpaceInfos[AddressSpaceIndices36Bit[index]].address;
|
||||||
case 39:
|
case 39:
|
||||||
ASSERT(IsAllowed39BitType(type));
|
ASSERT(IsAllowed39BitType(type));
|
||||||
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices39Bit[index]));
|
ASSERT(IsAllowedIndexForAddress(AddressSpaceIndices39Bit[index]));
|
||||||
return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].GetAddress();
|
return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].address;
|
||||||
}
|
}
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, AddressSpaceInfo::Type type) {
|
std::size_t AddressSpaceInfo::GetAddressSpaceSize(std::size_t width, Type type) {
|
||||||
const std::size_t index{static_cast<std::size_t>(type)};
|
const std::size_t index{static_cast<std::size_t>(type)};
|
||||||
switch (width) {
|
switch (width) {
|
||||||
case 32:
|
case 32:
|
||||||
ASSERT(IsAllowed32BitType(type));
|
ASSERT(IsAllowed32BitType(type));
|
||||||
return AddressSpaceInfos[AddressSpaceIndices32Bit[index]].GetSize();
|
return AddressSpaceInfos[AddressSpaceIndices32Bit[index]].size;
|
||||||
case 36:
|
case 36:
|
||||||
ASSERT(IsAllowed36BitType(type));
|
ASSERT(IsAllowed36BitType(type));
|
||||||
return AddressSpaceInfos[AddressSpaceIndices36Bit[index]].GetSize();
|
return AddressSpaceInfos[AddressSpaceIndices36Bit[index]].size;
|
||||||
case 39:
|
case 39:
|
||||||
ASSERT(IsAllowed39BitType(type));
|
ASSERT(IsAllowed39BitType(type));
|
||||||
return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].GetSize();
|
return AddressSpaceInfos[AddressSpaceIndices39Bit[index]].size;
|
||||||
}
|
}
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,7 @@
|
||||||
|
|
||||||
namespace Kernel::Memory {
|
namespace Kernel::Memory {
|
||||||
|
|
||||||
class AddressSpaceInfo final : NonCopyable {
|
struct AddressSpaceInfo final {
|
||||||
public:
|
|
||||||
enum class Type : u32 {
|
enum class Type : u32 {
|
||||||
Is32Bit = 0,
|
Is32Bit = 0,
|
||||||
Small64Bit = 1,
|
Small64Bit = 1,
|
||||||
|
@ -23,31 +22,13 @@ public:
|
||||||
Count,
|
Count,
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
|
||||||
std::size_t bit_width{};
|
|
||||||
std::size_t addr{};
|
|
||||||
std::size_t size{};
|
|
||||||
Type type{};
|
|
||||||
|
|
||||||
public:
|
|
||||||
static u64 GetAddressSpaceStart(std::size_t width, Type type);
|
static u64 GetAddressSpaceStart(std::size_t width, Type type);
|
||||||
static std::size_t GetAddressSpaceSize(std::size_t width, Type type);
|
static std::size_t GetAddressSpaceSize(std::size_t width, Type type);
|
||||||
|
|
||||||
constexpr AddressSpaceInfo(std::size_t bit_width, std::size_t addr, std::size_t size, Type type)
|
const std::size_t bit_width{};
|
||||||
: bit_width{bit_width}, addr{addr}, size{size}, type{type} {}
|
const std::size_t address{};
|
||||||
|
const std::size_t size{};
|
||||||
constexpr std::size_t GetWidth() const {
|
const Type type{};
|
||||||
return bit_width;
|
|
||||||
}
|
|
||||||
constexpr std::size_t GetAddress() const {
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
constexpr std::size_t GetSize() const {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
constexpr Type GetType() const {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Kernel::Memory
|
} // namespace Kernel::Memory
|
||||||
|
|
Loading…
Reference in New Issue