mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	kernel: simplify AddressSpaceInfo, update values
This commit is contained in:
		@@ -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 = 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 = 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 = 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 = 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 = 2_GiB            , .type = KAddressSpaceInfo::Type::Stack,    },
 | 
			
		||||
}};
 | 
			
		||||
// clang-format on
 | 
			
		||||
 | 
			
		||||
constexpr bool IsAllowedIndexForAddress(std::size_t index) {
 | 
			
		||||
    return index < AddressSpaceInfos.size() && AddressSpaceInfos[index].address != Size_Invalid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
const KAddressSpaceInfo& GetAddressSpaceInfo(size_t width, KAddressSpaceInfo::Type type) {
 | 
			
		||||
    for (auto& info : AddressSpaceInfos) {
 | 
			
		||||
        if (info.bit_width == width && info.type == type) {
 | 
			
		||||
            return info;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    UNREACHABLE_MSG("Could not find AddressSpaceInfo");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
u64 KAddressSpaceInfo::GetAddressSpaceStart(std::size_t width, Type type) {
 | 
			
		||||
    const std::size_t index{static_cast<std::size_t>(type)};
 | 
			
		||||
    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;
 | 
			
		||||
uintptr_t KAddressSpaceInfo::GetAddressSpaceStart(size_t width, KAddressSpaceInfo::Type type) {
 | 
			
		||||
    return GetAddressSpaceInfo(width, type).address;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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:
 | 
			
		||||
        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;
 | 
			
		||||
size_t KAddressSpaceInfo::GetAddressSpaceSize(size_t width, KAddressSpaceInfo::Type type) {
 | 
			
		||||
    return GetAddressSpaceInfo(width, type).size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Kernel
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user