Changeset f941347 in mainline for arch/ppc32/loader/main.c


Ignore:
Timestamp:
2006-03-17T12:46:35Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7dcde32
Parents:
543c31f
Message:

relocate boot loader structures if needed
(allowing to boot on stupid OFW implementations)

File:
1 edited

Legend:

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

    r543c31f rf941347  
    3535#define KERNEL_SIZE ((unsigned int) KERNEL_END - (unsigned int) KERNEL_START)
    3636
     37#define HEAP_GAP 1024000
     38
    3739memmap_t memmap;
    3840
     
    4749
    4850
    49 static void check_overlap(const void *addr, const char *desc)
     51static void fix_overlap(void *va, void **pa, const char *desc, unsigned int *top)
    5052{
    51         if ((unsigned int) addr < KERNEL_SIZE) {
    52                 printf("Error: %s overlaps kernel physical area\n", desc);
    53                 halt();
     53        if ((unsigned int) *pa + PAGE_SIZE < *top) {
     54                printf("Warning: %s overlaps kernel physical area\n", desc);
     55               
     56                void *new_va = (void *) (ALIGN_UP((unsigned int) KERNEL_END + HEAP_GAP, PAGE_SIZE) + *top);
     57                void *new_pa = (void *) (HEAP_GAP + *top);
     58                *top += PAGE_SIZE;
     59               
     60                if (ofw_map(new_pa, new_va, PAGE_SIZE, 0) != 0) {
     61                        printf("Error: Unable to map page aligned memory at %L (physical %L)\n", new_va, new_pa);
     62                        halt();
     63                }
     64               
     65                if ((unsigned int) new_pa + PAGE_SIZE < KERNEL_SIZE) {
     66                        printf("Error: %s cannot be relocated\n", desc);
     67                        halt();
     68                }
     69               
     70                printf("Relocating %L -> %L (physical %L -> %L)\n", va, new_va, *pa, new_pa);
     71                *pa = new_pa;
     72                memcpy(new_va, va, PAGE_SIZE);
    5473        }
    5574}
     
    7392        void *memmap_pa = ofw_translate(&memmap);
    7493       
    75         check_overlap(real_mode_pa, "Bootstrap trampoline");
    76         check_overlap(trans_pa, "Translation table");
    77         check_overlap(memmap_pa, "Memory map");
    78        
    7994        printf("Memory statistics (total %d MB)\n", memmap.total >> 20);
    8095        printf(" kernel image         at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE);
     
    8398        printf(" translation table    at %L (physical %L)\n", &trans, trans_pa);
    8499       
     100        unsigned int top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE);
    85101        unsigned int addr;
    86102        for (addr = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE) {
    87103                void *pa = ofw_translate(KERNEL_START + addr);
    88                 check_overlap(pa, "Kernel image");
     104                fix_overlap(KERNEL_START + addr, &pa, "Kernel image", &top);
    89105                trans[addr >> PAGE_WIDTH] = pa;
    90106        }
     107       
     108        fix_overlap(&real_mode, &real_mode_pa, "Bootstrap trampoline", &top);
     109        fix_overlap(&trans, &trans_pa, "Translation table", &top);
     110        fix_overlap(&memmap, &memmap_pa, "Memory map", &top);
    91111       
    92112        printf("Booting the kernel...\n");
Note: See TracChangeset for help on using the changeset viewer.