Changeset 3eee37d in mainline


Ignore:
Timestamp:
2006-05-18T19:42:34Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
de1b8b1
Parents:
a62347a
Message:

support for arbitrary number of boot components for ppc32

Location:
arch/ppc32
Files:
1 added
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/Makefile.inc

    ra62347a r3eee37d  
    3030
    3131image.boot: kernel uspace
    32         make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNEL=../../../$(KERNELDIR)/kernel.bin INIT=../../../$(USPACEDIR)/init/init
     32        make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR)
    3333        cp arch/$(ARCH)/loader/image.boot image.boot
    3434
    3535clean: clean_kernel clean_uspace
    36         make -C arch/$(ARCH)/loader clean
     36        make -C arch/$(ARCH)/loader clean KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR)
    3737        -rm -f image.boot
    3838
  • arch/ppc32/loader/Makefile

    ra62347a r3eee37d  
    5757        boot.S
    5858
     59COMPONENTS = \
     60        $(KERNELDIR)/kernel.bin \
     61        $(USPACEDIR)/ns/ns \
     62        $(USPACEDIR)/init/init \
     63        $(USPACEDIR)/fb/fb
     64
    5965OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
     66COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS))))
    6067
    6168.PHONY: all clean depend
     
    6572-include Makefile.depend
    6673
    67 image.boot: depend $(OBJECTS) kernel.o init.o
    68         $(LD) -no-check-sections -N -T _link.ld $(OBJECTS) kernel.o init.o -o $@
     74image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) kernel.o
     75        $(LD) -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@
    6976
    7077depend:
     
    7279
    7380clean:
    74         -rm -f $(OBJECTS) image.boot kernel.o init.o Makefile.depend
     81        -rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot Makefile.depend
    7582
    76 kernel.o: $(KERNEL)
    77         $(OBJCOPY) -I binary -O elf32-powerpc -B powerpc:common --rename-section .data=.kernel_image $(KERNEL) $@
    78 
    79 init.o: $(INIT)
    80         $(OBJCOPY) -I binary -O elf32-powerpc -B powerpc:common --rename-section .data=.init_image $(INIT) $@
     83_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS)
     84        ./pack $(OBJCOPY) $(COMPONENTS)
    8185
    8286%.o: %.S
  • arch/ppc32/loader/main.c

    ra62347a r3eee37d  
    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 int) KERNEL_END - (unsigned int) KERNEL_START)
    36 
    37 #define INIT_START ((void *) &_binary_____________uspace_init_init_start)
    38 #define INIT_END ((void *) &_binary_____________uspace_init_init_end)
    39 #define INIT_SIZE ((unsigned int) INIT_END - (unsigned int) INIT_START)
     32#include "_components.h"
    4033
    4134#define HEAP_GAP 1024000
     
    8376        printf("\nHelenOS PPC Bootloader\n");
    8477       
    85         check_align(KERNEL_START, "Kernel image");
    86         check_align(INIT_START, "Init image");
    87         check_align(&real_mode, "Bootstrap trampoline");
    88         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");
    8987       
    9088        if (!ofw_memmap(&bootinfo.memmap)) {
    91                 printf("Error: Unable to get memory map, halting.\n");
     89                printf("Error: unable to get memory map, halting.\n");
    9290                halt();
    9391        }
    9492       
    9593        if (bootinfo.memmap.total == 0) {
    96                 printf("Error: No memory detected, halting.\n");
     94                printf("Error: no memory detected, halting.\n");
    9795                halt();
    9896        }
    9997       
    10098        if (!ofw_screen(&bootinfo.screen)) {
    101                 printf("Error: Unable to get screen properties, halting.\n");
     99                printf("Error: unable to get screen properties, halting.\n");
    102100                halt();
    103101        }
     
    112110       
    113111        printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20);
    114         printf(" kernel image         at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE);
    115         printf(" init image           at %L (size %d bytes)\n", INIT_START, INIT_SIZE);
    116         printf(" boot info structure  at %L (physical %L)\n", &bootinfo, bootinfo_pa);
    117         printf(" bootstrap trampoline at %L (physical %L)\n", &real_mode, real_mode_pa);
    118         printf(" translation table    at %L (physical %L)\n", &trans, trans_pa);
     112        printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa);
     113        printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa);
     114        printf(" %L: translation table (physical %L)\n", &trans, trans_pa);
     115        for (i = 0; i < COMPONENTS; i++)
     116                printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size);
    119117       
    120         unsigned int top = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) + ALIGN_UP(INIT_SIZE, PAGE_SIZE);
    121         unsigned int kernel_pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
    122         unsigned int init_pages = ALIGN_UP(INIT_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
     118        unsigned int top = 0;
     119        for (i = 0; i < COMPONENTS; i++)
     120                top += ALIGN_UP(components[i].size, PAGE_SIZE);
    123121       
    124         unsigned int i;
     122        unsigned int pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
    125123       
    126         for (i = 0; i < kernel_pages; i++) {
     124        for (i = 0; i < pages; i++) {
    127125                void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH));
    128                 fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "Kernel image", &top);
     126                fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top);
    129127                trans[i] = pa;
    130128        }
    131129       
    132         for (i = 0; i < init_pages; i++) {
    133                 void *pa = ofw_translate(INIT_START + (i << PAGE_WIDTH));
    134                 fix_overlap(INIT_START + (i << PAGE_WIDTH), &pa, "Init image", &top);
    135                 trans[kernel_pages + i] = pa;
    136                 if (i == 0) {
    137                         bootinfo.init.addr = (void *) ((kernel_pages + i) << PAGE_WIDTH);
    138                         bootinfo.init.size = INIT_SIZE;
     130        bootinfo.taskmap.count = 0;
     131        for (i = 1; i < COMPONENTS; i++) {
     132                unsigned int component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH;
     133                unsigned int j;
     134               
     135                for (j = 0; j < component_pages; j++) {
     136                        void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH));
     137                        fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top);
     138                        trans[pages + j] = pa;
     139                        if (j == 0) {
     140                                bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH);
     141                                bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size;
     142                                bootinfo.taskmap.count++;
     143                        }
    139144                }
     145               
     146                pages += component_pages;
    140147        }
    141148       
    142         fix_overlap(&real_mode, &real_mode_pa, "Bootstrap trampoline", &top);
    143         fix_overlap(&trans, &trans_pa, "Translation table", &top);
    144         fix_overlap(&bootinfo, &bootinfo_pa, "Boot info", &top);
     149        fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top);
     150        fix_overlap(&trans, &trans_pa, "translation table", &top);
     151        fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top);
    145152       
    146153        printf("\nBooting the kernel...\n");
    147         jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, (kernel_pages + init_pages) << PAGE_WIDTH, fb, real_mode_pa);
     154        jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, fb, real_mode_pa);
    148155}
  • arch/ppc32/loader/main.h

    ra62347a r3eee37d  
    3939#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1))
    4040
     41#define TASKMAP_MAX_RECORDS 32
     42
    4143typedef struct {
    4244        void *addr;
    4345        unsigned int size;
    44 } utask_t;
     46} task_t;
    4547
    4648typedef struct {
    47         utask_t init;
     49        unsigned int count;
     50        task_t tasks[TASKMAP_MAX_RECORDS];
     51} taskmap_t;
     52
     53typedef struct {
     54        taskmap_t taskmap;
    4855        memmap_t memmap;
    4956        screen_t screen;
    5057} bootinfo_t;
    51 
    52 extern int _binary_____________kernel_kernel_bin_start;
    53 extern int _binary_____________kernel_kernel_bin_end;
    54 
    55 extern int _binary_____________uspace_init_init_start;
    56 extern int _binary_____________uspace_init_init_end;
    5758
    5859extern void start(void);
Note: See TracChangeset for help on using the changeset viewer.