Rev 799 | Rev 822 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 799 | Rev 814 | ||
|---|---|---|---|
| Line 41... | Line 41... | ||
| 41 | #include <console/kconsole.h> |
41 | #include <console/kconsole.h> |
| 42 | #include <cpu.h> |
42 | #include <cpu.h> |
| 43 | #include <align.h> |
43 | #include <align.h> |
| 44 | #include <interrupt.h> |
44 | #include <interrupt.h> |
| 45 | #include <arch/mm/memory_init.h> |
45 | #include <arch/mm/memory_init.h> |
| 46 | #include <mm/heap.h> |
- | |
| 47 | #include <mm/frame.h> |
46 | #include <mm/frame.h> |
| 48 | #include <mm/page.h> |
47 | #include <mm/page.h> |
| 49 | #include <genarch/mm/page_pt.h> |
48 | #include <genarch/mm/page_pt.h> |
| 50 | #include <mm/tlb.h> |
49 | #include <mm/tlb.h> |
| 51 | #include <mm/as.h> |
50 | #include <mm/as.h> |
| Line 101... | Line 100... | ||
| 101 | * Assuming interrupts_disable(). |
100 | * Assuming interrupts_disable(). |
| 102 | * |
101 | * |
| 103 | */ |
102 | */ |
| 104 | void main_bsp(void) |
103 | void main_bsp(void) |
| 105 | { |
104 | { |
| - | 105 | __address stackaddr; |
|
| - | 106 | ||
| 106 | config.cpu_count = 1; |
107 | config.cpu_count = 1; |
| 107 | config.cpu_active = 1; |
108 | config.cpu_active = 1; |
| 108 | 109 | ||
| 109 | config.base = hardcoded_load_address; |
110 | config.base = hardcoded_load_address; |
| 110 | config.memory_size = get_memory_size(); |
111 | config.memory_size = get_memory_size(); |
| 111 | config.init_addr = init_addr; |
112 | config.init_addr = init_addr; |
| 112 | config.init_size = init_size; |
113 | config.init_size = init_size; |
| 113 | 114 | ||
| - | 115 | config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE); |
|
| 114 | if (init_size > 0) |
116 | stackaddr = config.base + config.kernel_size; |
| 115 | config.heap_addr = init_addr + init_size; |
117 | /* Avoid placing kernel on top of init */ |
| 116 | else |
- | |
| 117 | config.heap_addr = hardcoded_load_address + hardcoded_ktext_size + hardcoded_kdata_size; |
118 | if (overlaps(stackaddr,stackaddr+CONFIG_STACK_SIZE, |
| 118 | - | ||
| 119 | config.heap_size = CONFIG_HEAP_SIZE + (config.memory_size / FRAME_SIZE) * sizeof(frame_t); |
119 | config.init_addr, config.init_addr+config.init_size)) { |
| 120 | 120 | ||
| 121 | config.kernel_size = ALIGN_UP(config.heap_addr - hardcoded_load_address + config.heap_size, PAGE_SIZE); |
121 | stackaddr = ALIGN_UP(config.init_addr+config.init_size, |
| - | 122 | CONFIG_STACK_SIZE); |
|
| 122 | config.heap_delta = config.kernel_size - (config.heap_addr - hardcoded_load_address + config.heap_size); |
123 | config.init_size = ALIGN_UP(config.init_size,CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE; |
| - | 124 | } else { |
|
| 123 | config.kernel_size = config.kernel_size + CONFIG_STACK_SIZE; |
125 | config.kernel_size += CONFIG_STACK_SIZE; |
| - | 126 | } |
|
| 124 | 127 | ||
| 125 | context_save(&ctx); |
128 | context_save(&ctx); |
| 126 | context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + config.kernel_size - CONFIG_STACK_SIZE, CONFIG_STACK_SIZE); |
129 | context_set(&ctx, FADDR(main_bsp_separated_stack), |
| - | 130 | stackaddr, CONFIG_STACK_SIZE); |
|
| 127 | context_restore(&ctx); |
131 | context_restore(&ctx); |
| 128 | /* not reached */ |
132 | /* not reached */ |
| 129 | } |
133 | } |
| 130 | 134 | ||
| 131 | 135 | ||
| Line 138... | Line 142... | ||
| 138 | { |
142 | { |
| 139 | task_t *k; |
143 | task_t *k; |
| 140 | thread_t *t; |
144 | thread_t *t; |
| 141 | 145 | ||
| 142 | the_initialize(THE); |
146 | the_initialize(THE); |
| 143 | - | ||
| 144 | /* |
147 | /* |
| 145 | * kconsole data structures must be initialized very early |
148 | * kconsole data structures must be initialized very early |
| 146 | * because other subsystems will register their respective |
149 | * because other subsystems will register their respective |
| 147 | * commands. |
150 | * commands. |
| 148 | */ |
151 | */ |
| Line 156... | Line 159... | ||
| 156 | 159 | ||
| 157 | /* |
160 | /* |
| 158 | * Memory management subsystems initialization. |
161 | * Memory management subsystems initialization. |
| 159 | */ |
162 | */ |
| 160 | arch_pre_mm_init(); |
163 | arch_pre_mm_init(); |
| 161 | early_heap_init(config.heap_addr, config.heap_size + config.heap_delta); |
164 | /* Initialize at least 1 memory segment big enough for slab to work */ |
| 162 | frame_init(); |
165 | frame_init(); |
| 163 | slab_cache_init(); |
166 | slab_cache_init(); |
| 164 | as_init(); |
167 | as_init(); |
| 165 | page_init(); |
168 | page_init(); |
| 166 | tlb_init(); |
169 | tlb_init(); |
| 167 | arch_post_mm_init(); |
170 | arch_post_mm_init(); |
| 168 | - | ||
| 169 | version_print(); |
171 | version_print(); |
| 170 | 172 | ||
| 171 | printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n", |
173 | printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n", |
| 172 | config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024); |
174 | config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024); |
| 173 | 175 | ||
| Line 176... | Line 178... | ||
| 176 | /* Slab must be initialized AFTER we know the number of processors */ |
178 | /* Slab must be initialized AFTER we know the number of processors */ |
| 177 | slab_enable_cpucache(); |
179 | slab_enable_cpucache(); |
| 178 | 180 | ||
| 179 | printf("config.memory_size=%dM\n", config.memory_size/(1024*1024)); |
181 | printf("config.memory_size=%dM\n", config.memory_size/(1024*1024)); |
| 180 | printf("config.cpu_count=%d\n", config.cpu_count); |
182 | printf("config.cpu_count=%d\n", config.cpu_count); |
| 181 | - | ||
| 182 | cpu_init(); |
183 | cpu_init(); |
| 183 | 184 | ||
| 184 | calibrate_delay_loop(); |
185 | calibrate_delay_loop(); |
| 185 | - | ||
| 186 | timeout_init(); |
186 | timeout_init(); |
| 187 | scheduler_init(); |
187 | scheduler_init(); |
| 188 | task_init(); |
188 | task_init(); |
| 189 | thread_init(); |
189 | thread_init(); |
| 190 | 190 | ||