Changeset 1fbe8da2 in mainline


Ignore:
Timestamp:
2006-03-15T18:25:43Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f9719b58
Parents:
032a9b3
Message:

ppc32: boot using real mode trampoline
setup segment registers so far

Location:
arch/ppc32/loader
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/loader/Makefile

    r032a9b3 r1fbe8da2  
    6666
    6767image.boot: depend $(OBJECTS) kernel.o
    68         $(LD) -no-check-sections -N -T _link.ld $(OBJECTS) kernel.o -o $@
     68        $(LD) -no-check-sections -N -T _link.ld -Map map $(OBJECTS) kernel.o -o $@
    6969
    7070depend:
  • arch/ppc32/loader/_link.ld

    r032a9b3 r1fbe8da2  
    1010        .image 0x10000000: AT (0) {
    1111                *(BOOTSTRAP)
     12                *(REALMODE)
    1213                *(.text);
    1314               
  • arch/ppc32/loader/asm.S

    r032a9b3 r1fbe8da2  
    181181
    182182jump_to_kernel:
     183       
     184        # r3 = kernel_start (va)
     185        # r4 = memmap (pa)
     186        # r5 = real_mode (pa)
     187       
     188        mtspr srr0, r5
     189       
     190        # jumps to real_mode
     191       
     192        mfmsr r5
     193        lis r6, ~0@h
     194        ori r6, r6, ~(msr_ir | msr_dr)@l
     195        and r5, r5, r6
     196        mtspr srr1, r5
     197        rfi
     198
     199.section REALMODE
     200.align 12
     201.global real_mode
     202
     203real_mode:
     204
     205        # fill segment registers
     206
     207        li r5, 16
     208        mtctr r5
     209        li r5, 0
     210        li r6, 0
     211       
     212        seg_fill:
     213       
     214                mtsrin r6, r5
     215                addis r5, r5, 0x1000    # move to next SR
     216                addis r6, r6, 0x10      # add 256 MB, move to next SR
     217               
     218                bdnz seg_fill
     219       
     220        # bootstrap kernel
     221        #
     222        # r3 = kernel_start (va)
     223        # r4 = memmap (pa)       -> r10
     224       
     225        mtspr srr0, r3
     226       
     227        mfmsr r5
     228        ori r5, r5, (msr_ir | msr_dr)@l
     229        mtspr srr1, r5
     230       
    183231        mr r10, r4
    184         mtlr r3
    185         blr
     232        rfi
  • arch/ppc32/loader/asm.h

    r032a9b3 r1fbe8da2  
    3131
    3232void flush_instruction_cache(void);
    33 void jump_to_kernel(void *code, void *memmap) __attribute__((noreturn));
     33void jump_to_kernel(void *code, void *memmap, void *real_mode) __attribute__((noreturn));
     34void real_mode(void *code, void *memmap);
    3435
    3536#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
  • arch/ppc32/loader/main.c

    r032a9b3 r1fbe8da2  
    5353        printf("total memory %d MB\n", memmap.total >> 20);
    5454       
    55         // FIXME: map just the kernel
    56         if (ofw_map((void *) KERNEL_PHYSICAL_ADDRESS, (void *) KERNEL_VIRTUAL_ADDRESS, memmap.total - 64 * 1024 * 1024, 0) != 0) {
     55        if (ofw_map((void *) KERNEL_PHYSICAL_ADDRESS, (void *) KERNEL_VIRTUAL_ADDRESS, KERNEL_SIZE + KERNEL_BOOT_OFFSET, 0) != 0) {
    5756                printf("Unable to map kernel memory at %L (physical %L)\n", KERNEL_VIRTUAL_ADDRESS, KERNEL_PHYSICAL_ADDRESS);
    5857                halt();
     
    6665        ofw_map((void *) 0x80816000, (void *) 0xf2000000, 0x00018000, 0);
    6766       
     67        void *tramp = ofw_translate(&real_mode);
     68        printf("bootstrap trampoline at %L (physical %L)\n", &real_mode, tramp);
    6869        printf("Booting the kernel...\n");
    6970       
    7071        flush_instruction_cache();
    71         jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS + KERNEL_BOOT_OFFSET, ofw_translate(&memmap));
     72        jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS + KERNEL_BOOT_OFFSET, ofw_translate(&memmap), tramp);
    7273}
Note: See TracChangeset for help on using the changeset viewer.