@@ -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