Changeset ff9f858 in mainline for src/mm/page.c


Ignore:
Timestamp:
2005-06-30T23:27:02Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a1a03f9
Parents:
992bbb97
Message:

Generic 4-level page tables interface & implementation (review & test).
Implement more architecture dependant macros on IA-32.
Provide fake implementation on IA-64 and MIPS.
Convert map_page_to_frame() to use the new interface.
Move adjusted map_page_to_frame() from IA-32's arch/mm/page.c to the generic mm/page.c.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/mm/page.c

    r992bbb97 rff9f858  
    2828
    2929#include <mm/page.h>
     30#include <mm/frame.h>
    3031#include <arch/mm/page.h>
    3132#include <arch/types.h>
    3233#include <typedefs.h>
     34#include <arch/asm.h>
    3335
    3436void page_init(void)
     
    5961
    6062}
     63
     64/** Map page to frame
     65 *
     66 * Map virtual address 'page' to physical address 'frame'
     67 * using 'flags'. Allocate and setup any missing page tables.
     68 *
     69 * @param page Virtual address of the page to be mapped.
     70 * @param frame Physical address of memory frame to which the mapping is done.
     71 * @param flags Flags to be used for mapping.
     72 * @param root Explicit PTL0 address.
     73 */
     74void map_page_to_frame(__address page, __address frame, int flags, __address root)
     75{
     76        pte_t *ptl0, *ptl1, *ptl2, *ptl3;
     77        __address newpt;
     78
     79        ptl0 = (pte_t *) PA2KA(root ? root : (__address) GET_PTL0_ADDRESS());
     80
     81        if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) {
     82                newpt = frame_alloc(FRAME_KA);
     83                memsetb(newpt, PAGE_SIZE, 0);
     84                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
     85                SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER);
     86        }
     87
     88        ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
     89
     90        if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) {
     91                newpt = frame_alloc(FRAME_KA);
     92                memsetb(newpt, PAGE_SIZE, 0);
     93                SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
     94                SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER);
     95        }
     96
     97        ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
     98
     99        if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) {
     100                newpt = frame_alloc(FRAME_KA);
     101                memsetb(newpt, PAGE_SIZE, 0);
     102                SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
     103                SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER);
     104        }
     105
     106        ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
     107
     108        SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame);
     109        SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags);
     110}
Note: See TracChangeset for help on using the changeset viewer.