5export module zxfoundation.dgp.isolation.types;
6import zxfoundation.base.types;
7import zxfoundation.base.typestate;
8import arch.s390x.mmu.types;
12namespace zxfoundation::dgp::isolation {
15 inline constexpr u8 STORAGE_KEY_AUTO = 0xFFU;
18 inline constexpr u8 STORAGE_KEY_COUNT = 16U;
21 inline constexpr u8 STORAGE_KEY_USER_BASE = 8U;
24 inline constexpr u8 STORAGE_KEY_USER_MAX = 15U;
27 enum class isolation_feature : u64 {
30 storage_key = 1ULL << 1,
31 program_call = 1ULL << 2,
32 access_register = 1ULL << 3,
33 edat_large_page = 1ULL << 4,
34 numa_policy = 1ULL << 5,
35 transactional_vm = 1ULL << 6,
36 smp_invalidation = 1ULL << 7,
40 enum class skey_revocation_state : u8 {
48 enum class isolation_rights : u32 {
69 [[nodiscard]]
constexpr auto operator|(
70 isolation_feature lhs,
72 )
noexcept -> isolation_feature {
73 return static_cast<isolation_feature>(
74 static_cast<u64>(lhs) |
static_cast<u64>(rhs));
81 [[nodiscard]]
constexpr auto operator&(
82 isolation_feature lhs,
84 )
noexcept -> isolation_feature {
85 return static_cast<isolation_feature>(
86 static_cast<u64>(lhs) &
static_cast<u64>(rhs));
93 [[nodiscard]]
constexpr auto operator|(
94 dgp::isolation::isolation_rights lhs,
95 dgp::isolation::isolation_rights rhs
96 )
noexcept -> dgp::isolation::isolation_rights {
97 return static_cast<dgp::isolation::isolation_rights>(
98 static_cast<u32>(lhs) |
static_cast<u32>(rhs));
105 [[nodiscard]]
constexpr auto operator&(
106 dgp::isolation::isolation_rights lhs,
107 dgp::isolation::isolation_rights rhs
108 )
noexcept -> dgp::isolation::isolation_rights {
109 return static_cast<dgp::isolation::isolation_rights>(
110 static_cast<u32>(lhs) &
static_cast<u32>(rhs));
117 [[nodiscard]]
constexpr auto has_all_features(
118 isolation_feature available,
119 isolation_feature requested
121 return (
static_cast<u64>(available & requested) ==
static_cast<u64>(requested));
128 [[nodiscard]]
constexpr auto has_all_rights(
129 dgp::isolation::isolation_rights available,
130 dgp::isolation::isolation_rights requested
132 return (
static_cast<u32>(available & requested) ==
static_cast<u32>(requested));
136 struct isolation_policy {
137 isolation_feature required_features{isolation_feature::none};
138 dgp::isolation::isolation_rights default_rights{dgp::isolation::isolation_rights::none};
139 u8 storage_key{STORAGE_KEY_AUTO};
141 bool allow_portals{
false};
142 bool allow_user_execute{
false};
143 bool bootstrap_admin{
false};
147 struct isolation_domain_state {
149 arch::s390x::mmu::typed_asce<arch::s390x::mmu::dat_level::region_1> asce{};
153 u16 revocation_epoch{0};
154 u32 storage_key_generation{0};
155 skey_revocation_state storage_key_state{skey_revocation_state::none};
156 dgp::isolation::isolation_rights granted_rights{dgp::isolation::isolation_rights::none};
159 static_assert(
sizeof(isolation_feature) ==
sizeof(u64),
"DGP feature mask must remain 64-bit");
160 static_assert(
sizeof(dgp::isolation::isolation_rights) ==
sizeof(u32),
"DGP rights mask must remain 32-bit");
161 static_assert(
sizeof(zxfoundation::base::lifecycle_state) ==
sizeof(u8),
"DGP lifecycle state must remain byte-sized");
162 static_assert(
sizeof(skey_revocation_state) ==
sizeof(u8),
"DGP storage-key revocation state must remain byte-sized");
163 static_assert(
static_cast<u8>(zxfoundation::base::lifecycle_state::embryo) == 0U,
"Embryo must be the zero state");
164 static_assert(
static_cast<u8>(skey_revocation_state::none) == 0U,
"Storage-key revocation none state must be zero");
165 static_assert(
static_cast<u32>(dgp::isolation::isolation_rights::all) == 0x0000'FFFFU,
"all rights must be the low 16 bits");
166 static_assert(STORAGE_KEY_USER_MAX < STORAGE_KEY_COUNT,
"User storage-key range exceeds architected key count");