12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007 |
- #include <linux/threads.h>
- #include <linux/init.h>
- #include <asm/reg.h>
- #include <asm/page.h>
- #include <asm/mmu.h>
- #include <asm/ppc_asm.h>
- #include <asm/head-64.h>
- #include <asm/asm-offsets.h>
- #include <asm/bug.h>
- #include <asm/cputable.h>
- #include <asm/setup.h>
- #include <asm/hvcall.h>
- #include <asm/thread_info.h>
- #include <asm/firmware.h>
- #include <asm/page_64.h>
- #include <asm/irqflags.h>
- #include <asm/kvm_book3s_asm.h>
- #include <asm/ptrace.h>
- #include <asm/hw_irq.h>
- #include <asm/cputhreads.h>
- #include <asm/ppc-opcode.h>
- #include <asm/export.h>
- OPEN_FIXED_SECTION(first_256B, 0x0, 0x100)
- USE_FIXED_SECTION(first_256B)
-
- . = 0x0
- _GLOBAL(__start)
-
- BEGIN_FTR_SECTION
- FIXUP_ENDIAN
- b __start_initialization_multiplatform
- END_FTR_SECTION(0, 1)
-
- trap
-
- .balign 8
- .globl __secondary_hold_spinloop
- __secondary_hold_spinloop:
- .llong 0x0
-
-
- .globl __secondary_hold_acknowledge
- __secondary_hold_acknowledge:
- .llong 0x0
- #ifdef CONFIG_RELOCATABLE
-
-
- . = 0x5c
- .globl __run_at_load
- __run_at_load:
- DEFINE_FIXED_SYMBOL(__run_at_load)
- .long 0x72756e30
- #endif
- . = 0x60
- .globl __secondary_hold
- __secondary_hold:
- FIXUP_ENDIAN
- #ifndef CONFIG_PPC_BOOK3E
- mfmsr r24
- ori r24,r24,MSR_RI
- mtmsrd r24
- #endif
-
- mr r24,r3
-
- mr r25,r4
-
-
-
- std r24,(ABS_ADDR(__secondary_hold_acknowledge))(0)
- sync
- li r26,0
- #ifdef CONFIG_PPC_BOOK3E
- tovirt(r26,r26)
- #endif
-
- 100: ld r12,(ABS_ADDR(__secondary_hold_spinloop))(r26)
- cmpdi 0,r12,0
- beq 100b
- #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
- #ifdef CONFIG_PPC_BOOK3E
- tovirt(r12,r12)
- #endif
- mtctr r12
- mr r3,r24
-
- #ifdef CONFIG_PPC_BOOK3E
- mr r4,r25
- #else
- li r4,0
- #endif
-
- isync
- bctr
- #else
- BUG_OPCODE
- #endif
- CLOSE_FIXED_SECTION(first_256B)
- .section ".toc","aw"
- exception_marker:
- .tc ID_72656773_68657265[TC],0x7265677368657265
- .previous
- #ifdef CONFIG_PPC_BOOK3S
- #include "exceptions-64s.S"
- #else
- OPEN_TEXT_SECTION(0x100)
- #endif
- USE_TEXT_SECTION()
- #ifdef CONFIG_PPC_BOOK3E
- .globl booting_thread_hwid
- booting_thread_hwid:
- .long INVALID_THREAD_HWID
- .align 3
- _GLOBAL(book3e_start_thread)
- LOAD_REG_IMMEDIATE(r5, MSR_KERNEL)
- cmpwi r3, 0
- beq 10f
- cmpwi r3, 1
- beq 11f
-
- b 13f
- 10:
- MTTMR(TMRN_IMSR0, 5)
- MTTMR(TMRN_INIA0, 4)
- b 12f
- 11:
- MTTMR(TMRN_IMSR1, 5)
- MTTMR(TMRN_INIA1, 4)
- 12:
- isync
- li r6, 1
- sld r6, r6, r3
- mtspr SPRN_TENS, r6
- 13:
- blr
- _GLOBAL(book3e_stop_thread)
- cmpwi r3, 0
- beq 10f
- cmpwi r3, 1
- beq 10f
-
- b 13f
- 10:
- li r4, 1
- sld r4, r4, r3
- mtspr SPRN_TENC, r4
- 13:
- blr
- _GLOBAL(fsl_secondary_thread_init)
- mfspr r4,SPRN_BUCSR
-
- lis r3,BUCSR_INIT@h
- ori r3,r3,BUCSR_INIT@l
- mtspr SPRN_BUCSR,r3
- isync
-
- mfspr r3, SPRN_PIR
- cmpwi r4,0
- bne 1f
- rlwimi r3, r3, 30, 2, 30
- mtspr SPRN_PIR, r3
- 1:
- #endif
- _GLOBAL(generic_secondary_thread_init)
- mr r24,r3
-
- bl enable_64b_mode
-
- bl relative_toc
- tovirt(r2,r2)
- #ifdef CONFIG_PPC_BOOK3E
-
- mr r3,r24
- bl book3e_secondary_thread_init
- #endif
- b generic_secondary_common_init
- _GLOBAL(generic_secondary_smp_init)
- FIXUP_ENDIAN
- mr r24,r3
- mr r25,r4
-
- bl enable_64b_mode
-
- bl relative_toc
- tovirt(r2,r2)
- #ifdef CONFIG_PPC_BOOK3E
-
- mr r3,r24
- mr r4,r25
- bl book3e_secondary_core_init
- LOAD_REG_ADDR(r4, booting_thread_hwid)
- lwz r3, 0(r4)
- li r5, INVALID_THREAD_HWID
- cmpw r3, r5
- beq 20f
-
- stw r5, 0(r4)
-
- mfspr r8, SPRN_TIR
- cmpw r3, r8
- beq 20f
-
- LOAD_REG_ADDR(r5, fsl_secondary_thread_init)
- ld r4, 0(r5)
- bl book3e_start_thread
-
- mr r3, r8
- bl book3e_stop_thread
- 10:
- b 10b
- 20:
- #endif
- generic_secondary_common_init:
-
- LOAD_REG_ADDR(r13, paca)
- ld r13,0(r13)
- #ifndef CONFIG_SMP
- addi r13,r13,PACA_SIZE
- b kexec_wait
- #else
- LOAD_REG_ADDR(r7, nr_cpu_ids)
- lwz r7,0(r7)
- li r5,0
- 1: lhz r6,PACAHWCPUID(r13)
- cmpw r6,r24
- beq 2f
- addi r13,r13,PACA_SIZE
- addi r5,r5,1
- cmpw r5,r7
- blt 1b
- mr r3,r24
- b kexec_wait
- 2: SET_PACA(r13)
- #ifdef CONFIG_PPC_BOOK3E
- addi r12,r13,PACA_EXTLB
- mtspr SPRN_SPRG_TLB_EXFRAME,r12
- #endif
-
- mr r24,r5
-
- LOAD_REG_ADDR(r23, cur_cpu_spec)
- ld r23,0(r23)
- ld r12,CPU_SPEC_RESTORE(r23)
- cmpdi 0,r12,0
- beq 3f
- #ifdef PPC64_ELF_ABI_v1
- ld r12,0(r12)
- #endif
- mtctr r12
- bctrl
- 3: LOAD_REG_ADDR(r3, spinning_secondaries)
- lwarx r4,0,r3
- subi r4,r4,1
- stwcx. r4,0,r3
- bne 3b
- isync
- 4: HMT_LOW
- lbz r23,PACAPROCSTART(r13)
-
- cmpwi 0,r23,0
- beq 4b
- sync
- isync
-
- ld r1,PACAEMERGSP(r13)
- subi r1,r1,STACK_FRAME_OVERHEAD
- b __secondary_start
- #endif /* SMP */
- #ifdef CONFIG_PPC_BOOK3S
- __mmu_off:
- mfmsr r3
- andi. r0,r3,MSR_IR|MSR_DR
- beqlr
- mflr r4
- andc r3,r3,r0
- mtspr SPRN_SRR0,r4
- mtspr SPRN_SRR1,r3
- sync
- rfid
- b .
- #endif
- __start_initialization_multiplatform:
-
- bl enable_64b_mode
-
- bl relative_toc
-
- bcl 20,31,$+4
- 0: mflr r26
- addis r26,r26,(_stext - 0b)@ha
- addi r26,r26,(_stext - 0b)@l
-
- cmpldi cr0,r5,0
- beq 1f
- b __boot_from_prom
- 1:
-
- mr r31,r3
- mr r30,r4
- #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
-
- mr r28,r8
- mr r29,r9
- #endif
- #ifdef CONFIG_PPC_BOOK3E
- bl start_initialization_book3e
- b __after_prom_start
- #else
-
- mfspr r0,SPRN_PVR
- srwi r0,r0,16
- cmpwi r0,0x39
- beq 1f
- cmpwi r0,0x3c
- beq 1f
- cmpwi r0,0x44
- beq 1f
- cmpwi r0,0x45
- bne 2f
- 1: bl __cpu_preinit_ppc970
- 2:
-
- bl __mmu_off
- b __after_prom_start
- #endif /* CONFIG_PPC_BOOK3E */
- __boot_from_prom:
- #ifdef CONFIG_PPC_OF_BOOT_TRAMPOLINE
-
- mr r31,r3
- mr r30,r4
- mr r29,r5
- mr r28,r6
- mr r27,r7
-
- rldicr r1,r1,0,59
- #ifdef CONFIG_RELOCATABLE
-
- mr r3,r26
- bl relocate
- #endif
-
- mr r3,r31
- mr r4,r30
- mr r5,r29
- mr r6,r28
- mr r7,r27
-
- mr r8,r26
- bl prom_init
- #endif /* #CONFIG_PPC_OF_BOOT_TRAMPOLINE */
-
- trap
- __after_prom_start:
- #ifdef CONFIG_RELOCATABLE
-
- lis r25,PAGE_OFFSET@highest
- sldi r25,r25,32
- #if defined(CONFIG_PPC_BOOK3E)
- tovirt(r26,r26)
- #endif
- lwz r7,(FIXED_SYMBOL_ABS_ADDR(__run_at_load))(r26)
- #if defined(CONFIG_PPC_BOOK3E)
- tophys(r26,r26)
- #endif
- cmplwi cr0,r7,1
- bne 1f
- add r25,r25,r26
- 1: mr r3,r25
- bl relocate
- #if defined(CONFIG_PPC_BOOK3E)
-
- bl init_core_book3e
- #endif
- #endif
- li r3,0
- #ifdef CONFIG_PPC_BOOK3E
- tovirt(r3,r3)
- #endif
- mr. r4,r26
- #if defined(CONFIG_PPC_BOOK3E)
- tovirt(r4,r4)
- #endif
- beq 9f
- li r6,0x100
-
- #ifdef CONFIG_RELOCATABLE
- #if defined(CONFIG_PPC_BOOK3E)
- tovirt(r26,r26)
- #endif
- lwz r7,(FIXED_SYMBOL_ABS_ADDR(__run_at_load))(r26)
- cmplwi cr0,r7,1
- bne 3f
- #ifdef CONFIG_PPC_BOOK3E
- LOAD_REG_ADDR(r5, __end_interrupts)
- LOAD_REG_ADDR(r11, _stext)
- sub r5,r5,r11
- #else
-
- LOAD_REG_IMMEDIATE(r5, FIXED_SYMBOL_ABS_ADDR(__end_interrupts))
- #endif
- b 5f
- 3:
- #endif
-
- lis r5,(ABS_ADDR(copy_to_here))@ha
- addi r5,r5,(ABS_ADDR(copy_to_here))@l
- bl copy_and_flush
-
-
-
- addis r8,r3,(ABS_ADDR(4f))@ha
- addi r12,r8,(ABS_ADDR(4f))@l
- mtctr r12
- bctr
- .balign 8
- p_end: .llong _end - copy_to_here
- 4:
-
- addis r8,r26,(ABS_ADDR(p_end))@ha
- ld r8,(ABS_ADDR(p_end))@l(r8)
- add r5,r5,r8
- 5: bl copy_and_flush
- 9: b start_here_multiplatform
- _GLOBAL(copy_and_flush)
- addi r5,r5,-8
- addi r6,r6,-8
- 4: li r0,8
-
-
-
-
-
-
-
- mtctr r0
- 3: addi r6,r6,8
- ldx r0,r6,r4
- stdx r0,r6,r3
- bdnz 3b
- dcbst r6,r3
- sync
- icbi r6,r3
- cmpld 0,r6,r5
- blt 4b
- sync
- addi r5,r5,8
- addi r6,r6,8
- isync
- blr
- .align 8
- copy_to_here:
- #ifdef CONFIG_SMP
- #ifdef CONFIG_PPC_PMAC
- .section ".text"
- .align 2
- .globl __secondary_start_pmac_0
- __secondary_start_pmac_0:
-
- li r24,0
- b 1f
- li r24,1
- b 1f
- li r24,2
- b 1f
- li r24,3
- 1:
-
- _GLOBAL(pmac_secondary_start)
-
- bl enable_64b_mode
- li r0,0
- mfspr r3,SPRN_HID4
- rldimi r3,r0,40,23
- sync
- mtspr SPRN_HID4,r3
- isync
- sync
- slbia
-
- bl relative_toc
- tovirt(r2,r2)
-
- bl __restore_cpu_ppc970
-
- mfmsr r3
- ori r3,r3,MSR_RI
- mtmsrd r3
-
- LOAD_REG_ADDR(r4,paca)
- ld r4,0(r4)
- mulli r13,r24,PACA_SIZE
- add r13,r13,r4
- SET_PACA(r13)
-
- li r0,0
- stb r0,PACASOFTIRQEN(r13)
- li r0,PACA_IRQ_HARD_DIS
- stb r0,PACAIRQHAPPENED(r13)
-
- ld r1,PACAEMERGSP(r13)
- subi r1,r1,STACK_FRAME_OVERHEAD
- b __secondary_start
- #endif /* CONFIG_PPC_PMAC */
- .section ".text"
- .align 2
- .globl __secondary_start
- __secondary_start:
-
- HMT_MEDIUM
-
- LOAD_REG_ADDR(r3, current_set)
- sldi r28,r24,3
- ldx r14,r3,r28
- addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
- std r14,PACAKSAVE(r13)
-
- bl early_setup_secondary
-
- mr r1, r14
-
- li r7,0
- mtlr r7
-
- stb r7,PACASOFTIRQEN(r13)
- li r0,PACA_IRQ_HARD_DIS
- stb r0,PACAIRQHAPPENED(r13)
-
- LOAD_REG_ADDR(r3, start_secondary_prolog)
- LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
- mtspr SPRN_SRR0,r3
- mtspr SPRN_SRR1,r4
- RFI
- b .
- start_secondary_prolog:
- ld r2,PACATOC(r13)
- li r3,0
- std r3,0(r1)
- bl start_secondary
- b .
- _GLOBAL(start_secondary_resume)
- ld r1,PACAKSAVE(r13)
- li r3,0
- std r3,0(r1)
- bl start_secondary
- b .
- #endif
- enable_64b_mode:
- mfmsr r11
- #ifdef CONFIG_PPC_BOOK3E
- oris r11,r11,0x8000
- mtmsr r11
- #else /* CONFIG_PPC_BOOK3E */
- li r12,(MSR_64BIT | MSR_ISF)@highest
- sldi r12,r12,48
- or r11,r11,r12
- mtmsrd r11
- isync
- #endif
- blr
- _GLOBAL(relative_toc)
- mflr r0
- bcl 20,31,$+4
- 0: mflr r11
- ld r2,(p_toc - 0b)(r11)
- add r2,r2,r11
- mtlr r0
- blr
- .balign 8
- p_toc: .llong __toc_start + 0x8000 - 0b
- start_here_multiplatform:
-
- bl relative_toc
- tovirt(r2,r2)
-
- LOAD_REG_ADDR(r11,__bss_stop)
- LOAD_REG_ADDR(r8,__bss_start)
- sub r11,r11,r8
- addi r11,r11,7
- srdi. r11,r11,3
- beq 4f
- addi r8,r8,-8
- li r0,0
- mtctr r11
- 3: stdu r0,8(r8)
- bdnz 3b
- 4:
- #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
-
- LOAD_REG_ADDR(r11, opal)
- std r28,0(r11)
- std r29,8(r11)
- #endif
- #ifndef CONFIG_PPC_BOOK3E
- mfmsr r6
- ori r6,r6,MSR_RI
- mtmsrd r6
- #endif
- #ifdef CONFIG_RELOCATABLE
-
- LOAD_REG_ADDR(r4, kernstart_addr)
- clrldi r0,r25,2
- std r0,0(r4)
- #endif
-
-
-
-
-
- LOAD_REG_ADDR(r3,init_thread_union)
-
- addi r1,r3,THREAD_SIZE
- li r0,0
- stdu r0,-STACK_FRAME_OVERHEAD(r1)
-
-
- mr r3,r31
- bl early_setup
- LOAD_REG_ADDR(r3, start_here_common)
- ld r4,PACAKMSR(r13)
- mtspr SPRN_SRR0,r3
- mtspr SPRN_SRR1,r4
- RFI
- b .
-
- start_here_common:
-
- std r1,PACAKSAVE(r13)
-
- ld r2,PACATOC(r13)
-
- li r0,0
- stb r0,PACASOFTIRQEN(r13)
- li r0,PACA_IRQ_HARD_DIS
- stb r0,PACAIRQHAPPENED(r13)
-
- bl start_kernel
-
- BUG_OPCODE
- .section ".bss"
- .align 16
- .globl swapper_pg_dir
- swapper_pg_dir:
- .space PGD_TABLE_SIZE
- .globl empty_zero_page
- empty_zero_page:
- .space PAGE_SIZE
- EXPORT_SYMBOL(empty_zero_page)
|