Changeset 6d7ffa65 in mainline for generic/src/mm/page.c


Ignore:
Timestamp:
2006-01-08T15:03:41Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1a67595
Parents:
566ba81
Message:

Memory management work.
Move generic 4-level page table interface to genarch
and enable architectures to use different virtual memory
mechanisms (e.g. page hash tables).
Start page hash table support.
Switch ia64 and sparc64 to page hash tables.
Other architectures keep on using 4-level page table interface.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • generic/src/mm/page.c

    r566ba81 r6d7ffa65  
    3434#include <arch/asm.h>
    3535#include <memstr.h>
     36#include <debug.h>
     37
     38/** Virtual operations for page subsystem. */
     39page_operations_t *page_operations = NULL;
    3640
    3741void page_init(void)
     
    7478void page_mapping_insert(__address page, __address frame, int flags, __address root)
    7579{
    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, ONE_FRAME);
    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 | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
    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, ONE_FRAME);
    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 | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
    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, ONE_FRAME);
    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 | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
    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);
     80        ASSERT(page_operations);
     81        ASSERT(page_operations->mapping_insert);
     82       
     83        page_operations->mapping_insert(page, frame, flags, root);
    11084}
    11185
     
    12195pte_t *page_mapping_find(__address page, __address root)
    12296{
    123         pte_t *ptl0, *ptl1, *ptl2, *ptl3;
     97        ASSERT(page_operations);
     98        ASSERT(page_operations->mapping_find);
    12499
    125         ptl0 = (pte_t *) PA2KA(root ? root : (__address) GET_PTL0_ADDRESS());
    126 
    127         if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT)
    128                 return NULL;
    129 
    130         ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
    131 
    132         if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT)
    133                 return NULL;
    134 
    135         ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
    136 
    137         if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT)
    138                 return NULL;
    139 
    140         ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
    141 
    142         return &ptl3[PTL3_INDEX(page)];
     100        return page_operations->mapping_find(page, root);
    143101}
Note: See TracChangeset for help on using the changeset viewer.