Subversion Repositories HelenOS

Rev

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

Rev 2242 Rev 2255
Line 42... Line 42...
42
#include <arch/mm/page.h>
42
#include <arch/mm/page.h>
43
#include <arch/mm/as.h>
43
#include <arch/mm/as.h>
44
#include <arch/types.h>
44
#include <arch/types.h>
45
#include <arch/asm.h>
45
#include <arch/asm.h>
46
#include <memstr.h>
46
#include <memstr.h>
-
 
47
#include "../../arch/arm32/src/aux_print/printf.h"
47
 
48
 
48
static void pt_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags);
49
static void pt_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags);
49
static void pt_mapping_remove(as_t *as, uintptr_t page);
50
static void pt_mapping_remove(as_t *as, uintptr_t page);
50
static pte_t *pt_mapping_find(as_t *as, uintptr_t page);
51
static pte_t *pt_mapping_find(as_t *as, uintptr_t page);
51
 
52
 
Line 74... Line 75...
74
 
75
 
75
    ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table);
76
    ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table);
76
 
77
 
77
    if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) {
78
    if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) {
78
        newpt = (pte_t *)frame_alloc(PTL1_SIZE, FRAME_KA);
79
        newpt = (pte_t *)frame_alloc(PTL1_SIZE, FRAME_KA);
79
        memsetb((uintptr_t)newpt, PAGE_SIZE, 0);
80
        memsetb((uintptr_t)newpt, FRAME_SIZE << PTL1_SIZE, 0);
80
        SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
81
        SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
81
        SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
82
        SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
82
    }
83
    }
83
 
84
 
84
    ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
85
    ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
85
 
86
 
86
    if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) {
87
    if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) {
87
        newpt = (pte_t *)frame_alloc(PTL2_SIZE, FRAME_KA);
88
        newpt = (pte_t *)frame_alloc(PTL2_SIZE, FRAME_KA);
88
        memsetb((uintptr_t)newpt, PAGE_SIZE, 0);
89
        memsetb((uintptr_t)newpt, FRAME_SIZE << PTL2_SIZE, 0);
89
        SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
90
        SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
90
        SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
91
        SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
91
    }
92
    }
92
 
93
 
93
    ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
94
    ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
94
 
95
 
95
    if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) {
96
    if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) {
96
        newpt = (pte_t *)frame_alloc(PTL3_SIZE, FRAME_KA);
97
        newpt = (pte_t *)frame_alloc(PTL3_SIZE, FRAME_KA);
97
        memsetb((uintptr_t)newpt, PAGE_SIZE, 0);
98
        memsetb((uintptr_t)newpt, FRAME_SIZE << PTL3_SIZE, 0);
98
        SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
99
        SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
99
        SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
100
        SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE);
100
    }
101
    }
101
 
102
 
102
    ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
103
    ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));