Changeset 27518e4 in mainline


Ignore:
Timestamp:
2008-09-13T14:45:04Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9f3363e
Parents:
0320823
Message:

Support for ramdisks external to image.boot on sparc64.

The sparc64 port can now boot from a ramdisk which is not part of image.boot.
This allows us to use larger ramdisks with SILO.

Location:
boot/arch/sparc64
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • boot/arch/sparc64/Makefile.inc

    r0320823 r27518e4  
    3838        cp arch/$(ARCH)/loader/image.boot $(TMP)/HelenOS/image.boot
    3939        gzip -f $(TMP)/HelenOS/image.boot
     40        cp arch/$(ARCH)/loader/initrd.img $(TMP)/HelenOS/initrd.img
    4041        mkisofs -f -G $(TMP)/boot/isofs.b -B ... -r -o $(BASE)/image.iso $(TMP)/
    4142
  • boot/arch/sparc64/loader/Makefile

    r0320823 r27518e4  
    115115-include Makefile.depend
    116116
    117 image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) initrd.o $(OBJECTS)
    118         $(LD) -Map image.map -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) initrd.o $(OBJECTS) -o $@
     117image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS)
     118        $(LD) -Map image.map -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@
    119119
    120120depend:
     
    125125                rm -f $(USPACEDIR)/dist/sbin/`basename $$task` ; \
    126126        done
    127         -rm -f _components.h _components.c _link.ld $(COMPONENT_OBJECTS) initrd.o $(OBJECTS) initrd.img image.boot image.map image.disasm Makefile.depend
     127        -rm -f _components.h _components.c _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) initrd.img image.boot image.map image.disasm Makefile.depend
    128128
    129129_components.h _components.c _link.ld $(COMPONENT_OBJECTS) initrd.o: $(COMPONENTS) $(RD_TASKS) _link.ld.in
     
    139139        ../../../../tools/mkhord.py 16384 initrd.fs initrd.img
    140140        rm initrd.fs
    141         ../../../tools/pack.py $(OBJCOPY) $(BFD_NAME) $(BFD_ARCH) 1 "unsigned long" $(COMPONENTS) ./initrd.img
     141        ../../../tools/pack.py $(OBJCOPY) $(BFD_NAME) $(BFD_ARCH) 1 "unsigned long" $(COMPONENTS)
    142142
    143143%.o: %.S
  • boot/arch/sparc64/loader/main.c

    r0320823 r27518e4  
    6565void bootstrap(void)
    6666{
     67        void *base = (void *) KERNEL_VIRTUAL_ADDRESS;
     68        void *balloc_base;
     69        unsigned int top = 0;
     70        int i, j;
     71
    6772        version_print();
    6873       
     
    9297                silo_ramdisk_image += bootinfo.physmem_start;
    9398                silo_ramdisk_image -= 0x400000;
     99                /* Install 1:1 mapping for the ramdisk. */
     100                if (ofw_map((void *)((uintptr_t)silo_ramdisk_image),
     101                    (void *)((uintptr_t)silo_ramdisk_image),
     102                    silo_ramdisk_size, -1) != 0) {
     103                        printf("Failed to map ramdisk.\n");
     104                        halt();
     105                }
    94106        }
    95107       
     
    102114        printf(" %P: boot info structure\n", &bootinfo);
    103115       
    104         unsigned int i;
    105         for (i = 0; i < COMPONENTS; i++)
     116        /*
     117         * Figure out destination address for each component.
     118         * In this phase, we don't copy the components yet because we want to
     119         * to be careful not to overwrite anything, especially the components
     120         * which haven't been copied yet.
     121         */
     122        bootinfo.taskmap.count = 0;
     123        for (i = 0; i < COMPONENTS; i++) {
    106124                printf(" %P: %s image (size %d bytes)\n", components[i].start,
    107125                    components[i].name, components[i].size);
    108 
    109         void * base = (void *) KERNEL_VIRTUAL_ADDRESS;
    110         unsigned int top = 0;
    111 
    112         printf("\nCopying components\n");
    113         bootinfo.taskmap.count = 0;
    114         for (i = 0; i < COMPONENTS; i++) {
     126                top = ALIGN_UP(top, PAGE_SIZE);
     127                if (i > 0) {
     128                        if (bootinfo.taskmap.count == TASKMAP_MAX_RECORDS) {
     129                                printf("Skipping superfluous components.\n");
     130                                break;
     131                        }
     132                        bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr =
     133                            base + top;
     134                        bootinfo.taskmap.tasks[bootinfo.taskmap.count].size =
     135                            components[i].size;
     136                        bootinfo.taskmap.count++;
     137                }
     138                top += components[i].size;
     139        }
     140
     141        j = bootinfo.taskmap.count - 1; /* do not consider ramdisk */
     142
     143        if (silo_ramdisk_image) {
     144                /* Treat the ramdisk as the last bootinfo task. */
     145                if (bootinfo.taskmap.count == TASKMAP_MAX_RECORDS) {
     146                        printf("Skipping ramdisk.\n");
     147                        goto skip_ramdisk;
     148                }
     149                top = ALIGN_UP(top, PAGE_SIZE);
     150                bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr =
     151                    base + top;
     152                bootinfo.taskmap.tasks[bootinfo.taskmap.count].size =
     153                    silo_ramdisk_size;
     154                bootinfo.taskmap.count++;
     155                printf("\nCopying ramdisk...");
     156                /*
     157                 * Claim and map the whole ramdisk as it may exceed the area
     158                 * given to us by SILO.
     159                 */
     160                (void) ofw_claim_phys(base + top, silo_ramdisk_size);
     161                (void) ofw_map(base + top, base + top, silo_ramdisk_size, -1);
     162                /*
     163                 * FIXME If the source and destination overlap, it may be
     164                 * desirable to copy in reverse order, depending on how the two
     165                 * regions overlap.
     166                 */
     167                memcpy(base + top, (void *)((uintptr_t)silo_ramdisk_image),
     168                    silo_ramdisk_size);
     169                printf("done.\n");
     170                top += silo_ramdisk_size;
     171        }
     172skip_ramdisk:
     173
     174        /*
     175         * Now we can proceed to copy the components. We do it in reverse order
     176         * so that we don't overwrite anything even if the components overlap
     177         * with base.
     178         */
     179        printf("\nCopying bootinfo tasks\n");
     180        for (i = COMPONENTS - 1; i > 0; i--, j--) {
    115181                printf(" %s...", components[i].name);
    116                 top = ALIGN_UP(top, PAGE_SIZE);
    117182
    118183                /*
     
    123188                 * to addresses from [0xffd00000; 0xffefffff] and
    124189                 * [0xfe000000; 0xfeffffff].
     190                 *
     191                 * XXX We don't map this piece of memory. We simply rely on
     192                 *     SILO to have it done for us already in this case.
    125193                 */
    126                 (void) ofw_claim_phys(bootinfo.physmem_start + base + top,
     194                (void) ofw_claim_phys(bootinfo.physmem_start +
     195                    bootinfo.taskmap.tasks[j].addr,
    127196                    ALIGN_UP(components[i].size, PAGE_SIZE));
    128197                   
    129                 memcpy(base + top, components[i].start, components[i].size);
    130                 if (i > 0) {
    131                         bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr =
    132                             base + top;
    133                         bootinfo.taskmap.tasks[bootinfo.taskmap.count].size =
    134                             components[i].size;
    135                         bootinfo.taskmap.count++;
    136                 }
    137                 top += components[i].size;
     198                memcpy((void *)bootinfo.taskmap.tasks[j].addr,
     199                    components[i].start, components[i].size);
    138200                printf("done.\n");
    139201        }
    140202
    141         /*
    142          * Claim the physical memory for the boot allocator.
     203        printf("\nCopying kernel...");
     204        (void) ofw_claim_phys(bootinfo.physmem_start + base,
     205            ALIGN_UP(components[0].size, PAGE_SIZE));
     206        memcpy(base, components[0].start, components[0].size);
     207        printf("done.\n");
     208
     209        /*
     210         * Claim and map the physical memory for the boot allocator.
    143211         * Initialize the boot allocator.
    144212         */
    145         (void) ofw_claim_phys(bootinfo.physmem_start +
    146             base + ALIGN_UP(top, PAGE_SIZE), BALLOC_MAX_SIZE);
    147         balloc_init(&bootinfo.ballocs, ALIGN_UP(((uintptr_t) base) + top,
    148             PAGE_SIZE));
     213        balloc_base = base + ALIGN_UP(top, PAGE_SIZE);
     214        (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base,
     215            BALLOC_MAX_SIZE);
     216        (void) ofw_map(balloc_base, balloc_base, BALLOC_MAX_SIZE, -1);
     217        balloc_init(&bootinfo.ballocs, (uintptr_t)balloc_base);
    149218
    150219        printf("\nCanonizing OpenFirmware device tree...");
  • boot/arch/sparc64/silo/silo.conf

    r0320823 r27518e4  
    22image = /HelenOS/image.boot.gz
    33        label = HelenOS
     4        initrd = /HelenOS/initrd.img
Note: See TracChangeset for help on using the changeset viewer.