Subversion Repositories HelenOS-historic

Rev

Rev 654 | Rev 687 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 654 Rev 684
Line 31... Line 31...
31
#include <arch/mm/page.h>
31
#include <arch/mm/page.h>
32
#include <arch/types.h>
32
#include <arch/types.h>
33
#include <typedefs.h>
33
#include <typedefs.h>
34
#include <arch/asm.h>
34
#include <arch/asm.h>
35
#include <memstr.h>
35
#include <memstr.h>
-
 
36
#include <debug.h>
-
 
37
 
-
 
38
/** Virtual operations for page subsystem. */
-
 
39
page_operations_t *page_operations = NULL;
36
 
40
 
37
void page_init(void)
41
void page_init(void)
38
{
42
{
39
    page_arch_init();
43
    page_arch_init();
40
    page_mapping_insert(0x0, 0x0, PAGE_NOT_PRESENT, 0);
44
    page_mapping_insert(0x0, 0x0, PAGE_NOT_PRESENT, 0);
Line 71... Line 75...
71
 * @param flags Flags to be used for mapping.
75
 * @param flags Flags to be used for mapping.
72
 * @param root Explicit PTL0 address.
76
 * @param root Explicit PTL0 address.
73
 */
77
 */
74
void page_mapping_insert(__address page, __address frame, int flags, __address root)
78
void page_mapping_insert(__address page, __address frame, int flags, __address root)
75
{
79
{
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);
80
    ASSERT(page_operations);
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);
81
    ASSERT(page_operations->mapping_insert);
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
    }
82
   
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);
83
    page_operations->mapping_insert(page, frame, flags, root);
110
}
84
}
111
 
85
 
112
/** Find mapping for virtual page
86
/** Find mapping for virtual page
113
 *
87
 *
114
 * Find mapping for virtual page.
88
 * Find mapping for virtual page.
Line 118... Line 92...
118
 *
92
 *
119
 * @return NULL if there is no such mapping; entry from PTL3 describing the mapping otherwise.
93
 * @return NULL if there is no such mapping; entry from PTL3 describing the mapping otherwise.
120
 */
94
 */
121
pte_t *page_mapping_find(__address page, __address root)
95
pte_t *page_mapping_find(__address page, __address root)
122
{
96
{
123
    pte_t *ptl0, *ptl1, *ptl2, *ptl3;
97
    ASSERT(page_operations);
124
 
-
 
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)
98
    ASSERT(page_operations->mapping_find);
138
        return NULL;
-
 
139
 
-
 
140
    ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
-
 
141
 
99
 
142
    return &ptl3[PTL3_INDEX(page)];
100
    return page_operations->mapping_find(page, root);
143
}
101
}