- Timestamp:
- 2005-07-15T21:57:30Z (21 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b4a4c5e3
- Parents:
- e41c47e
- Location:
- src/mm
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/mm/frame.c
re41c47e r76cec1e 55 55 void frame_init(void) 56 56 { 57 if (config.cpu_active == 1) {57 if (config.cpu_active == 1) { 58 58 59 /*60 * The bootstrap processor will allocate all necessary memory for frame allocation.61 */59 /* 60 * The bootstrap processor will allocate all necessary memory for frame allocation. 61 */ 62 62 63 frames = config.memory_size / FRAME_SIZE;64 frame_bitmap_octets = frames / 8 + (frames % 8 > 0);65 frame_bitmap = (__u8 *) malloc(frame_bitmap_octets);66 if (!frame_bitmap)67 panic("malloc/frame_bitmap\n");63 frames = config.memory_size / FRAME_SIZE; 64 frame_bitmap_octets = frames / 8 + (frames % 8 > 0); 65 frame_bitmap = (__u8 *) malloc(frame_bitmap_octets); 66 if (!frame_bitmap) 67 panic("malloc/frame_bitmap\n"); 68 68 69 /*70 * Mark all frames free.71 */72 memsetb((__address) frame_bitmap, frame_bitmap_octets, 0);73 frames_free = frames;69 /* 70 * Mark all frames free. 71 */ 72 memsetb((__address) frame_bitmap, frame_bitmap_octets, 0); 73 frames_free = frames; 74 74 } 75 75 … … 81 81 82 82 if (config.cpu_active == 1) { 83 /*84 * Create the memory address space map. Marked frames and frame85 * regions cannot be used for allocation.86 */83 /* 84 * Create the memory address space map. Marked frames and frame 85 * regions cannot be used for allocation. 86 */ 87 87 frame_region_not_free(config.base, config.base + config.kernel_size); 88 88 } -
src/mm/page.c
re41c47e r76cec1e 54 54 55 55 /* TODO: implement portable way of computing page address from address */ 56 length = size + (s - (s & 0xfffff000));57 cnt = length/PAGE_SIZE + (length%PAGE_SIZE>0);56 length = size + (s - (s & 0xfffff000)); 57 cnt = length/PAGE_SIZE + (length%PAGE_SIZE>0); 58 58 59 for (i = 0; i < cnt; i++)60 map_page_to_frame(s + i*PAGE_SIZE, s + i*PAGE_SIZE, PAGE_NOT_CACHEABLE, 0);59 for (i = 0; i < cnt; i++) 60 map_page_to_frame(s + i*PAGE_SIZE, s + i*PAGE_SIZE, PAGE_NOT_CACHEABLE, 0); 61 61 62 62 } … … 74 74 void map_page_to_frame(__address page, __address frame, int flags, __address root) 75 75 { 76 pte_t *ptl0, *ptl1, *ptl2, *ptl3;77 __address newpt;76 pte_t *ptl0, *ptl1, *ptl2, *ptl3; 77 __address newpt; 78 78 79 ptl0 = (pte_t *) PA2KA(root ? root : (__address) GET_PTL0_ADDRESS());79 ptl0 = (pte_t *) PA2KA(root ? root : (__address) GET_PTL0_ADDRESS()); 80 80 81 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) {82 newpt = frame_alloc(FRAME_KA);83 memsetb(newpt, PAGE_SIZE, 0);84 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));85 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER);86 }81 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { 82 newpt = frame_alloc(FRAME_KA); 83 memsetb(newpt, PAGE_SIZE, 0); 84 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 85 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER); 86 } 87 87 88 ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));88 ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); 89 89 90 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) {91 newpt = frame_alloc(FRAME_KA);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);95 }90 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { 91 newpt = frame_alloc(FRAME_KA); 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); 95 } 96 96 97 ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));97 ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); 98 98 99 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) {100 newpt = frame_alloc(FRAME_KA);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);104 }99 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { 100 newpt = frame_alloc(FRAME_KA); 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); 104 } 105 105 106 ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));106 ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); 107 107 108 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame);109 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags);108 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); 109 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags); 110 110 }
Note:
See TracChangeset
for help on using the changeset viewer.
