Subversion Repositories HelenOS

Rev

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();