Skip to content

Commit 26b68ec

Browse files
author
Diego Ferrari
committed
[PAGE_ALLOC] access page data from high
1 parent e83b28e commit 26b68ec

3 files changed

Lines changed: 12 additions & 10 deletions

File tree

kernel/hw/hw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void detect_hardware(){
9292
void hw_high_va(){
9393
if (UART0_BASE) UART0_BASE |= HIGH_VA;
9494
if (MMIO_BASE) MMIO_BASE |= HIGH_VA;
95-
if (BOARD_TYPE != 1 && PCI_BASE)//virt is probably doing some weird PCI address stuff already
95+
if (BOARD_TYPE != 1 && PCI_BASE)
9696
PCI_BASE |= HIGH_VA;
9797
if (GICD_BASE) GICD_BASE |= HIGH_VA;
9898
if (GICC_BASE) GICC_BASE |= HIGH_VA;

kernel/memory/mmu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ void debug_mmu_address(uint64_t va){
301301
uint64_t l2_index = (va >> 21) & 0x1FF;
302302
uint64_t l3_index = (va >> 12) & 0x1FF;
303303

304-
kprintf("Address %x is meant to be mapped to [%i][%i][%i][%i]",va, l0_index,l1_index,l2_index,l3_index);
304+
kprintf("Address %llx is meant to be mapped to [%i][%i][%i][%i]",va, l0_index,l1_index,l2_index,l3_index);
305305

306306
if (!(table[l0_index] & 1)) {
307307
kprintf("L1 Table missing");

kernel/memory/page_allocator.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ void* kalloc_inner(void *page, uint64_t size, uint16_t alignment, uint8_t level,
217217

218218
kprintfv("[in_page_alloc] Requested size: %x", size);
219219

220-
mem_page *info = (mem_page*)page;
220+
mem_page *info = (mem_page*)PHYS_TO_VIRT_P(page);
221221

222222
if (size >= PAGE_SIZE){
223223
void* ptr = palloc(size, level, info->attributes, true);
@@ -246,22 +246,24 @@ void* kalloc_inner(void *page, uint64_t size, uint16_t alignment, uint8_t level,
246246
return ptr;
247247
}
248248

249-
FreeBlock** curr = &info->free_list;
250-
while (*curr && (uintptr_t)(*curr) != 0xDEADBEEF && (uintptr_t)(*curr) != 0xDEADBEEFDEADBEEF) {
251-
if ((*curr)->size >= size) {
249+
FreeBlock** curr = PHYS_TO_VIRT_P(&info->free_list);
250+
FreeBlock *cblock = *curr;
251+
while (cblock && (uintptr_t)cblock != 0xDEADBEEF && (uintptr_t)cblock != 0xDEADBEEFDEADBEEF) {
252+
if (cblock->size >= size) {
252253
kprintfv("[in_page_alloc] Reusing free block at %x",(uintptr_t)*curr);
253254

254-
uint64_t result = (uint64_t)*curr;
255-
*curr = (*curr)->next;
255+
uint64_t result = (uint64_t)cblock;
256+
*curr = VIRT_TO_PHYS_P(cblock->next);
256257
memset((void*)result, 0, size);
257258
info->size += size;
258259
if (page_va){
259260
return (void*)(page_va | (result & 0xFFF));
260261
}
261262
return (void*)result;
262263
}
263-
kprintfv("-> %x",(uintptr_t)&(*curr)->next);
264-
curr = &(*curr)->next;
264+
kprintfv("-> %x",(uintptr_t)&cblock->next);
265+
curr = &(cblock)->next;
266+
cblock = *curr;
265267
}
266268

267269
kprintfv("[in_page_alloc] Current next pointer %x",info->next_free_mem_ptr);

0 commit comments

Comments
 (0)