Changeset b0c2075 in mainline for kernel/genarch/src/mm/page_pt.c


Ignore:
Timestamp:
2013-09-10T17:48:57Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
85147f3
Parents:
86733f3
Message:

new physical memory allocator supporting physical address constrains
the buddy allocator framework is retired and replaced by a two-level bitmap
the allocator can allocate an arbitrary number of frames, not only a power-of-two count

Caution: Change of semantics
The physical memory allocator no longer allocates naturally aligned blocks. If you require an aligned block, specify it as the constraint.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/mm/page_pt.c

    r86733f3 rb0c2075  
    8282       
    8383        if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) {
    84                 pte_t *newpt = (pte_t *) PA2KA(frame_alloc(PTL1_SIZE,
    85                     FRAME_LOWMEM, 0));
    86                 memsetb(newpt, FRAME_SIZE << PTL1_SIZE, 0);
     84                pte_t *newpt = (pte_t *)
     85                    PA2KA(frame_alloc(PTL1_FRAMES, FRAME_LOWMEM, 0));
     86                memsetb(newpt, FRAMES2SIZE(PTL1_FRAMES), 0);
    8787                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
    8888                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page),
     
    101101       
    102102        if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) {
    103                 pte_t *newpt = (pte_t *) PA2KA(frame_alloc(PTL2_SIZE,
    104                     FRAME_LOWMEM, 0));
    105                 memsetb(newpt, FRAME_SIZE << PTL2_SIZE, 0);
     103                pte_t *newpt = (pte_t *)
     104                    PA2KA(frame_alloc(PTL2_FRAMES, FRAME_LOWMEM, 0));
     105                memsetb(newpt, FRAMES2SIZE(PTL2_FRAMES), 0);
    106106                SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
    107107                SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page),
     
    118118       
    119119        if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) {
    120                 pte_t *newpt = (pte_t *) PA2KA(frame_alloc(PTL3_SIZE,
    121                     FRAME_LOWMEM, 0));
    122                 memsetb(newpt, FRAME_SIZE << PTL3_SIZE, 0);
     120                pte_t *newpt = (pte_t *)
     121                    PA2KA(frame_alloc(PTL3_FRAMES, FRAME_LOWMEM, 0));
     122                memsetb(newpt, FRAMES2SIZE(PTL3_FRAMES), 0);
    123123                SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
    124124                SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page),
     
    371371        uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table);
    372372        uintptr_t ptl0_step = ptl0_step_get();
    373         size_t order;
     373        size_t frames;
    374374       
    375375#if (PTL1_ENTRIES != 0)
    376         order = PTL1_SIZE;
     376        frames = PTL1_FRAMES;
    377377#elif (PTL2_ENTRIES != 0)
    378         order = PTL2_SIZE;
     378        frames = PTL2_FRAMES;
    379379#else
    380         order = PTL3_SIZE;
     380        frames = PTL3_FRAMES;
    381381#endif
    382382       
     
    384384            addr - 1 < base + size - 1;
    385385            addr += ptl0_step) {
    386                 uintptr_t l1 = PA2KA(frame_alloc(order, FRAME_LOWMEM, 0));
    387                 memsetb((void *) l1, FRAME_SIZE << order, 0);
     386                uintptr_t l1 = PA2KA(frame_alloc(frames, FRAME_LOWMEM, 0));
     387                memsetb((void *) l1, FRAMES2SIZE(frames), 0);
    388388                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
    389389                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
Note: See TracChangeset for help on using the changeset viewer.