Changeset b07769b6 in mainline
- Timestamp:
- 2005-08-19T13:12:32Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f4a61ef
- Parents:
- 6a4177a
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/dummy.s
r6a4177a rb07769b6 29 29 .text 30 30 31 .global memcopy 31 32 .global cpu_priority_high 32 33 .global cpu_priority_low … … 54 55 .global dummy 55 56 57 memcopy: 56 58 cpu_priority_high: 57 59 cpu_priority_low: -
arch/ia32/src/drivers/ega.c
r6a4177a rb07769b6 30 30 #include <putchar.h> 31 31 #include <mm/page.h> 32 #include <arch/mm/page.h> 32 33 #include <synch/spinlock.h> 33 34 #include <arch/types.h> -
arch/ia32/src/mm/page.c
r6a4177a rb07769b6 37 37 #include <synch/spinlock.h> 38 38 #include <debug.h> 39 40 /*41 * Note.42 * This is the preliminary code for controlling paging mechanism on ia32. It is43 * needed by other parts of the kernel for its ability to map virtual addresses44 * to physical. SMP code relies on this feature. Other than that, this code is45 * by no means meant to implement virtual memory in terms of swapping pages in46 * and out.47 */48 39 49 40 __address bootstrap_dba; -
arch/ia32/src/pm.c
r6a4177a rb07769b6 35 35 #include <arch/context.h> 36 36 #include <panic.h> 37 #include <arch/mm/page.h> 37 38 38 39 /* … … 132 133 static void clean_IOPL_NT_flags(void) 133 134 { 134 135 asm 135 136 ( 136 137 "pushfl;" 137 138 "pop %%eax;" 138 139 "and $0xffff8fff,%%eax;" … … 148 149 static void clean_AM_flag(void) 149 150 { 150 151 asm 151 152 ( 152 153 "mov %%cr0,%%eax;" 153 154 "and $0xFFFBFFFF,%%eax;" 154 155 "mov %%eax,%%cr0;" … … 158 159 ); 159 160 } 160 161 162 163 164 161 165 162 void pm_init(void) -
arch/ia32/src/proc/scheduler.c
r6a4177a rb07769b6 35 35 { 36 36 CPU->arch.tss->esp0 = (__address) &THREAD->kstack[THREAD_STACK_SIZE-8]; 37 CPU->arch.tss->ss0 = selector(KDATA_DES); 37 CPU->arch.tss->ss0 = selector(KDATA_DES); 38 38 } -
arch/ppc/src/dummy.s
r6a4177a rb07769b6 29 29 .text 30 30 31 .global memcopy 31 32 .global cpu_priority_high 32 33 .global cpu_priority_low … … 51 52 .global dummy 52 53 54 memcopy: 53 55 cpu_priority_high: 54 56 cpu_priority_low: -
include/mm/page.h
r6a4177a rb07769b6 107 107 #define SET_FRAME_FLAGS(ptl3, i, x) SET_FRAME_FLAGS_ARCH(ptl3, i, x) 108 108 109 #include <arch/mm/page.h>110 111 109 extern void page_init(void); 112 110 extern void map_page_to_frame(__address page, __address frame, int flags, __address root); -
include/mm/vm.h
r6a4177a rb07769b6 77 77 }; 78 78 79 extern vm_t * vm_create( void);79 extern vm_t * vm_create(pte_t *ptl0); 80 80 extern void vm_destroy(vm_t *m); 81 81 … … 83 83 extern void vm_area_destroy(vm_area_t *a); 84 84 85 extern void vm_area_map(vm_area_t *a );86 extern void vm_area_unmap(vm_area_t *a );85 extern void vm_area_map(vm_area_t *a, vm_t *m); 86 extern void vm_area_unmap(vm_area_t *a, vm_t *m); 87 87 88 88 extern void vm_install(vm_t *m); -
src/main/kinit.c
r6a4177a rb07769b6 119 119 * Create the first user task. 120 120 */ 121 m = vm_create( );121 m = vm_create(NULL); 122 122 if (!m) panic("vm_create"); 123 123 u = task_create(m); … … 131 131 a = vm_area_create(m, VMA_TEXT, 1, UTEXT_ADDRESS); 132 132 if (!a) panic("vm_area_create: vm_text"); 133 vm_area_map(a, m); 133 134 memcopy((__address) utext, PA2KA(a->mapping[0]), utext_size < PAGE_SIZE ? utext_size : PAGE_SIZE); 134 135 … … 138 139 a = vm_area_create(m, VMA_STACK, 1, USTACK_ADDRESS); 139 140 if (!a) panic("vm_area_create: vm_stack"); 141 vm_area_map(a, m); 140 142 141 143 thread_ready(t); -
src/main/main.c
r6a4177a rb07769b6 150 150 * Create kernel vm mapping. 151 151 */ 152 m = vm_create( );152 m = vm_create(GET_PTL0_ADDRESS()); 153 153 if (!m) panic("can't create kernel vm address space\n"); 154 154 -
src/mm/vm.c
r6a4177a rb07769b6 40 40 #include <panic.h> 41 41 #include <arch/asm.h> 42 #include <debug.h> 42 43 43 vm_t *vm_create(void) 44 #define KAS_START_INDEX PTL0_INDEX(KERNEL_ADDRESS_SPACE_START) 45 #define KAS_END_INDEX PTL0_INDEX(KERNEL_ADDRESS_SPACE_END) 46 #define KAS_INDICES (1+(KAS_END_INDEX-KAS_START_INDEX)) 47 48 vm_t *vm_create(pte_t *ptl0) 44 49 { 45 50 vm_t *m; … … 49 54 spinlock_initialize(&m->lock); 50 55 list_initialize(&m->vm_area_head); 51 m->ptl0 = NULL; 56 57 /* 58 * Each vm_t is supposed to have its own page table. 59 * It is either passed one or it has to allocate and set one up. 60 */ 61 if (!(m->ptl0 = ptl0)) { 62 pte_t *src_ptl0, *dst_ptl0; 63 64 src_ptl0 = (pte_t *) PA2KA(GET_PTL0_ADDRESS()); 65 dst_ptl0 = (pte_t *) frame_alloc(FRAME_KA | FRAME_PANIC); 66 memsetb((__address) dst_ptl0, PAGE_SIZE, 0); 67 memcopy((__address) &src_ptl0[KAS_START_INDEX], (__address) &dst_ptl0[KAS_START_INDEX], KAS_INDICES*sizeof(pte_t)); 68 m->ptl0 = (pte_t *) KA2PA(dst_ptl0); 69 } 52 70 } 53 71 … … 110 128 } 111 129 112 void vm_area_map(vm_area_t *a )130 void vm_area_map(vm_area_t *a, vm_t *m) 113 131 { 114 132 int i, flags; … … 116 134 117 135 pri = cpu_priority_high(); 136 spinlock_lock(&m->lock); 118 137 spinlock_lock(&a->lock); 119 138 … … 127 146 break; 128 147 default: 129 panic("unexpected vm_type_t %d", a->type); 148 panic("unexpected vm_type_t %d", a->type); 130 149 } 131 150 151 ASSERT(m->ptl0); 132 152 for (i=0; i<a->size; i++) 133 map_page_to_frame(a->address + i*PAGE_SIZE, a->mapping[i], flags, 0);153 map_page_to_frame(a->address + i*PAGE_SIZE, a->mapping[i], flags, (__address) m->ptl0); 134 154 135 155 spinlock_unlock(&a->lock); 156 spinlock_unlock(&m->lock); 136 157 cpu_priority_restore(pri); 137 158 } 138 159 139 void vm_area_unmap(vm_area_t *a )160 void vm_area_unmap(vm_area_t *a, vm_t *m) 140 161 { 141 162 int i; … … 143 164 144 165 pri = cpu_priority_high(); 166 spinlock_lock(&m->lock); 145 167 spinlock_lock(&a->lock); 146 168 169 ASSERT(m->ptl0); 147 170 for (i=0; i<a->size; i++) 148 map_page_to_frame(a->address + i*PAGE_SIZE, 0, PAGE_NOT_PRESENT, 0);171 map_page_to_frame(a->address + i*PAGE_SIZE, 0, PAGE_NOT_PRESENT, (__address) m->ptl0); 149 172 150 173 spinlock_unlock(&a->lock); 174 spinlock_unlock(&m->lock); 151 175 cpu_priority_restore(pri); 152 176 } … … 158 182 159 183 pri = cpu_priority_high(); 184 185 tlb_shootdown_start(); 160 186 spinlock_lock(&m->lock); 161 187 162 for(l = m->vm_area_head.next; l != &m->vm_area_head; l = l->next)163 vm_area_map(list_get_instance(l, vm_area_t, link));188 ASSERT(m->ptl0); 189 SET_PTL0_ADDRESS(m->ptl0); 164 190 165 191 spinlock_unlock(&m->lock); 166 cpu_priority_restore(pri);167 }168 169 void vm_uninstall(vm_t *m)170 {171 link_t *l;172 pri_t pri;173 174 pri = cpu_priority_high();175 176 tlb_shootdown_start();177 178 spinlock_lock(&m->lock);179 180 for(l = m->vm_area_head.next; l != &m->vm_area_head; l = l->next)181 vm_area_unmap(list_get_instance(l, vm_area_t, link));182 183 spinlock_unlock(&m->lock);184 185 192 tlb_shootdown_finalize(); 186 193 -
src/proc/scheduler.c
r6a4177a rb07769b6 381 381 * Replace the old one with the new one. 382 382 */ 383 if (m1) {384 vm_uninstall(m1);385 }386 383 vm_install(m2); 387 384 }
Note:
See TracChangeset
for help on using the changeset viewer.