Rev 640 | Rev 673 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 640 | Rev 651 | ||
---|---|---|---|
Line 80... | Line 80... | ||
80 | char *timestamp = " on " TIMESTAMP; |
80 | char *timestamp = " on " TIMESTAMP; |
81 | #else |
81 | #else |
82 | char *timestamp = ""; |
82 | char *timestamp = ""; |
83 | #endif |
83 | #endif |
84 | 84 | ||
85 | - | ||
86 | config_t config; |
85 | config_t config; |
87 | context_t ctx; |
86 | context_t ctx; |
88 | 87 | ||
89 | /** |
88 | /** |
90 | * These 'hardcoded' variables will be intialized by |
89 | * These 'hardcoded' variables will be intialized by |
Line 96... | Line 95... | ||
96 | size_t hardcoded_kdata_size = 0; |
95 | size_t hardcoded_kdata_size = 0; |
97 | 96 | ||
98 | __address init_addr = 0; |
97 | __address init_addr = 0; |
99 | size_t init_size = 0; |
98 | size_t init_size = 0; |
100 | 99 | ||
101 | /** |
- | |
102 | * Size of memory in bytes taken by kernel and heap. |
- | |
103 | */ |
- | |
104 | static size_t kernel_size; |
- | |
105 | - | ||
106 | /** |
- | |
107 | * Size of heap. |
- | |
108 | */ |
- | |
109 | static size_t heap_size; |
- | |
110 | - | ||
111 | - | ||
112 | /** |
- | |
113 | * Extra space between heap and stack |
- | |
114 | * enforced by alignment requirements. |
- | |
115 | */ |
- | |
116 | static size_t heap_delta; |
- | |
117 | - | ||
118 | void main_bsp(void); |
100 | void main_bsp(void); |
119 | void main_ap(void); |
101 | void main_ap(void); |
120 | 102 | ||
121 | /* |
103 | /* |
122 | * These two functions prevent stack from underflowing during the |
104 | * These two functions prevent stack from underflowing during the |
Line 138... | Line 120... | ||
138 | */ |
120 | */ |
139 | void main_bsp(void) |
121 | void main_bsp(void) |
140 | { |
122 | { |
141 | config.cpu_count = 1; |
123 | config.cpu_count = 1; |
142 | config.cpu_active = 1; |
124 | config.cpu_active = 1; |
- | 125 | ||
143 | config.base = hardcoded_load_address; |
126 | config.base = hardcoded_load_address; |
144 | config.memory_size = get_memory_size(); |
127 | config.memory_size = get_memory_size(); |
145 | config.init_addr = init_addr; |
128 | config.init_addr = init_addr; |
146 | config.init_size = init_size; |
129 | config.init_size = init_size; |
147 | - | ||
148 | heap_size = CONFIG_HEAP_SIZE + (config.memory_size/FRAME_SIZE)*sizeof(frame_t); |
- | |
149 | kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size + heap_size, PAGE_SIZE); |
- | |
150 | heap_delta = kernel_size - (hardcoded_ktext_size + hardcoded_kdata_size + heap_size); |
- | |
151 | 130 | ||
- | 131 | if (init_size > 0) |
|
- | 132 | config.heap_addr = init_addr + init_size; |
|
- | 133 | else |
|
- | 134 | config.heap_addr = hardcoded_load_address + hardcoded_ktext_size + hardcoded_kdata_size; |
|
- | 135 | ||
- | 136 | config.heap_size = CONFIG_HEAP_SIZE + (config.memory_size / FRAME_SIZE) * sizeof(frame_t); |
|
- | 137 | ||
- | 138 | config.kernel_size = ALIGN_UP(config.heap_addr - hardcoded_load_address + config.heap_size, PAGE_SIZE); |
|
- | 139 | config.heap_delta = config.kernel_size - (config.heap_addr - hardcoded_load_address + config.heap_size); |
|
152 | config.kernel_size = kernel_size + CONFIG_STACK_SIZE; |
140 | config.kernel_size = config.kernel_size + CONFIG_STACK_SIZE; |
153 | 141 | ||
154 | context_save(&ctx); |
142 | context_save(&ctx); |
155 | early_mapping(config.base + hardcoded_ktext_size + hardcoded_kdata_size, CONFIG_STACK_SIZE + heap_size + heap_delta); |
- | |
156 | context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + kernel_size, CONFIG_STACK_SIZE); |
143 | context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + config.kernel_size, CONFIG_STACK_SIZE); |
157 | context_restore(&ctx); |
144 | context_restore(&ctx); |
158 | /* not reached */ |
145 | /* not reached */ |
159 | } |
146 | } |
160 | 147 | ||
161 | 148 | ||
Line 183... | Line 170... | ||
183 | * starts adding it's own handlers |
170 | * starts adding it's own handlers |
184 | */ |
171 | */ |
185 | exc_init(); |
172 | exc_init(); |
186 | 173 | ||
187 | arch_pre_mm_init(); |
174 | arch_pre_mm_init(); |
188 | early_heap_init(config.base + hardcoded_ktext_size + hardcoded_kdata_size, heap_size + heap_delta); |
175 | early_heap_init(config.heap_addr, config.heap_size + config.heap_delta); |
189 | frame_init(); |
176 | frame_init(); |
190 | page_init(); |
177 | page_init(); |
191 | tlb_init(); |
178 | tlb_init(); |
192 | arch_post_mm_init(); |
179 | arch_post_mm_init(); |
193 | 180 | ||
194 | printf("%s, release %s (%s)%s\nBuilt%s for %s\n%s\n", project, release, name, revision, timestamp, arch, copyright); |
181 | printf("%s, release %s (%s)%s\nBuilt%s for %s\n%s\n", project, release, name, revision, timestamp, arch, copyright); |
195 | printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n", |
182 | printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n", |
196 | config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024); |
183 | config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024); |
197 | 184 | ||
198 | arch_pre_smp_init(); |
185 | arch_pre_smp_init(); |