@@ -30,6 +30,33 @@ uint64_t read_cr3 () {
3030 return cr3 ;
3131}
3232
33+ /*!
34+ * Get a vaddr_t object from a virtual pointer
35+ * @param ptr the virtual pointer
36+ * @return corresponding vaddr_t object
37+ */
38+ vaddr_t get_vaddr_t_from_ptr (void * ptr ) {
39+ uint64_t ptr_64t = (uint64_t )ptr ;
40+ vaddr_t ret_vaddr ;
41+
42+ ret_vaddr .offset = ptr_64t & 0xFFF ;
43+ ret_vaddr .pt_index = (ptr_64t >> 12 ) & 0x1FF ;
44+ ret_vaddr .pd_index = (ptr_64t >> 21 ) & 0x1FF ;
45+ ret_vaddr .pdpt_index = (ptr_64t >> 30 ) & 0x1FF ;
46+ ret_vaddr .pml4_index = (ptr_64t >> 39 ) & 0x1FF ;
47+
48+ return ret_vaddr ;
49+ }
50+
51+ /*!
52+ * Convert a physical frame address to vaddr pointer with HHDM mapping
53+ * @param phys_address the physical address
54+ * @return pointer to virtual memory using HHDM mapping
55+ */
56+ inline void * get_vaddr_hhdm (uint64_t phys_address ) {
57+ return (void * )((phys_address << 12 ) + hhdm_offset );
58+ }
59+
3360paddr_t alloc_ppage (memmap_bitmap * bitmap ) {
3461 if (bitmap -> pages_used >= bitmap -> pages_maxlen )
3562 return NULL ;
@@ -155,19 +182,18 @@ void walk_pagetable () {
155182 if (!pml4t_entry -> present )
156183 return ;
157184
158- pdpt_entry_t * pdpt_base_ptr =
159- (pdpt_entry_t * )((pml4t_entry -> pdpt_base_address << 12 ) + hhdm_offset );
185+ pdpt_entry_t * pdpt_base_ptr = (pdpt_entry_t * )get_vaddr_hhdm (pml4t_entry -> pdpt_base_address );
160186 pdpt_entry_t * pdpt_entry = & pdpt_base_ptr [0 ];
161187 if (!pdpt_entry -> present )
162188 return ;
163189
164- pd_entry_t * pd_base_ptr = (pd_entry_t * )(( pdpt_entry -> pd_base_address << 12 ) + hhdm_offset );
190+ pd_entry_t * pd_base_ptr = (pd_entry_t * )get_vaddr_hhdm ( pdpt_entry -> pd_base_address );
165191 for (int k = 0 ; k < 512 ; k ++ ) {
166192 pd_entry_t * pd_entry = & pd_base_ptr [k ];
167193 if (!pd_entry -> present )
168194 continue ;
169195 printf ("PD %d: PT Base Address: 0x%lx\n" , k , pd_entry -> pt_base_address << 12 );
170- pt_entry_t * pt_base_ptr = (pt_entry_t * )(( pd_entry -> pt_base_address << 12 ) + hhdm_offset );
196+ pt_entry_t * pt_base_ptr = (pt_entry_t * )get_vaddr_hhdm ( pd_entry -> pt_base_address );
171197
172198 bool is_present_pt [512 ] = {false};
173199 for (int k = 0 ; k < 512 ; k ++ )
@@ -199,35 +225,28 @@ void walk_pagetable () {
199225 * @return The corresponding physical address, or NULL if not mapped.
200226 */
201227void * get_paddr (void * vaddr ) {
202- uint64_t virtual_addr = ( uint64_t ) vaddr ;
228+ vaddr_t virtual_addr = get_vaddr_t_from_ptr ( vaddr ) ;
203229
204- uint64_t pml4_index = (virtual_addr >> 39 ) & 0x1FF ;
205- uint64_t pdpt_index = (virtual_addr >> 30 ) & 0x1FF ;
206- uint64_t pd_index = (virtual_addr >> 21 ) & 0x1FF ;
207- uint64_t pt_index = (virtual_addr >> 12 ) & 0x1FF ;
208- uint64_t page_offset = virtual_addr & 0xFFF ;
209-
210- pml4t_entry_t * pml4t_entry = & pml4_base_ptr [pml4_index ];
230+ pml4t_entry_t * pml4t_entry = & pml4_base_ptr [virtual_addr .pml4_index ];
211231 if (!pml4t_entry -> present )
212232 return NULL ;
213233
214- pdpt_entry_t * pdpt_base_ptr =
215- (pdpt_entry_t * )((pml4t_entry -> pdpt_base_address << 12 ) + hhdm_offset );
216- pdpt_entry_t * pdpt_entry = & pdpt_base_ptr [pdpt_index ];
234+ pdpt_entry_t * pdpt_base_ptr = (pdpt_entry_t * )get_vaddr_hhdm (pml4t_entry -> pdpt_base_address );
235+ pdpt_entry_t * pdpt_entry = & pdpt_base_ptr [virtual_addr .pdpt_index ];
217236 if (!pdpt_entry -> present )
218237 return NULL ;
219238
220- pd_entry_t * pd_base_ptr = (pd_entry_t * )(( pdpt_entry -> pd_base_address << 12 ) + hhdm_offset );
221- pd_entry_t * pd_entry = & pd_base_ptr [pd_index ];
239+ pd_entry_t * pd_base_ptr = (pd_entry_t * )get_vaddr_hhdm ( pdpt_entry -> pd_base_address );
240+ pd_entry_t * pd_entry = & pd_base_ptr [virtual_addr . pd_index ];
222241 if (!pd_entry -> present )
223242 return NULL ;
224243
225- pt_entry_t * pt_base_ptr = (pt_entry_t * )(( pd_entry -> pt_base_address << 12 ) + hhdm_offset );
226- pt_entry_t * pt_entry = & pt_base_ptr [pt_index ];
244+ pt_entry_t * pt_base_ptr = (pt_entry_t * )get_vaddr_hhdm ( pd_entry -> pt_base_address );
245+ pt_entry_t * pt_entry = & pt_base_ptr [virtual_addr . pt_index ];
227246 if (!pt_entry -> present )
228247 return NULL ;
229248
230- uint64_t phys_addr = (pt_entry -> frame_base_address << 12 ) | page_offset ;
249+ uint64_t phys_addr = (pt_entry -> frame_base_address << 12 ) | virtual_addr . offset ;
231250
232251 return (void * )phys_addr ;
233252}
@@ -275,14 +294,13 @@ void* liballoc_alloc (size_t count) {
275294 pml4t_entry_t * pml4t_entry = & pml4_base_ptr [1 ];
276295 if (!pml4t_entry -> present )
277296 return NULL ;
278- pdpt_entry_t * pdpt_entry =
279- & ((pdpt_entry_t * )((pml4t_entry -> pdpt_base_address << 12 ) + hhdm_offset ))[0 ];
297+ pdpt_entry_t * pdpt_entry = & ((pdpt_entry_t * )get_vaddr_hhdm (pml4t_entry -> pdpt_base_address ))[0 ];
280298 if (!pdpt_entry -> present )
281299 return NULL ;
282- pd_entry_t * pd_entry = & ((pd_entry_t * )(( pdpt_entry -> pd_base_address << 12 ) + hhdm_offset ))[0 ];
300+ pd_entry_t * pd_entry = & ((pd_entry_t * )get_vaddr_hhdm ( pdpt_entry -> pd_base_address ))[0 ];
283301 if (!pd_entry -> present )
284302 return NULL ;
285- pt_entry_t * pt_base_ptr = (pt_entry_t * )(( pd_entry -> pt_base_address << 12 ) + hhdm_offset );
303+ pt_entry_t * pt_base_ptr = (pt_entry_t * )get_vaddr_hhdm ( pd_entry -> pt_base_address );
286304
287305 return try_assign_pt (pt_base_ptr , count );
288306}
@@ -293,26 +311,26 @@ int liballoc_free (void* ptr, size_t count) {
293311 if (get_paddr (ptr ) == NULL )
294312 return -1 ;
295313
296- uint64_t virtual_addr = ( uint64_t ) ptr ;
314+ vaddr_t vaddr = get_vaddr_t_from_ptr ( ptr ) ;
297315
298- pml4t_entry_t * pml4t_entry = & pml4_base_ptr [( virtual_addr >> 39 ) & 0x1FF ];
299- if (!pml4t_entry -> present || (( virtual_addr >> 39 ) & 0x1FF ) != 1 )
316+ pml4t_entry_t * pml4t_entry = & pml4_base_ptr [vaddr . pml4_index ];
317+ if (!pml4t_entry -> present || vaddr . pml4_index != 1 )
300318 return -2 ;
301- pdpt_entry_t * pdpt_entry = & (( pdpt_entry_t * )(( pml4t_entry -> pdpt_base_address << 12 ) +
302- hhdm_offset ))[( virtual_addr >> 30 ) & 0x1FF ];
303- if (!pdpt_entry -> present || (( virtual_addr >> 30 ) & 0x1FF ) != 0 )
319+ pdpt_entry_t * pdpt_entry =
320+ & (( pdpt_entry_t * ) get_vaddr_hhdm ( pml4t_entry -> pdpt_base_address ))[ vaddr . pdpt_index ];
321+ if (!pdpt_entry -> present || vaddr . pdpt_index != 0 )
304322 return -3 ;
305- pd_entry_t * pd_entry = & (( pd_entry_t * )(( pdpt_entry -> pd_base_address << 12 ) +
306- hhdm_offset ))[( virtual_addr >> 21 ) & 0x1FF ];
307- if (!pd_entry -> present || (( virtual_addr >> 21 ) & 0x1FF ) != 0 )
323+ pd_entry_t * pd_entry =
324+ & (( pd_entry_t * ) get_vaddr_hhdm ( pdpt_entry -> pd_base_address ))[ vaddr . pd_index ];
325+ if (!pd_entry -> present || vaddr . pd_index != 0 )
308326 return -4 ;
309- pt_entry_t * pt_base_ptr = (pt_entry_t * )(( pd_entry -> pt_base_address << 12 ) + hhdm_offset );
327+ pt_entry_t * pt_base_ptr = (pt_entry_t * )get_vaddr_hhdm ( pd_entry -> pt_base_address );
310328
311329 for (size_t i = 0 ; i < count ; i ++ ) {
312- if (i + (( virtual_addr >> 12 ) & 0x1FF ) >= 512 )
330+ if (i + vaddr . pt_index >= 512 )
313331 return -5 ; // out of bounds
314332
315- pt_entry_t * pt_entry = & pt_base_ptr [i + (( virtual_addr >> 12 ) & 0x1FF ) ];
333+ pt_entry_t * pt_entry = & pt_base_ptr [i + vaddr . pt_index ];
316334 if (!pt_entry -> allocated )
317335 return -6 ;
318336
0 commit comments