File indexing completed on 2025-05-11 08:23:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <rtems/score/percpu.h>
0037
0038 #include <bsp.h>
0039
0040 #include <libcpu/powerpc-utility.h>
0041
0042 #include <bsp/vectors.h>
0043
0044 #if (QORIQ_INITIAL_MSR & MSR_FP) != 0
0045 #define INITIALIZE_FPU
0046 #endif
0047
0048 #define FIRST_TLB 0
0049 #define SCRATCH_TLB QORIQ_TLB1_ENTRY_COUNT - 1
0050 #define INITIAL_MSR r14
0051 #define START_STACK r15
0052 #define SAVED_LINK_REGISTER r16
0053 #define FDT_REGISTER r17
0054 #define CPU_SELF r18
0055
0056 .globl _start
0057 #ifdef RTEMS_SMP
0058 #if QORIQ_THREAD_COUNT > 1
0059 .globl _start_thread
0060 #endif
0061 .globl _start_secondary_processor
0062 #endif
0063 .globl bsp_exc_vector_base
0064
0065 .section ".bsp_start_text", "ax"
0066
0067 _start:
0068 mr FDT_REGISTER, r3
0069 bl .Linitearly
0070
0071
0072 LA START_STACK, _ISR_Stack_area_begin
0073 LA r3, _ISR_Stack_size
0074 add START_STACK, START_STACK, r3
0075
0076 bl .Linitmore
0077
0078
0079 LA r3, bsp_section_fast_text_begin
0080 LA r4, bsp_section_fast_text_load_begin
0081 LA r5, bsp_section_fast_text_size
0082 bl .Lcopy
0083 LA r3, bsp_section_fast_text_begin
0084 LA r4, bsp_section_fast_text_size
0085 bl rtems_cache_flush_multiple_data_lines
0086 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0087
0088
0089 LA r3, bsp_section_rodata_begin
0090 LA r4, bsp_section_rodata_load_begin
0091 LA r5, bsp_section_rodata_size
0092 bl .Lcopy
0093
0094
0095 mr r3, FDT_REGISTER
0096 bl bsp_fdt_copy
0097 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0098
0099
0100 LA r3, bsp_section_rodata_begin
0101 LA r4, bsp_section_rodata_size
0102 bl rtems_cache_flush_multiple_data_lines
0103 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0104
0105
0106 LA r3, bsp_section_fast_data_begin
0107 LA r4, bsp_section_fast_data_load_begin
0108 LA r5, bsp_section_fast_data_size
0109 bl .Lcopy
0110
0111
0112 LA r3, bsp_section_data_begin
0113 LA r4, bsp_section_data_load_begin
0114 LA r5, bsp_section_data_size
0115 bl .Lcopy
0116
0117
0118 mfspr r3, BOOKE_PIR
0119 cmpwi r3, 0
0120 bne .Lnull_area_setup_done
0121 LA r3, bsp_section_start_begin
0122 SHIFT_RIGHT_IMMEDIATE r3, r3, 2
0123 mtctr r3
0124 li r3, -4
0125 LWI r4, 0x44000002
0126 .Lnull_area_setup_loop:
0127 stwu r4, 4(r3)
0128 bdnz .Lnull_area_setup_loop
0129 .Lnull_area_setup_done:
0130
0131 li r3, 1
0132 bl .Linitmmu
0133
0134
0135 LA r3, bsp_section_sbss_begin
0136 LA r4, bsp_section_sbss_size
0137 bl bsp_start_zero
0138 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0139
0140
0141 LA r3, bsp_section_bss_begin
0142 LA r4, bsp_section_bss_size
0143 bl bsp_start_zero
0144 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0145
0146 #ifndef __powerpc64__
0147
0148 bl __eabi
0149 #endif
0150
0151
0152 li r3, 0
0153
0154 bl boot_card
0155 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0156
0157 .Lcopy:
0158 PPC_REG_CMP r3, r4
0159 beqlr
0160 b memcpy
0161 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0162
0163 .Linitearly:
0164 #ifdef __powerpc64__
0165
0166 mfspr r0, BOOKE_EPCR
0167 oris r0, r0, BOOKE_EPCR_ICM >> 16
0168 mtspr BOOKE_EPCR, r0
0169
0170
0171 mfmsr r0
0172 oris r0, r0, MSR_CM >> 16
0173 mtmsr r0
0174 isync
0175 #endif
0176
0177
0178 mfspr r0, BOOKE_TCR
0179 LWI r4, BOOKE_TCR_DIE
0180 andc r0, r0, r4
0181 mtspr BOOKE_TCR, r0
0182
0183 #ifdef QORIQ_INITIAL_SPEFSCR
0184
0185 LWI r0, QORIQ_INITIAL_SPEFSCR
0186 mtspr FSL_EIS_SPEFSCR, r0
0187 #endif
0188
0189 #ifdef QORIQ_INITIAL_BUCSR
0190
0191 LWI r0, QORIQ_INITIAL_BUCSR
0192 mtspr FSL_EIS_BUCSR, r0
0193 isync
0194 #endif
0195
0196 #if defined(QORIQ_INITIAL_HID0) && !defined(QORIQ_IS_HYPERVISOR_GUEST)
0197
0198 LWI r0, QORIQ_INITIAL_HID0
0199 mtspr HID0, r0
0200 #endif
0201
0202 #ifdef __powerpc64__
0203 LA32 r2, .TOC.
0204 #else
0205
0206 li r2, 0
0207
0208
0209 LA r13, _SDA_BASE_
0210 #endif
0211
0212 SET_SELF_CPU_CONTROL CPU_SELF, r5
0213
0214 blr
0215
0216 .Linitmore:
0217 mflr SAVED_LINK_REGISTER
0218
0219
0220 li r3, 1
0221 bl qoriq_tlb1_invalidate_all_by_ts
0222 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0223
0224
0225 li r3, SCRATCH_TLB
0226 li r4, FSL_EIS_MAS1_TS
0227 li r5, FSL_EIS_MAS2_M
0228 li r6, FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW | FSL_EIS_MAS3_SX
0229 li r7, 0
0230 li r8, 0
0231 li r9, 11
0232 bl qoriq_tlb1_write
0233 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0234
0235
0236 LWI INITIAL_MSR, QORIQ_INITIAL_MSR
0237 ori r0, INITIAL_MSR, MSR_IS | MSR_DS
0238 #ifdef QORIQ_IS_HYPERVISOR_GUEST
0239 oris r0, r0, MSR_GS >> 16
0240 #endif
0241 mtmsr r0
0242 isync
0243
0244
0245
0246
0247
0248 subi r1, START_STACK, PPC_DEFAULT_CACHE_LINE_SIZE
0249 li r0, 0
0250 PPC_REG_STORE r0, 0(r1)
0251
0252 #ifdef INITIALIZE_FPU
0253 bl .Linitfpu
0254 #endif
0255
0256 mtlr SAVED_LINK_REGISTER
0257 blr
0258
0259 .Linitmmu:
0260 mflr SAVED_LINK_REGISTER
0261
0262
0263 li r4, FIRST_TLB
0264 li r5, SCRATCH_TLB
0265 bl qoriq_mmu_config
0266 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0267 mtmsr INITIAL_MSR
0268 isync
0269 li r3, SCRATCH_TLB
0270 bl qoriq_tlb1_invalidate
0271 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0272
0273 mtlr SAVED_LINK_REGISTER
0274 blr
0275
0276 #ifdef INITIALIZE_FPU
0277
0278
0279
0280
0281
0282 .Linitfpu:
0283 li r0, 0
0284 stw r0, 0(r1)
0285 stw r0, 4(r1)
0286 lfd f0, 0(r1)
0287 fmr f1, f0
0288 fmr f2, f0
0289 fmr f3, f0
0290 fmr f4, f0
0291 fmr f5, f0
0292 fmr f6, f0
0293 fmr f7, f0
0294 fmr f8, f0
0295 fmr f9, f0
0296 fmr f10, f0
0297 fmr f11, f0
0298 fmr f12, f0
0299 fmr f13, f0
0300 fmr f14, f0
0301 fmr f15, f0
0302 fmr f16, f0
0303 fmr f17, f0
0304 fmr f18, f0
0305 fmr f19, f0
0306 fmr f20, f0
0307 fmr f21, f0
0308 fmr f22, f0
0309 fmr f23, f0
0310 fmr f24, f0
0311 fmr f25, f0
0312 fmr f26, f0
0313 fmr f27, f0
0314 fmr f28, f0
0315 fmr f29, f0
0316 fmr f30, f0
0317 fmr f31, f0
0318 blr
0319 #endif
0320
0321 #ifdef RTEMS_SMP
0322 #if QORIQ_THREAD_COUNT > 1
0323 _start_thread:
0324
0325 mfspr r0, BOOKE_PIR
0326 srawi r0, r0, 2
0327 ori r0, r0, 1
0328 mtspr BOOKE_PIR, r0
0329
0330 bl .Linitearly
0331
0332
0333 PPC_REG_LOAD r3, PER_CPU_INTERRUPT_STACK_HIGH(CPU_SELF)
0334 subi r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE
0335 CLEAR_RIGHT_IMMEDIATE r1, r1, PPC_STACK_ALIGN_POWER
0336 li r0, 0
0337 PPC_REG_STORE r0, 0(r1)
0338
0339 #ifdef INITIALIZE_FPU
0340 bl .Linitfpu
0341 #endif
0342
0343 mr r3, CPU_SELF
0344 b qoriq_start_thread
0345 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0346 #endif
0347 _start_secondary_processor:
0348 bl .Linitearly
0349
0350
0351 mr START_STACK, r3
0352
0353 bl .Linitmore
0354 li r3, 0
0355 bl .Linitmmu
0356 mr r3, CPU_SELF
0357 b bsp_start_on_secondary_processor
0358 PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0359 #endif
0360
0361 #ifdef __powerpc64__
0362 #define START_NOP_FOR_LINKER_TOC_POINTER_RESTORE nop; nop; nop; nop
0363 #else
0364 #define START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0365 #endif
0366
0367
0368 .section ".bsp_start_text", "ax"
0369 .align 4
0370 bsp_exc_vector_base:
0371
0372 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0373 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0374 li r3, 0
0375 b ppc_exc_fatal_critical
0376 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0377
0378 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0379 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0380 li r3, 1
0381 b ppc_exc_fatal_machine_check
0382 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0383
0384 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0385 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0386 li r3, 2
0387 b ppc_exc_fatal_normal
0388 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0389
0390 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0391 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0392 li r3, 3
0393 b ppc_exc_fatal_normal
0394 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0395
0396 PPC_REG_STORE_UPDATE r1, -PPC_EXC_INTERRUPT_FRAME_SIZE(r1)
0397 PPC_REG_STORE r3, PPC_EXC_GPR3_PROLOGUE_OFFSET(r1)
0398 li r3, 4
0399 b ppc_exc_interrupt
0400 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0401
0402 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0403 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0404 li r3, 5
0405 b ppc_exc_fatal_normal
0406 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0407
0408 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0409 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0410 li r3, 6
0411 b ppc_exc_fatal_normal
0412 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0413 #ifdef __PPC_CPU_E6500__
0414
0415 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0416 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0417 li r3, 7
0418 b ppc_exc_fatal_normal
0419 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0420 #endif
0421
0422 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0423 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0424 li r3, 8
0425 b ppc_exc_fatal_normal
0426 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0427 #ifdef __PPC_CPU_E6500__
0428
0429 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0430 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0431 li r3, 9
0432 b ppc_exc_fatal_normal
0433 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0434 #endif
0435
0436 #ifdef QORIQ_IS_HYPERVISOR_GUEST
0437 PPC_REG_STORE_UPDATE r1, -PPC_EXC_INTERRUPT_FRAME_SIZE(r1)
0438 PPC_REG_STORE r3, PPC_EXC_GPR3_PROLOGUE_OFFSET(r1)
0439 li r3, 10
0440 b ppc_exc_interrupt
0441 #else
0442 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0443 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0444 li r3, 10
0445 b ppc_exc_fatal_normal
0446 #endif
0447 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0448
0449 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0450 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0451 li r3, 11
0452 b ppc_exc_fatal_normal
0453 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0454
0455 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0456 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0457 li r3, 12
0458 b ppc_exc_fatal_critical
0459 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0460
0461 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0462 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0463 li r3, 13
0464 b ppc_exc_fatal_normal
0465 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0466
0467 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0468 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0469 li r3, 14
0470 b ppc_exc_fatal_normal
0471 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0472
0473 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0474 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0475 li r3, 15
0476 b ppc_exc_fatal_debug
0477 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0478
0479 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0480 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0481 li r3, 32
0482 b ppc_exc_fatal_normal
0483 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0484
0485 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0486 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0487 li r3, 33
0488 b ppc_exc_fatal_normal
0489 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0490 #ifndef __PPC_CPU_E6500__
0491
0492 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0493 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0494 li r3, 34
0495 b ppc_exc_fatal_normal
0496 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0497 #endif
0498
0499 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0500 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0501 li r3, 35
0502 b ppc_exc_fatal_normal
0503 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0504 #ifdef __PPC_CPU_E6500__
0505
0506 #if defined(QORIQ_IS_HYPERVISOR_GUEST) && defined(RTEMS_SMP)
0507 PPC_REG_STORE_UPDATE r1, -PPC_EXC_INTERRUPT_FRAME_SIZE(r1)
0508 PPC_REG_STORE r3, PPC_EXC_GPR3_PROLOGUE_OFFSET(r1)
0509 li r3, 36
0510 b ppc_exc_interrupt
0511 #else
0512 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0513 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0514 li r3, 36
0515 b ppc_exc_fatal_normal
0516 #endif
0517 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0518
0519 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0520 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0521 li r3, 37
0522 b ppc_exc_fatal_critical
0523 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0524
0525 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0526 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0527 li r3, 38
0528 b ppc_exc_fatal_normal
0529 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0530
0531 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0532 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0533 li r3, 39
0534 b ppc_exc_fatal_critical
0535 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0536
0537 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0538 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0539 li r3, 40
0540 b ppc_exc_fatal_normal
0541 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0542
0543 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0544 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0545 li r3, 41
0546 b ppc_exc_fatal_normal
0547 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0548
0549 PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
0550 PPC_REG_STORE r3, GPR3_OFFSET(r1)
0551 li r3, 42
0552 b ppc_exc_fatal_normal
0553 START_NOP_FOR_LINKER_TOC_POINTER_RESTORE
0554 #endif
0555
0556
0557 bsp_exc_vector_end: