Changes in boot/arch/sparc64/loader/main.c [f238e86:e0565005] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/sparc64/loader/main.c
rf238e86 re0565005 57 57 #endif 58 58 59 /** UltraSPARC subarchitecture - 1 for US, 3 for US3 , 0 for other*/60 static uint8_t subarchitecture = 0;59 /** UltraSPARC subarchitecture - 1 for US, 3 for US3 */ 60 static uint8_t subarchitecture; 61 61 62 62 /** … … 69 69 static void version_print(void) 70 70 { 71 72 71 printf("HelenOS SPARC64 Bootloader\nRelease %s%s%s\n" 73 72 "Copyright (c) 2006 HelenOS project\n", … … 84 83 #define US_IIIi_CODE 0x15 85 84 86 /* max. length of the "compatible" property of the root node */87 #define COMPATIBLE_PROP_MAXLEN 6488 89 /*90 * HelenOS bootloader will use these constants to distinguish particular91 * UltraSPARC architectures92 */93 #define COMPATIBLE_SUN4U 1094 #define COMPATIBLE_SUN4V 2095 96 /** US architecture. COMPATIBLE_SUN4U for sun4v, COMPATIBLE_SUN4V for sun4u */97 static uint8_t architecture;98 99 85 /** 100 * Detects the UltraSPARC architecture (sun4u and sun4v currently supported) 101 * by inspecting the property called "compatible" in the OBP root node. 102 */ 103 static void detect_architecture(void) 104 { 105 phandle root = ofw_find_device("/"); 106 char compatible[COMPATIBLE_PROP_MAXLEN]; 107 108 if (ofw_get_property(root, "compatible", compatible, 109 COMPATIBLE_PROP_MAXLEN) <= 0) { 110 printf("Unable to determine architecture, default: sun4u.\n"); 111 architecture = COMPATIBLE_SUN4U; 112 return; 113 } 114 115 if (strcmp(compatible, "sun4v") == 0) { 116 architecture = COMPATIBLE_SUN4V; 117 } else { 118 /* 119 * As not all sun4u machines have "sun4u" in their "compatible" 120 * OBP property (e.g. Serengeti's OBP "compatible" property is 121 * "SUNW,Serengeti"), we will by default fallback to sun4u if 122 * an unknown value of the "compatible" property is encountered. 123 */ 124 architecture = COMPATIBLE_SUN4U; 125 } 126 } 127 128 129 /** 130 * Detects the subarchitecture (US, US3) of the sun4u 131 * processor. Sets the global variables "subarchitecture" and "mid_mask" to 86 * Sets the global variables "subarchitecture" and "mid_mask" to 132 87 * correct values. 133 88 */ … … 154 109 } 155 110 156 /**157 * Performs sun4u-specific initialization. The components are expected158 * to be already copied and boot allocator initialized.159 *160 * @param base kernel base virtual address161 * @param top virtual address above which the boot allocator162 * can make allocations163 */164 static void bootstrap_sun4u(void *base, unsigned int top)165 {166 void *balloc_base;167 /*168 * Claim and map the physical memory for the boot allocator.169 * Initialize the boot allocator.170 */171 balloc_base = base + ALIGN_UP(top, PAGE_SIZE);172 (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base,173 BALLOC_MAX_SIZE);174 (void) ofw_map(bootinfo.physmem_start + balloc_base, balloc_base,175 BALLOC_MAX_SIZE, -1);176 balloc_init(&bootinfo.ballocs, (uintptr_t) balloc_base,177 (uintptr_t) balloc_base);178 179 printf("Setting up screens...");180 ofw_setup_screens();181 printf("done.\n");182 183 printf("Canonizing OpenFirmware device tree...");184 bootinfo.ofw_root = ofw_tree_build();185 printf("done.\n");186 187 #ifdef CONFIG_AP188 printf("Checking for secondary processors...");189 if (!ofw_cpu(mid_mask, bootinfo.physmem_start))190 printf("Error: unable to get CPU properties\n");191 printf("done.\n");192 #endif193 194 }195 196 /**197 * * Performs sun4v-specific initialization. The components are expected198 * * to be already copied and boot allocator initialized.199 * */200 static void bootstrap_sun4v(void)201 {202 /*203 * When SILO booted, the OBP had established a virtual to physical204 * memory mapping. This mapping is not an identity (because the205 * physical memory starts on non-zero address) - this is not206 * surprising. But! The mapping even does not map virtual address207 * 0 onto the starting address of the physical memory, but onto an208 * address which is 0x400000 bytes higher. The reason is that the209 * OBP had already used the memory just at the beginning of the210 * physical memory, so that memory cannot be used by SILO (nor211 * bootloader). As for now, we solve it by a nasty workaround:212 * we pretend that the physical memory starts 0x400000 bytes further213 * than it actually does (and hence pretend that the physical memory214 * is 0x400000 bytes smaller). Of course, the value 0x400000 will most215 * probably depend on the machine and OBP version (the workaround now216 * works on Simics). A solution would be to inspect the "available"217 * property of the "/memory" node to find out which parts of memory218 * are used by OBP and redesign the algorithm of copying219 * kernel/init tasks/ramdisk from the bootable image to memory220 * (which we must do anyway because of issues with claiming the memory221 * on Serengeti).222 */223 bootinfo.physmem_start += 0x400000;224 bootinfo.memmap.zones[0].start += 0x400000;225 bootinfo.memmap.zones[0].size -= 0x400000;226 printf("The sun4v init finished.");227 }228 229 230 111 void bootstrap(void) 231 112 { 232 113 void *base = (void *) KERNEL_VIRTUAL_ADDRESS; 114 void *balloc_base; 233 115 unsigned int top = 0; 234 116 unsigned int i; 235 117 unsigned int j; 236 118 237 detect_architecture(); 119 version_print(); 120 121 detect_subarchitecture(); 238 122 init_components(components); 239 123 … … 376 260 printf("done.\n"); 377 261 378 /* perform architecture-specific initialization */ 379 if (architecture == COMPATIBLE_SUN4U) { 380 bootstrap_sun4u(base, top); 381 } else if (architecture == COMPATIBLE_SUN4V) { 382 bootstrap_sun4v(); 383 } else { 384 printf("Unknown architecture.\n"); 385 halt(); 386 } 262 /* 263 * Claim and map the physical memory for the boot allocator. 264 * Initialize the boot allocator. 265 */ 266 balloc_base = base + ALIGN_UP(top, PAGE_SIZE); 267 (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base, 268 BALLOC_MAX_SIZE); 269 (void) ofw_map(bootinfo.physmem_start + balloc_base, balloc_base, 270 BALLOC_MAX_SIZE, -1); 271 balloc_init(&bootinfo.ballocs, (uintptr_t) balloc_base, 272 (uintptr_t) balloc_base); 273 274 printf("Setting up screens..."); 275 ofw_setup_screens(); 276 printf("done.\n"); 277 278 printf("Canonizing OpenFirmware device tree..."); 279 bootinfo.ofw_root = ofw_tree_build(); 280 printf("done.\n"); 281 282 #ifdef CONFIG_AP 283 printf("Checking for secondary processors..."); 284 if (!ofw_cpu(mid_mask, bootinfo.physmem_start)) 285 printf("Error: unable to get CPU properties\n"); 286 printf("done.\n"); 287 #endif 387 288 388 289 printf("Booting the kernel...\n");
Note:
See TracChangeset
for help on using the changeset viewer.