Changeset bfb6576 in mainline
- Timestamp:
- 2013-01-23T00:12:15Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b80d132
- Parents:
- c19808fd
- Location:
- boot/arch/arm32
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/arm32/_link.ld.in
rc19808fd rbfb6576 11 11 . = BOOT_BASE + 0x8000; 12 12 .data : { 13 bdata_start = .; 13 14 *(BOOTPT); /* bootstrap page table */ 14 15 *(BOOTSTACK); /* bootstrap stack */ … … 24 25 [[COMPONENTS]] 25 26 } 26 27 bdata_end = .; 28 27 29 /DISCARD/ : { 28 30 *(.gnu.*); -
boot/arch/arm32/src/asm.S
rc19808fd rbfb6576 66 66 # r2 is a kernel text end 67 67 68 # make sure kernel is flushed and available in memory69 # Disable I-cache and D-cache before the kernel is started.70 # TODO disabling DCache should not be necessary...71 #define CP15_C1_IC 1272 #define CP15_C1_DC 273 mrc p15, 0, r4, c1, c0, 074 bic r4, r4, #(1 << CP15_C1_DC)75 bic r4, r4, #(1 << CP15_C1_IC)76 mcr p15, 0, r4, c1, c0, 077 78 # use r4 as a moving pointer79 mov r4, r080 3:81 # DCCMVAC (flush by virt address, to the point of coherence)82 mcr p15, 0, r4, c7, c10, 183 # TODO: it would be better to use cacheline size84 add r4, r4, #485 # are we there yet?86 cmp r4, r287 blt 3b88 nop89 mov r4, #090 68 91 69 #Wait for the operations to complete … … 99 77 # Clean ICache and BPredictors, r4 ignored (SBZ) 100 78 mcr p15, 0, r4, c7, c5, 0 79 nop 101 80 102 81 #Wait for the operations to complete 103 82 #ifdef PROCESSOR_ARCH_armv7_a 104 83 isb 84 nop 105 85 #else 106 86 # cp15 isb 107 87 mcr p15, 0, r4, c7, c5, 4 88 nop 108 89 #endif 109 90 -
boot/arch/arm32/src/main.c
rc19808fd rbfb6576 50 50 #define TOP2ADDR(top) (((void *) PA2KA(BOOT_OFFSET)) + (top)) 51 51 52 extern void *bdata_start; 53 extern void *bdata_end; 54 55 56 static inline void invalidate_icache(void) 57 { 58 /* ICIALLU Invalidate entire ICache */ 59 asm volatile ("mov r0, #0\n" "mcr p15, 0, r0, c7, c5, 0\n" ::: "r0" ); 60 } 61 62 static inline void invalidate_dcache(void *address, size_t size) 63 { 64 const uintptr_t addr = (uintptr_t)address; 65 /* DCIMVAC - invalidate by address to the point of coherence */ 66 for (uintptr_t a = addr; a < addr + size; a += 4) { 67 asm volatile ("mcr p15, 0, %[a], c7, c6, 1\n" :: [a]"r"(a) : ); 68 } 69 } 70 71 static inline void clean_dcache_pou(void *address, size_t size) 72 { 73 const uintptr_t addr = (uintptr_t)address; 74 /* DCCMVAU - clean by address to the point of unification */ 75 for (uintptr_t a = addr; a < addr + size; a += 4) { 76 asm volatile ("mcr p15, 0, %[a], c7, c11, 1\n" :: [a]"r"(a) : ); 77 } 78 } 79 52 80 static bootinfo_t bootinfo; 53 81 54 82 void bootstrap(void) 55 83 { 84 /* Make sure we run in memory code when caches are enabled, 85 * make sure we read memory data too. This part is ARMv7 specific as 86 * ARMv7 no longer invalidates caches on restart. 87 * See chapter B2.2.2 of ARM Architecture Reference Manual p. B2-1263*/ 88 invalidate_icache(); 89 invalidate_dcache(&bdata_start, &bdata_end - &bdata_start); 90 91 /* Enable MMU and caches */ 56 92 mmu_start(); 57 93 version_print(); 58 94 95 printf("Boot data: %p -> %p\n", &bdata_start, &bdata_end); 59 96 printf("\nMemory statistics\n"); 60 97 printf(" %p|%p: bootstrap stack\n", &boot_stack, &boot_stack); … … 64 101 (void *) PA2KA(BOOT_OFFSET), (void *) BOOT_OFFSET); 65 102 66 size_t i; 67 for (i = 0; i < COMPONENTS; i++) 103 for (size_t i = 0; i < COMPONENTS; i++) { 68 104 printf(" %p|%p: %s image (%u/%u bytes)\n", components[i].start, 69 105 components[i].start, components[i].name, components[i].inflated, 70 106 components[i].size); 107 invalidate_dcache(components[i].start, components[i].size); 108 } 71 109 72 110 void *dest[COMPONENTS]; … … 74 112 size_t cnt = 0; 75 113 bootinfo.cnt = 0; 76 for ( i = 0; i < min(COMPONENTS, TASKMAP_MAX_RECORDS); i++) {114 for (size_t i = 0; i < min(COMPONENTS, TASKMAP_MAX_RECORDS); i++) { 77 115 top = ALIGN_UP(top, PAGE_SIZE); 78 116 … … 94 132 printf("\nInflating components ... "); 95 133 96 for ( i = cnt; i > 0; i--) {134 for (size_t i = cnt; i > 0; i--) { 97 135 void *tail = components[i - 1].start + components[i - 1].size; 98 136 if (tail >= dest[i - 1]) { … … 106 144 int err = inflate(components[i - 1].start, components[i - 1].size, 107 145 dest[i - 1], components[i - 1].inflated); 108 109 146 if (err != EOK) { 110 147 printf("\n%s: Inflating error %d\n", components[i - 1].name, err); 111 148 halt(); 112 149 } 150 clean_dcache_pou(dest[i - 1], components[i - 1].inflated); 113 151 } 114 152 -
boot/arch/arm32/src/mm.c
rc19808fd rbfb6576 59 59 const unsigned long address = section << PTE_SECTION_SHIFT; 60 60 if (address >= BBXM_RAM_START && address < BBXM_RAM_END) 61 return 0;61 return 1; 62 62 #endif 63 63 return 0; … … 133 133 "mcr p15, 0, r0, c3, c0, 0\n" 134 134 135 #ifdef PROCESSOR_ARCH_armv7_a136 /* armv7 no longer requires cache entries to be invalid137 * upon reset, do this manually */138 /* Invalidate ICache */139 "mcr p15, 0, r0, c7, c5, 6\n"140 //TODO: Invalidate data cache141 #endif142 143 135 /* Current settings */ 144 136 "mrc p15, 0, r0, c1, c0, 0\n" … … 151 143 * It's safe for gta02 too because we turn the caches off 152 144 * before switching to kernel. */ 153 "ldr r1, =0x0000180 5\n"145 "ldr r1, =0x00001801\n" 154 146 #elif defined(PROCESSOR_ARCH_armv7_a) | defined(PROCESSOR_ARCH_armv6) 155 147 /* Enable paging, data cache and branch prediction
Note:
See TracChangeset
for help on using the changeset viewer.