Changeset 1f330de in mainline


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

proper ppc32 initial memory mapping

Location:
arch/ppc32/loader
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/loader/_link.ld

    r01cb210 r1f330de  
    2121                *(.bss);                /* uninitialized static variables */   
    2222                *(COMMON);              /* global variables */
    23         }
    24        
    25         .image 0x10000000+SIZEOF(.boot): AT (SIZEOF(.boot)) SUBALIGN(4096) {
     23               
     24                . = ALIGN(4096);
    2625                *(.image);
    2726        }
  • arch/ppc32/loader/asm.S

    r01cb210 r1f330de  
    4747        # r3 = memmap (pa)
    4848        # r4 = trans (pa)
    49         # r5 = number of kernel pages
     49        # r5 = kernel size
    5050        # r6 = real_mode (pa)
    5151       
     
    7070        #
    7171        # r4 = trans (pa)
    72         # r5 = number of kernel pages
     72        # r5 = kernel size
    7373       
    74         li r31, PAGE_SIZE >> 3
     74        li r31, PAGE_SIZE >> 2
    7575        li r30, 0
    7676       
     
    8080                beq copy_end
    8181               
    82                 # copy single page
     82                # copy page
    8383               
    8484                mtctr r31
     
    9292                        addi r29, r29, 4
    9393                        addi r30, r30, 4
     94                        subi r5, r5, 4
     95                       
     96                        cmpwi r5, 0
     97                        beq copy_end
    9498                       
    9599                        bdnz copy_loop
    96100               
    97                 subi r5, r5, 1
    98101                addi r4, r4, 4
    99102                b page_copy
    100103       
    101104        copy_end:
    102                
    103         # fill segment registers
     105       
     106        # invalidate segment registers
    104107
    105         li r31, 16
    106         mtctr r31
    107         li r31, 0
    108         li r30, 0x2000
     108#       li r31, 16
     109#       mtctr r31
     110#       li r31, 0
     111#       li r30, 0
    109112       
    110113        seg_fill:
    111114       
    112                 mtsrin r30, r31
    113                
    114                 addis r31, r31, 0x1000    # add 256 MB
    115                 addi  r30, r30, 0x111     # move to next SR
    116                
    117                 bdnz seg_fill
     115#               mtsrin r30, r31
     116#               addis r31, r31, 0x1000    # move to next SR
     117#               
     118#               bdnz seg_fill
     119       
     120        # invalidate block address translation registers
     121       
     122        mtspr ibat0u, r30
     123        mtspr ibat0l, r30
     124       
     125        mtspr ibat1u, r30
     126        mtspr ibat1l, r30
     127       
     128        mtspr ibat2u, r30
     129        mtspr ibat2l, r30
     130       
     131        mtspr ibat3u, r30
     132        mtspr ibat3l, r30
     133       
     134        mtspr dbat0u, r30
     135        mtspr dbat0l, r30
     136       
     137        mtspr dbat1u, r30
     138        mtspr dbat1l, r30
     139       
     140        mtspr dbat2u, r30
     141        mtspr dbat2l, r30
     142       
     143        mtspr dbat3u, r30
     144        mtspr dbat3l, r30
    118145       
    119146        # create identity mapping
     147       
     148        # FIXME: map exactly the size of RAM
     149       
     150        lis r31, 0x8000
     151        ori r31, r31, 0x0ffe
     152       
     153        lis r30, 0x0000
     154        ori r30, r30, 0x0002
     155       
     156        mtspr ibat0u, r31
     157        mtspr ibat0l, r30
     158       
     159        mtspr dbat0u, r31
     160        mtspr dbat0l, r30
     161       
     162        # FIXME: temporal framebuffer mapping
     163       
     164        lis r31, 0xf000
     165        ori r31, r31, 0x0ffe
     166       
     167        lis r30, 0x8400
     168        ori r30, r30, 0x0002
     169       
     170        mtspr dbat1u, r31
     171        mtspr dbat1l, r30
    120172       
    121173        tlbia
  • arch/ppc32/loader/asm.h

    r01cb210 r1f330de  
    3636#define TRANS_ITEM_SIZE 4
    3737
    38 #define KERNEL_START_ADDR 0x80002000
     38#define KERNEL_START_ADDR 0x80004000
    3939
    4040#ifndef __ASM__
     
    4343
    4444extern void halt();
    45 extern void jump_to_kernel(void *memmap, void *trans, unsigned int cnt, void *real_mode) __attribute__((noreturn));
     45extern void jump_to_kernel(void *memmap, void *trans, unsigned int kernel_size, void *real_mode) __attribute__((noreturn));
    4646extern void real_mode();
    4747
  • arch/ppc32/loader/main.c

    r01cb210 r1f330de  
    4747
    4848
     49static void check_overlap(const void *addr, const char *desc)
     50{
     51        if ((unsigned int) addr < KERNEL_SIZE) {
     52                printf("Error: %s overlaps kernel physical area\n", desc);
     53                halt();
     54        }
     55}
     56
     57
    4958void bootstrap(void)
    5059{
     
    5564        check_align(&trans, "Translation table");
    5665       
     66        if (!ofw_memmap(&memmap)) {
     67                printf("Error: Unable to get memory map\n");
     68                halt();
     69        }
     70       
    5771        void *real_mode_pa = ofw_translate(&real_mode);
    5872        void *trans_pa = ofw_translate(&trans);
    5973        void *memmap_pa = ofw_translate(&memmap);
    6074       
    61         printf("Memory statistics\n");
     75        check_overlap(real_mode_pa, "Bootstrap trampoline");
     76        check_overlap(trans_pa, "Translation table");
     77        check_overlap(memmap_pa, "Memory map");
     78       
     79        printf("Memory statistics (total %d MB)\n", memmap.total >> 20);
    6280        printf(" kernel image         at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE);
    6381        printf(" memory map           at %L (physical %L)\n", &memmap, memmap_pa);
     
    6583        printf(" translation table    at %L (physical %L)\n", &trans, trans_pa);
    6684       
    67         if (!ofw_memmap(&memmap)) {
    68                 printf("Unable to get memory map\n");
    69                 halt();
    70         }
    71         printf("Total memory %d MB\n", memmap.total >> 20);
    72        
    7385        unsigned int addr;
    74         unsigned int pages;
    75         for (addr = 0, pages = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE, pages++) {
     86        for (addr = 0; addr < KERNEL_SIZE; addr += PAGE_SIZE) {
    7687                void *pa = ofw_translate(KERNEL_START + addr);
    77                 if ((unsigned int) pa < KERNEL_SIZE) {
    78                         printf("Error: Kernel image overlaps kernel physical area\n");
    79                         halt();
    80                 }
     88                check_overlap(pa, "Kernel image");
    8189                trans[addr >> PAGE_WIDTH] = pa;
    8290        }
    8391       
    8492        printf("Booting the kernel...\n");
    85         jump_to_kernel(memmap_pa, trans_pa, pages, real_mode_pa);
     93        jump_to_kernel(memmap_pa, trans_pa, KERNEL_SIZE, real_mode_pa);
    8694}
  • arch/ppc32/loader/regname.h

    r01cb210 r1f330de  
    190190#define sprg3   275
    191191#define prv             287
     192#define ibat0u  528
     193#define ibat0l  529
     194#define ibat1u  530
     195#define ibat1l  531
     196#define ibat2u  532
     197#define ibat2l  533
     198#define ibat3u  534
     199#define ibat3l  535
     200#define dbat0u  536
     201#define dbat0l  537
     202#define dbat1u  538
     203#define dbat1l  539
     204#define dbat2u  540
     205#define dbat2l  541
     206#define dbat3u  542
     207#define dbat3l  543
    192208#define hid0    1008
    193209
Note: See TracChangeset for help on using the changeset viewer.