Changeset 6bbb1610 in mainline for arch/ppc64/loader/main.c


Ignore:
Timestamp:
2006-05-21T20:13:14Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
433a2aa
Parents:
0ab829c
Message:

port ppc32 changes to ppc64 (raw)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc64/loader/main.c

    r0ab829c r6bbb1610  
    3030#include "printf.h"
    3131#include "asm.h"
    32 
    33 #define KERNEL_START ((void *) &_binary_____________kernel_kernel_bin_start)
    34 #define KERNEL_END ((void *) &_binary_____________kernel_kernel_bin_end)
    35 #define KERNEL_SIZE ((unsigned long) KERNEL_END - (unsigned long) KERNEL_START)
     32#include "_components.h"
    3633
    3734#define HEAP_GAP 1024000
     
    7774void bootstrap(void)
    7875{
    79         printf("\nHelenOS PPC64 Bootloader\n");
     76        printf("\nHelenOS PPC Bootloader\n");
    8077       
    81         check_align(KERNEL_START, "Kernel image");
    82         check_align(&real_mode, "Bootstrap trampoline");
    83         check_align(&trans, "Translation table");
     78        init_components();
     79       
     80        unsigned int i;
     81       
     82        for (i = 0; i < COMPONENTS; i++)
     83                check_align(components[i].start, components[i].name);
     84       
     85        check_align(&real_mode, "bootstrap trampoline");
     86        check_align(&trans, "translation table");
    8487       
    8588        if (!ofw_memmap(&bootinfo.memmap)) {
    86                 printf("Error: Unable to get memory map, halting.\n");
     89                printf("Error: unable to get memory map, halting.\n");
    8790                halt();
    8891        }
    8992       
    9093        if (bootinfo.memmap.total == 0) {
    91                 printf("Error: No memory detected, halting.\n");
     94                printf("Error: no memory detected, halting.\n");
    9295                halt();
    9396        }
    9497       
    9598        if (!ofw_screen(&bootinfo.screen)) {
    96                 printf("Error: Unable to get screen properties, halting.\n");
     99                printf("Error: unable to get screen properties, halting.\n");
    97100                halt();
    98101        }
     
    104107        void *trans_pa = ofw_translate(&trans);
    105108        void *bootinfo_pa = ofw_translate(&bootinfo);
    106         void *fb = (void *) (((unsigned long) bootinfo.screen.addr) & ((unsigned long) ~0 << 17));
    107109       
    108110        printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20);
    109         printf(" kernel image         at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE);
    110         printf(" boot info            at %L (physical %L)\n", &bootinfo, bootinfo_pa);
    111         printf(" bootstrap trampoline at %L (physical %L)\n", &real_mode, real_mode_pa);
    112         printf(" translation table    at %L (physical %L)\n", &trans, trans_pa);
     111        printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa);
     112        printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa);
     113        printf(" %L: translation table (physical %L)\n", &trans, trans_pa);
     114        for (i = 0; i < COMPONENTS; i++)
     115                printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size);
    113116       
    114         unsigned long top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE);
    115         unsigned long addr;
    116         for (addr = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE) {
    117                 void *pa = ofw_translate(KERNEL_START + addr);
    118                 fix_overlap(KERNEL_START + addr, &pa, "Kernel image", &top);
    119                 trans[addr >> PAGE_WIDTH] = pa;
     117        unsigned long top = 0;
     118        for (i = 0; i < COMPONENTS; i++)
     119                top += ALIGN_UP(components[i].size, PAGE_SIZE);
     120       
     121        unsigned long pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
     122       
     123        for (i = 0; i < pages; i++) {
     124                void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH));
     125                fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top);
     126                trans[i] = pa;
    120127        }
    121128       
    122         fix_overlap(&real_mode, &real_mode_pa, "Bootstrap trampoline", &top);
    123         fix_overlap(&trans, &trans_pa, "Translation table", &top);
    124         fix_overlap(&bootinfo, &bootinfo_pa, "Boot info", &top);
     129        bootinfo.taskmap.count = 0;
     130        for (i = 1; i < COMPONENTS; i++) {
     131                unsigned long component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH;
     132                unsigned long j;
     133               
     134                for (j = 0; j < component_pages; j++) {
     135                        void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH));
     136                        fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top);
     137                        trans[pages + j] = pa;
     138                        if (j == 0) {
     139                                bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH);
     140                                bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size;
     141                                bootinfo.taskmap.count++;
     142                        }
     143                }
     144               
     145                pages += component_pages;
     146        }
     147       
     148        fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top);
     149        fix_overlap(&trans, &trans_pa, "translation table", &top);
     150        fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top);
    125151       
    126152        printf("\nBooting the kernel...\n");
    127         jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, KERNEL_SIZE, fb, real_mode_pa);
     153        jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, real_mode_pa);
    128154}
Note: See TracChangeset for help on using the changeset viewer.