Changeset 1f330de in mainline
- Timestamp:
- 2006-03-17T02:04:30Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 543c31f
- Parents:
- 01cb210
- Location:
- arch/ppc32/loader
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc32/loader/_link.ld
r01cb210 r1f330de 21 21 *(.bss); /* uninitialized static variables */ 22 22 *(COMMON); /* global variables */ 23 } 24 25 .image 0x10000000+SIZEOF(.boot): AT (SIZEOF(.boot)) SUBALIGN(4096) { 23 24 . = ALIGN(4096); 26 25 *(.image); 27 26 } -
arch/ppc32/loader/asm.S
r01cb210 r1f330de 47 47 # r3 = memmap (pa) 48 48 # r4 = trans (pa) 49 # r5 = number of kernel pages49 # r5 = kernel size 50 50 # r6 = real_mode (pa) 51 51 … … 70 70 # 71 71 # r4 = trans (pa) 72 # r5 = number of kernel pages72 # r5 = kernel size 73 73 74 li r31, PAGE_SIZE >> 374 li r31, PAGE_SIZE >> 2 75 75 li r30, 0 76 76 … … 80 80 beq copy_end 81 81 82 # copy singlepage82 # copy page 83 83 84 84 mtctr r31 … … 92 92 addi r29, r29, 4 93 93 addi r30, r30, 4 94 subi r5, r5, 4 95 96 cmpwi r5, 0 97 beq copy_end 94 98 95 99 bdnz copy_loop 96 100 97 subi r5, r5, 198 101 addi r4, r4, 4 99 102 b page_copy 100 103 101 104 copy_end: 102 103 # fillsegment registers105 106 # invalidate segment registers 104 107 105 li r31, 16106 mtctr r31107 li r31, 0108 li r30, 0x2000108 # li r31, 16 109 # mtctr r31 110 # li r31, 0 111 # li r30, 0 109 112 110 113 seg_fill: 111 114 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 118 145 119 146 # 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 120 172 121 173 tlbia -
arch/ppc32/loader/asm.h
r01cb210 r1f330de 36 36 #define TRANS_ITEM_SIZE 4 37 37 38 #define KERNEL_START_ADDR 0x8000 200038 #define KERNEL_START_ADDR 0x80004000 39 39 40 40 #ifndef __ASM__ … … 43 43 44 44 extern void halt(); 45 extern void jump_to_kernel(void *memmap, void *trans, unsigned int cnt, void *real_mode) __attribute__((noreturn));45 extern void jump_to_kernel(void *memmap, void *trans, unsigned int kernel_size, void *real_mode) __attribute__((noreturn)); 46 46 extern void real_mode(); 47 47 -
arch/ppc32/loader/main.c
r01cb210 r1f330de 47 47 48 48 49 static 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 49 58 void bootstrap(void) 50 59 { … … 55 64 check_align(&trans, "Translation table"); 56 65 66 if (!ofw_memmap(&memmap)) { 67 printf("Error: Unable to get memory map\n"); 68 halt(); 69 } 70 57 71 void *real_mode_pa = ofw_translate(&real_mode); 58 72 void *trans_pa = ofw_translate(&trans); 59 73 void *memmap_pa = ofw_translate(&memmap); 60 74 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); 62 80 printf(" kernel image at %L (size %d bytes)\n", KERNEL_START, KERNEL_SIZE); 63 81 printf(" memory map at %L (physical %L)\n", &memmap, memmap_pa); … … 65 83 printf(" translation table at %L (physical %L)\n", &trans, trans_pa); 66 84 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 73 85 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) { 76 87 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"); 81 89 trans[addr >> PAGE_WIDTH] = pa; 82 90 } 83 91 84 92 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); 86 94 } -
arch/ppc32/loader/regname.h
r01cb210 r1f330de 190 190 #define sprg3 275 191 191 #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 192 208 #define hid0 1008 193 209
Note:
See TracChangeset
for help on using the changeset viewer.