Rev 3743 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3743 | Rev 3770 | ||
---|---|---|---|
Line 150... | Line 150... | ||
150 | } |
150 | } |
151 | 151 | ||
152 | /** |
152 | /** |
153 | * Performs sun4u-specific initialization. The components are expected |
153 | * Performs sun4u-specific initialization. The components are expected |
154 | * to be already copied and boot allocator initialized. |
154 | * to be already copied and boot allocator initialized. |
- | 155 | * |
|
- | 156 | * @param base kernel base virtual address |
|
- | 157 | * @param top virtual address above which the boot allocator |
|
- | 158 | * can make allocations |
|
155 | */ |
159 | */ |
156 | static void bootstrap_sun4u(void) |
160 | static void bootstrap_sun4u(void *base, unsigned int top) |
157 | { |
161 | { |
- | 162 | void *balloc_base; |
|
- | 163 | ||
- | 164 | /* |
|
- | 165 | * Claim and map the physical memory for the boot allocator. |
|
- | 166 | * Initialize the boot allocator. |
|
- | 167 | */ |
|
- | 168 | balloc_base = base + ALIGN_UP(top, PAGE_SIZE); |
|
- | 169 | (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base, |
|
- | 170 | BALLOC_MAX_SIZE); |
|
- | 171 | (void) ofw_map(balloc_base, balloc_base, BALLOC_MAX_SIZE, -1); |
|
- | 172 | balloc_init(&bootinfo.ballocs, (uintptr_t)balloc_base); |
|
- | 173 | ||
158 | printf("\nCanonizing OpenFirmware device tree..."); |
174 | printf("\nCanonizing OpenFirmware device tree..."); |
159 | bootinfo.ofw_root = ofw_tree_build(); |
175 | bootinfo.ofw_root = ofw_tree_build(); |
160 | printf("done.\n"); |
176 | printf("done.\n"); |
161 | 177 | ||
162 | detect_subarchitecture(); |
178 | detect_subarchitecture(); |
Line 175... | Line 191... | ||
175 | * Performs sun4v-specific initialization. The components are expected |
191 | * Performs sun4v-specific initialization. The components are expected |
176 | * to be already copied and boot allocator initialized. |
192 | * to be already copied and boot allocator initialized. |
177 | */ |
193 | */ |
178 | static void bootstrap_sun4v(void) |
194 | static void bootstrap_sun4v(void) |
179 | { |
195 | { |
- | 196 | /* |
|
- | 197 | * When SILO booted, the OBP had established a virtual to physical |
|
- | 198 | * memory mapping. This mapping is not an identity (because the |
|
- | 199 | * physical memory starts on non-zero address) - this is not |
|
- | 200 | * surprising. But! The mapping even does not map virtual address |
|
- | 201 | * 0 onto the starting address of the physical memory, but onto an |
|
- | 202 | * address which is 0x400000 bytes higher. The reason is that the |
|
- | 203 | * OBP had already used the memory just at the beginning of the |
|
- | 204 | * physical memory, so that memory cannot be used by SILO (nor |
|
- | 205 | * bootloader). As for now, we solve it by a nasty workaround: |
|
- | 206 | * we pretend that the physical memory starts 0x400000 bytes further |
|
- | 207 | * than it actually does (and hence pretend that the physical memory |
|
- | 208 | * is 0x400000 bytes smaller). Of course, the value 0x400000 will most |
|
- | 209 | * probably depend on the machine and OBP version (the workaround now |
|
- | 210 | * works on Simics). A solution would be to inspect the "available" |
|
- | 211 | * property of the "/memory" node to find out which parts of memory |
|
- | 212 | * are used by OBP and redesign the algorithm of copying |
|
- | 213 | * kernel/init tasks/ramdisk from the bootable image to memory |
|
- | 214 | * (which we must do anyway because of issues with claiming the memory |
|
- | 215 | * on Serengeti). |
|
- | 216 | */ |
|
- | 217 | bootinfo.physmem_start += 0x400000; |
|
- | 218 | bootinfo.memmap.zones[0].start += 0x400000; |
|
- | 219 | bootinfo.memmap.zones[0].size -= 0x400000; |
|
180 | } |
220 | } |
181 | 221 | ||
182 | void bootstrap(void) |
222 | void bootstrap(void) |
183 | { |
223 | { |
184 | void *base = (void *) KERNEL_VIRTUAL_ADDRESS; |
224 | void *base = (void *) KERNEL_VIRTUAL_ADDRESS; |
185 | void *balloc_base; |
- | |
186 | unsigned int top = 0; |
225 | unsigned int top = 0; |
187 | int i, j; |
226 | int i, j; |
188 | 227 | ||
189 | detect_architecture(); |
228 | detect_architecture(); |
190 | init_components(components); |
229 | init_components(components); |
Line 315... | Line 354... | ||
315 | (void) ofw_claim_phys(bootinfo.physmem_start + base, |
354 | (void) ofw_claim_phys(bootinfo.physmem_start + base, |
316 | ALIGN_UP(components[0].size, PAGE_SIZE)); |
355 | ALIGN_UP(components[0].size, PAGE_SIZE)); |
317 | memcpy(base, components[0].start, components[0].size); |
356 | memcpy(base, components[0].start, components[0].size); |
318 | printf("done.\n"); |
357 | printf("done.\n"); |
319 | 358 | ||
320 | /* |
- | |
321 | * Claim and map the physical memory for the boot allocator. |
- | |
322 | * Initialize the boot allocator. |
- | |
323 | */ |
- | |
324 | balloc_base = base + ALIGN_UP(top, PAGE_SIZE); |
- | |
325 | (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base, |
- | |
326 | BALLOC_MAX_SIZE); |
- | |
327 | (void) ofw_map(balloc_base, balloc_base, BALLOC_MAX_SIZE, -1); |
- | |
328 | balloc_init(&bootinfo.ballocs, (uintptr_t)balloc_base); |
- | |
329 | - | ||
330 | /* perform architecture-specific initialization */ |
359 | /* perform architecture-specific initialization */ |
331 | if (architecture == COMPATIBLE_SUN4U) { |
360 | if (architecture == COMPATIBLE_SUN4U) { |
332 | bootstrap_sun4u(); |
361 | bootstrap_sun4u(base, top); |
333 | } else if (architecture == COMPATIBLE_SUN4V) { |
362 | } else if (architecture == COMPATIBLE_SUN4V) { |
334 | bootstrap_sun4v(); |
363 | bootstrap_sun4v(); |
335 | } else { |
364 | } else { |
336 | printf("Unknown architecture.\n"); |
365 | printf("Unknown architecture.\n"); |
337 | halt(); |
366 | halt(); |