Skip to content

Commit f50ed2c

Browse files
authored
Add vaddr_t and get_vaddr_t_from_ptr (#5)
* Add get_vaddr_t_from_ptr * Use get_vaddr_t_from_ptr to simplify some code * Format * Add get_vaddr_hhdm * Format * Use get_vaddr_hhdm instead of inline address manipulation * Mark get_vaddr_hhdm as inline * Add functions to header file * Add comment for gvtfp
1 parent f853798 commit f50ed2c

2 files changed

Lines changed: 65 additions & 36 deletions

File tree

include/kernel/memmgt.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,19 @@ typedef struct {
7676
uint8_t* map;
7777
} memmap_bitmap;
7878

79+
typedef struct {
80+
uint8_t pml4_index;
81+
uint8_t pdpt_index;
82+
uint8_t pd_index;
83+
uint8_t pt_index;
84+
uint16_t offset;
85+
} vaddr_t;
86+
7987
typedef uint64_t* paddr_t;
8088

89+
vaddr_t get_vaddr_t_from_ptr (void* ptr);
90+
void* get_vaddr_hhdm (uint64_t phys_address);
91+
8192
void init_memmgt (uint64_t, struct limine_memmap_response*);
8293
void walk_pagetable (void);
8394
void* get_paddr (void* vaddr);

src/kernel/memmgt.c

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3360
paddr_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
*/
201227
void* 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

Comments
 (0)