Changeset da1bafb in mainline for kernel/genarch/src/mm/as_pt.c
- Timestamp:
- 2010-05-24T18:57:31Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0095368
- Parents:
- 666f492
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/as_pt.c
r666f492 rda1bafb 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( int flags);50 static void ptl0_destroy(pte_t * page_table);49 static pte_t *ptl0_create(unsigned int); 50 static void ptl0_destroy(pte_t *); 51 51 52 static void pt_lock(as_t * as, bool lock);53 static void pt_unlock(as_t * as, bool unlock);52 static void pt_lock(as_t *, bool); 53 static void pt_unlock(as_t *, bool); 54 54 55 55 as_operations_t as_pt_operations = { … … 67 67 * 68 68 * @return New PTL0. 69 * 69 70 */ 70 pte_t *ptl0_create( int flags)71 pte_t *ptl0_create(unsigned int flags) 71 72 { 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) { 73 pte_t *dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA); 74 size_t table_size = FRAME_SIZE << PTL0_SIZE; 75 76 if (flags & FLAG_AS_KERNEL) 80 77 memsetb(dst_ptl0, table_size, 0); 81 } else { 82 uintptr_t src, dst; 83 78 else { 84 79 /* 85 80 * Copy the kernel address space portion to new PTL0. 81 * 86 82 */ 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 83 84 ipl_t ipl = interrupts_disable(); 85 mutex_lock(&AS_KERNEL->lock); 86 87 pte_t *src_ptl0 = 88 (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 89 90 uintptr_t src = 91 (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 92 uintptr_t dst = 93 (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; 94 95 95 memsetb(dst_ptl0, table_size, 0); 96 memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0)); 96 memcpy((void *) dst, (void *) src, 97 table_size - (src - (uintptr_t) src_ptl0)); 98 97 99 mutex_unlock(&AS_KERNEL->lock); 98 100 interrupts_restore(ipl); 99 101 } 100 102 101 103 return (pte_t *) KA2PA((uintptr_t) dst_ptl0); 102 104 } … … 107 109 * 108 110 * @param page_table Physical address of PTL0. 111 * 109 112 */ 110 113 void ptl0_destroy(pte_t *page_table) 111 114 { 112 frame_free((uintptr_t) page_table);115 frame_free((uintptr_t) page_table); 113 116 } 114 117 … … 118 121 * Interrupts must be disabled. 119 122 * 120 * @param as Address space.123 * @param as Address space. 121 124 * @param lock If false, do not attempt to lock the address space. 125 * 122 126 */ 123 127 void pt_lock(as_t *as, bool lock) … … 132 136 * Interrupts must be disabled. 133 137 * 134 * @param as Address space.138 * @param as Address space. 135 139 * @param unlock If false, do not attempt to unlock the address space. 140 * 136 141 */ 137 142 void pt_unlock(as_t *as, bool unlock)
Note:
See TracChangeset
for help on using the changeset viewer.