Changes in kernel/genarch/src/mm/as_pt.c [fdaad75d:af863d0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/as_pt.c
rfdaad75d raf863d0 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Address space functions for 4-level hierarchical pagetables. 36 36 */ 37 37 … … 43 43 #include <arch/mm/page.h> 44 44 #include <arch/mm/as.h> 45 #include < typedefs.h>45 #include <arch/types.h> 46 46 #include <memstr.h> 47 47 #include <arch.h> 48 48 49 static pte_t *ptl0_create( unsigned int);50 static void ptl0_destroy(pte_t * );49 static pte_t *ptl0_create(int flags); 50 static void ptl0_destroy(pte_t *page_table); 51 51 52 static void pt_lock(as_t *, bool); 53 static void pt_unlock(as_t *, bool); 54 static bool pt_locked(as_t *); 52 static void pt_lock(as_t *as, bool lock); 53 static void pt_unlock(as_t *as, bool unlock); 55 54 56 55 as_operations_t as_pt_operations = { … … 58 57 .page_table_destroy = ptl0_destroy, 59 58 .page_table_lock = pt_lock, 60 .page_table_unlock = pt_unlock, 61 .page_table_locked = pt_locked, 59 .page_table_unlock = pt_unlock 62 60 }; 63 61 … … 69 67 * 70 68 * @return New PTL0. 71 *72 69 */ 73 pte_t *ptl0_create( unsignedint flags)70 pte_t *ptl0_create(int flags) 74 71 { 75 pte_t *dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA); 76 size_t table_size = FRAME_SIZE << PTL0_SIZE; 72 pte_t *src_ptl0, *dst_ptl0; 73 ipl_t ipl; 74 int table_size; 75 76 dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA); 77 table_size = FRAME_SIZE << PTL0_SIZE; 78 79 if (flags & FLAG_AS_KERNEL) { 80 memsetb(dst_ptl0, table_size, 0); 81 } else { 82 uintptr_t src, dst; 77 83 78 if (flags & FLAG_AS_KERNEL)79 memsetb(dst_ptl0, table_size, 0);80 else {81 84 /* 82 85 * Copy the kernel address space portion to new PTL0. 83 *84 86 */ 85 86 mutex_lock(&AS_KERNEL->lock); 87 88 pte_t *src_ptl0 = 89 (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 90 91 uintptr_t src = 92 (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 93 uintptr_t dst = 94 (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 95 87 88 ipl = interrupts_disable(); 89 mutex_lock(&AS_KERNEL->lock); 90 src_ptl0 = (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 91 92 src = (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 93 dst = (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 94 96 95 memsetb(dst_ptl0, table_size, 0); 97 memcpy((void *) dst, (void *) src, 98 table_size - (src - (uintptr_t) src_ptl0)); 99 96 memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0)); 100 97 mutex_unlock(&AS_KERNEL->lock); 98 interrupts_restore(ipl); 101 99 } 102 100 103 101 return (pte_t *) KA2PA((uintptr_t) dst_ptl0); 104 102 } … … 109 107 * 110 108 * @param page_table Physical address of PTL0. 111 *112 109 */ 113 110 void ptl0_destroy(pte_t *page_table) 114 111 { 115 frame_free((uintptr_t) 112 frame_free((uintptr_t)page_table); 116 113 } 117 114 … … 121 118 * Interrupts must be disabled. 122 119 * 123 * @param as 120 * @param as Address space. 124 121 * @param lock If false, do not attempt to lock the address space. 125 *126 122 */ 127 123 void pt_lock(as_t *as, bool lock) … … 136 132 * Interrupts must be disabled. 137 133 * 138 * @param as 134 * @param as Address space. 139 135 * @param unlock If false, do not attempt to unlock the address space. 140 *141 136 */ 142 137 void pt_unlock(as_t *as, bool unlock) … … 146 141 } 147 142 148 /** Test whether page tables are locked.149 *150 * @param as Address space where the page tables belong.151 *152 * @return True if the page tables belonging to the address soace153 * are locked, otherwise false.154 */155 bool pt_locked(as_t *as)156 {157 return mutex_locked(&as->lock);158 }159 160 143 /** @} 161 144 */
Note:
See TracChangeset
for help on using the changeset viewer.