@@ -65,3 +65,122 @@ const struct memory_ops ppt_mem_ops = {
65
65
.get_pdpt_page = ppt_get_pdpt_page ,
66
66
.get_pd_page = ppt_get_pd_page ,
67
67
};
68
+
69
+ /* The size of the guest physical address space, covered by the EPT page table of a VM */
70
+ #define EPT_ADDRESS_SPACE (size ) ((size != 0UL) ? (size + PLATFORM_LO_MMIO_SIZE) : 0UL)
71
+ DEFINE_PGTABLE_PAGE (vm0_ , pml4 , PML4 , EPT_ADDRESS_SPACE (CONFIG_SOS_RAM_SIZE ));
72
+ DEFINE_PGTABLE_PAGE (vm0_ , pdpt , PDPT , EPT_ADDRESS_SPACE (CONFIG_SOS_RAM_SIZE ));
73
+ DEFINE_PGTABLE_PAGE (vm0_ , pd , PD , EPT_ADDRESS_SPACE (CONFIG_SOS_RAM_SIZE ));
74
+ DEFINE_PGTABLE_PAGE (vm0_ , pt , PT , EPT_ADDRESS_SPACE (CONFIG_SOS_RAM_SIZE ));
75
+
76
+ /* uos_nworld_pml4_pages[i] is ...... of UOS i (whose vm_id = i +1) */
77
+ static struct page uos_nworld_pml4_pages [CONFIG_MAX_VM_NUM - 1U ][PML4_PAGE_NUM (EPT_ADDRESS_SPACE (CONFIG_UOS_RAM_SIZE ))];
78
+ static struct page uos_nworld_pdpt_pages [CONFIG_MAX_VM_NUM - 1U ][PDPT_PAGE_NUM (EPT_ADDRESS_SPACE (CONFIG_UOS_RAM_SIZE ))];
79
+ static struct page uos_nworld_pd_pages [CONFIG_MAX_VM_NUM - 1U ][PD_PAGE_NUM (EPT_ADDRESS_SPACE (CONFIG_UOS_RAM_SIZE ))];
80
+ static struct page uos_nworld_pt_pages [CONFIG_MAX_VM_NUM - 1U ][PT_PAGE_NUM (EPT_ADDRESS_SPACE (CONFIG_UOS_RAM_SIZE ))];
81
+
82
+ #define TRUSTY_PML4_PAGE_NUM (size ) (1UL)
83
+ #define TRUSTY_PDPT_PAGE_NUM (size ) (1UL)
84
+ #define TRUSTY_PD_PAGE_NUM (size ) (PD_PAGE_NUM(size))
85
+ #define TRUSTY_PT_PAGE_NUM (size ) (PT_PAGE_NUM(size))
86
+ #define TRUSTY_PGTABLE_PAGE_NUM (size ) \
87
+ (TRUSTY_PML4_PAGE_NUM(size) + TRUSTY_PDPT_PAGE_NUM(size) + TRUSTY_PD_PAGE_NUM(size) + TRUSTY_PT_PAGE_NUM(size))
88
+
89
+ static struct page uos_sworld_pgtable_pages [CONFIG_MAX_VM_NUM - 1U ][TRUSTY_PGTABLE_PAGE_NUM (TRUSTY_RAM_SIZE )];
90
+
91
+ /* ept: extended page table*/
92
+ static union pgtable_pages_info ept_pages_info [CONFIG_MAX_VM_NUM ] = {
93
+ {
94
+ .ept = {
95
+ .top_address_space = EPT_ADDRESS_SPACE (CONFIG_SOS_RAM_SIZE ),
96
+ .nworld_pml4_base = vm0_pml4_pages ,
97
+ .nworld_pdpt_base = vm0_pdpt_pages ,
98
+ .nworld_pd_base = vm0_pd_pages ,
99
+ .nworld_pt_base = vm0_pt_pages ,
100
+ },
101
+ },
102
+ };
103
+
104
+ static inline uint64_t ept_get_default_access_right (void )
105
+ {
106
+ return EPT_RWX ;
107
+ }
108
+
109
+ static inline uint64_t ept_pgentry_present (uint64_t pte )
110
+ {
111
+ return pte & EPT_RWX ;
112
+ }
113
+
114
+ static inline struct page * ept_get_pml4_page (const union pgtable_pages_info * info , __unused uint64_t gpa )
115
+ {
116
+ struct page * page ;
117
+ if (gpa < TRUSTY_EPT_REBASE_GPA ) {
118
+ page = info -> ept .nworld_pml4_base ;
119
+ } else {
120
+ page = info -> ept .sworld_pgtable_base ;
121
+ }
122
+ (void )memset (page , 0U , PAGE_SIZE );
123
+ return page ;
124
+ }
125
+
126
+ static inline struct page * ept_get_pdpt_page (const union pgtable_pages_info * info , uint64_t gpa )
127
+ {
128
+ struct page * page ;
129
+ if (gpa < TRUSTY_EPT_REBASE_GPA ) {
130
+ page = info -> ept .nworld_pdpt_base + (gpa >> PML4E_SHIFT );
131
+ } else {
132
+ page = info -> ept .sworld_pgtable_base + TRUSTY_PML4_PAGE_NUM (TRUSTY_EPT_REBASE_GPA ) +
133
+ ((gpa - TRUSTY_EPT_REBASE_GPA ) >> PML4E_SHIFT );
134
+ }
135
+ (void )memset (page , 0U , PAGE_SIZE );
136
+ return page ;
137
+ }
138
+
139
+ static inline struct page * ept_get_pd_page (const union pgtable_pages_info * info , uint64_t gpa )
140
+ {
141
+ struct page * page ;
142
+ if (gpa < TRUSTY_EPT_REBASE_GPA ) {
143
+ page = info -> ept .nworld_pd_base + (gpa >> PDPTE_SHIFT );
144
+ } else {
145
+ page = info -> ept .sworld_pgtable_base + TRUSTY_PML4_PAGE_NUM (TRUSTY_EPT_REBASE_GPA ) +
146
+ TRUSTY_PDPT_PAGE_NUM (TRUSTY_EPT_REBASE_GPA ) + ((gpa - TRUSTY_EPT_REBASE_GPA ) >> PDPTE_SHIFT );
147
+ }
148
+ (void )memset (page , 0U , PAGE_SIZE );
149
+ return page ;
150
+ }
151
+
152
+ static inline struct page * ept_get_pt_page (const union pgtable_pages_info * info , uint64_t gpa )
153
+ {
154
+ struct page * page ;
155
+ if (gpa < TRUSTY_EPT_REBASE_GPA ) {
156
+ page = info -> ept .nworld_pt_base + (gpa >> PDE_SHIFT );
157
+ } else {
158
+ page = info -> ept .sworld_pgtable_base + TRUSTY_PML4_PAGE_NUM (TRUSTY_EPT_REBASE_GPA ) +
159
+ TRUSTY_PDPT_PAGE_NUM (TRUSTY_EPT_REBASE_GPA ) + TRUSTY_PD_PAGE_NUM (TRUSTY_EPT_REBASE_GPA ) +
160
+ ((gpa - TRUSTY_EPT_REBASE_GPA ) >> PDE_SHIFT );
161
+ }
162
+ (void )memset (page , 0U , PAGE_SIZE );
163
+ return page ;
164
+ }
165
+
166
+ void init_ept_mem_ops (struct vm * vm )
167
+ {
168
+ uint16_t vm_id = vm -> vm_id ;
169
+ if (vm_id != 0U ) {
170
+ ept_pages_info [vm_id ].ept .top_address_space = EPT_ADDRESS_SPACE (CONFIG_UOS_RAM_SIZE );
171
+ ept_pages_info [vm_id ].ept .nworld_pml4_base = uos_nworld_pml4_pages [vm_id - 1U ];
172
+ ept_pages_info [vm_id ].ept .nworld_pdpt_base = uos_nworld_pdpt_pages [vm_id - 1U ];
173
+ ept_pages_info [vm_id ].ept .nworld_pd_base = uos_nworld_pd_pages [vm_id - 1U ];
174
+ ept_pages_info [vm_id ].ept .nworld_pt_base = uos_nworld_pt_pages [vm_id - 1U ];
175
+ ept_pages_info [vm_id ].ept .sworld_pgtable_base = uos_sworld_pgtable_pages [vm_id - 1U ];
176
+ }
177
+ vm -> arch_vm .ept_mem_ops .info = & ept_pages_info [vm_id ];
178
+
179
+ vm -> arch_vm .ept_mem_ops .get_default_access_right = ept_get_default_access_right ;
180
+ vm -> arch_vm .ept_mem_ops .pgentry_present = ept_pgentry_present ;
181
+ vm -> arch_vm .ept_mem_ops .get_pml4_page = ept_get_pml4_page ;
182
+ vm -> arch_vm .ept_mem_ops .get_pdpt_page = ept_get_pdpt_page ;
183
+ vm -> arch_vm .ept_mem_ops .get_pd_page = ept_get_pd_page ;
184
+ vm -> arch_vm .ept_mem_ops .get_pt_page = ept_get_pt_page ;
185
+
186
+ }
0 commit comments