Changes in kernel/genarch/src/mm/as_pt.c [ada559c:d99c1d2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/as_pt.c
rada559c rd99c1d2 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Address space functions for 4-level hierarchical pagetables. 36 36 */ 37 37 … … 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 ipl_t ipl = interrupts_disable(); 87 mutex_lock(&AS_KERNEL->lock); 88 89 pte_t *src_ptl0 = 90 (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 91 92 uintptr_t src = 93 (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 94 uintptr_t dst = 95 (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 96 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 97 95 memsetb(dst_ptl0, table_size, 0); 98 memcpy((void *) dst, (void *) src, 99 table_size - (src - (uintptr_t) src_ptl0)); 100 96 memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0)); 101 97 mutex_unlock(&AS_KERNEL->lock); 102 98 interrupts_restore(ipl); 103 99 } 104 100 105 101 return (pte_t *) KA2PA((uintptr_t) dst_ptl0); 106 102 } … … 111 107 * 112 108 * @param page_table Physical address of PTL0. 113 *114 109 */ 115 110 void ptl0_destroy(pte_t *page_table) 116 111 { 117 frame_free((uintptr_t) 112 frame_free((uintptr_t)page_table); 118 113 } 119 114 … … 123 118 * Interrupts must be disabled. 124 119 * 125 * @param as 120 * @param as Address space. 126 121 * @param lock If false, do not attempt to lock the address space. 127 *128 122 */ 129 123 void pt_lock(as_t *as, bool lock) … … 138 132 * Interrupts must be disabled. 139 133 * 140 * @param as 134 * @param as Address space. 141 135 * @param unlock If false, do not attempt to unlock the address space. 142 *143 136 */ 144 137 void pt_unlock(as_t *as, bool unlock) … … 148 141 } 149 142 150 /** Test whether page tables are locked.151 *152 * @param as Address space where the page tables belong.153 *154 * @return True if the page tables belonging to the address soace155 * are locked, otherwise false.156 */157 bool pt_locked(as_t *as)158 {159 return mutex_locked(&as->lock);160 }161 162 143 /** @} 163 144 */
Note:
See TracChangeset
for help on using the changeset viewer.