- Timestamp:
- 2013-01-24T22:07:06Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 03362fbd, 3acd1bb, d59c046
- Parents:
- 6218d4b (diff), 24bead17 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- boot/arch/arm32
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/arm32/Makefile.inc
r6218d4b r005b765 49 49 BITS = 32 50 50 ENDIANESS = LE 51 EXTRA_CFLAGS = -march=$(subst _,-,$(PROCESSOR )) -mno-unaligned-access51 EXTRA_CFLAGS = -march=$(subst _,-,$(PROCESSOR_ARCH)) -mno-unaligned-access 52 52 53 53 ifeq ($(MACHINE), gta02) … … 59 59 RD_DRVS += \ 60 60 infrastructure/rootamdm37x \ 61 fb/amdm37x_dispc \ 61 62 bus/usb/ehci \ 62 63 bus/usb/ohci \ -
boot/arch/arm32/_link.ld.in
r6218d4b r005b765 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/include/mm.h
r6218d4b r005b765 58 58 #define GTA02_IOMEM_END 0x60000000 59 59 60 /** Start of ram memory on BBxM */ 61 #define BBXM_RAM_START 0x80000000 62 /** Start of ram memory on BBxM */ 63 #define BBXM_RAM_END 0xc0000000 64 65 60 66 /* Page table level 0 entry - "section" format is used 61 67 * (one-level paging, 1 MB sized pages). Used only while booting the kernel. -
boot/arch/arm32/src/asm.S
r6218d4b r005b765 61 61 # 62 62 63 #if defined(MACHINE_gta02) 63 # 64 # r0 is kernel entry point 65 # r1 is pointer to the bootinfo structure 64 66 65 67 #define CP15_C1_IC 12 68 #define CP15_C1_BP 11 66 69 #define CP15_C1_DC 2 67 #define CP15_C7_SEG_SHIFT 568 #define CP15_C7_SEG_SIZE 369 #define CP15_C7_IDX_SHIFT 2670 71 70 # Disable I-cache and D-cache before the kernel is started. 72 71 mrc p15, 0, r4, c1, c0, 0 73 72 bic r4, r4, #(1 << CP15_C1_DC) 74 73 bic r4, r4, #(1 << CP15_C1_IC) 74 bic r4, r4, #(1 << CP15_C1_BP) 75 75 mcr p15, 0, r4, c1, c0, 0 76 76 77 # Now clean D-cache to guarantee coherency between I-cache and D-cache. 77 78 #Wait for the operations to complete 79 #ifdef PROCESSOR_ARCH_armv7_a 80 dsb 81 #else 82 #cp15 dsb, r4 is ignored (should be zero) 83 mcr p15, 0, r4, c7, c10, 4 84 #endif 85 86 # Clean ICache and BPredictors, r4 ignored (SBZ) 87 mcr p15, 0, r4, c7, c5, 0 88 nop 78 89 79 # D-cache clean and invalidate procedure. 80 # See ARM920T TRM pages 2-17, 4-17. 81 82 # Initialize segment 83 mov r4, #0 84 # Initialize index 85 1: mov r5, #0 86 2: orr r6, r4, r5 87 # Clean and invalidate a single line 88 mcr p15, 0, r6, c7, c10, 2 89 # Increment index 90 add r5, r5, #(1 << CP15_C7_IDX_SHIFT) 91 cmp r5, #0 92 bne 2b 93 # Increment segment 94 add r4, #(1 << CP15_C7_SEG_SHIFT) 95 tst r4, #(1 << (CP15_C7_SEG_SHIFT + CP15_C7_SEG_SIZE)) 96 beq 1b 90 #Wait for the operations to complete 91 #ifdef PROCESSOR_ARCH_armv7_a 92 isb 93 nop 94 #else 95 # cp15 isb 96 mcr p15, 0, r4, c7, c5, 4 97 nop 97 98 #endif 98 99 99 mov pc, r0 -
boot/arch/arm32/src/main.c
r6218d4b r005b765 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_poc(void *address, size_t size) 72 { 73 const uintptr_t addr = (uintptr_t)address; 74 /* DCCMVAC - clean by address to the point of coherence */ 75 for (uintptr_t a = addr; a < addr + size; a += 4) { 76 asm volatile ("mcr p15, 0, %[a], c7, c10, 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_poc(dest[i - 1], components[i - 1].inflated); 113 151 } 114 152 115 153 printf(".\n"); 116 154 117 printf("Booting the kernel... 155 printf("Booting the kernel...\n"); 118 156 jump_to_kernel((void *) PA2KA(BOOT_OFFSET), &bootinfo); 119 157 } -
boot/arch/arm32/src/mm.c
r6218d4b r005b765 56 56 else 57 57 return 1; 58 #else 58 #elif defined MACHINE_beagleboardxm 59 const unsigned long address = section << PTE_SECTION_SHIFT; 60 if (address >= BBXM_RAM_START && address < BBXM_RAM_END) 61 return 1; 62 #endif 59 63 return 0; 60 #endif61 64 } 62 65 … … 130 133 "mcr p15, 0, r0, c3, c0, 0\n" 131 134 132 #ifdef PROCESSOR_armv7_a133 /* Read Auxiliary control register */134 "mrc p15, 0, r0, c1, c0, 1\n"135 /* Mask to enable L2 cache */136 "ldr r1, =0x00000002\n"137 "orr r0, r0, r1\n"138 /* Store Auxiliary control register */139 "mrc p15, 0, r0, c1, c0, 1\n"140 #endif141 135 /* Current settings */ 142 136 "mrc p15, 0, r0, c1, c0, 0\n" 143 137 144 #ifdef PROCESSOR_armv7_a 145 /* Mask to enable paging, caching */ 146 "ldr r1, =0x00000005\n" 147 #else 148 #ifdef MACHINE_gta02 149 /* Mask to enable paging (bit 0), 150 D-cache (bit 2), I-cache (bit 12) */ 151 "ldr r1, =0x00001005\n" 152 #else 153 /* Mask to enable paging */ 154 "ldr r1, =0x00000001\n" 155 #endif 156 #endif 138 /* Enable ICache, DCache, BPredictors and MMU, 139 * we disable caches before jumping to kernel 140 * so this is safe for all archs. 141 */ 142 "ldr r1, =0x00001805\n" 143 157 144 "orr r0, r0, r1\n" 158 145
Note:
See TracChangeset
for help on using the changeset viewer.