// K461: an isolated PSCI CPU_ON landing pad. Only the two-vCPU probe image // links this entry. The secondary cannot run Rust or touch the primary stack. .section .text.smp_boot,"ax" .align 2 .global __secondary_entry __secondary_entry: msr daifset, #0xf adrp x1, __secondary_stack_top add x1, x1, :lo12:__secondary_stack_top mov sp, x1 adrp x2, __secondary_context add x2, x2, :lo12:__secondary_context str x0, [x2] mrs x0, mpidr_el1 adrp x2, __secondary_mpidr add x2, x2, :lo12:__secondary_mpidr str x0, [x2] adrp x2, __secondary_sp add x2, x2, :lo12:__secondary_sp mov x3, sp str x3, [x2] dsb sy adrp x2, __secondary_ready add x2, x2, :lo12:__secondary_ready mov x3, #1 str x3, [x2] dsb sy sev .Lsecondary_wait: wfe .if {vector_probe} adrp x2, __secondary_vector_command add x2, x2, :lo12:__secondary_vector_command ldr x3, [x2] cmp x3, #1 b.eq .Lsecondary_vector_probe .endif b .Lsecondary_wait .if {vector_probe} .Lsecondary_vector_probe: msr spsel, #1 adrp x2, __smp_vectors_start add x2, x2, :lo12:__smp_vectors_start msr vbar_el1, x2 isb .global __secondary_brk_pc __secondary_brk_pc: brk #0x464 .if {timer_probe} b .Lsecondary_timer_wait .endif .Lsecondary_fault_park: wfe b .Lsecondary_fault_park __secondary_vector_brk: mrs x0, esr_el1 mrs x1, elr_el1 mrs x2, mpidr_el1 mov x3, sp mrs x4, vbar_el1 adrp x5, __secondary_fault_esr add x5, x5, :lo12:__secondary_fault_esr stp x0, x1, [x5] stp x2, x3, [x5, #16] str x4, [x5, #32] dsb sy mov x0, #1 str x0, [x5, #40] dsb sy sev .if {timer_probe} add x1, x1, #4 msr elr_el1, x1 eret .else b .Lsecondary_fault_park .endif .if {timer_probe} .Lsecondary_timer_wait: wfe adrp x8, __secondary_vector_command add x8, x8, :lo12:__secondary_vector_command ldr x9, [x8] cmp x9, #2 b.ne .Lsecondary_timer_wait mrs x0, cntfrq_el0 mov x10, #100 udiv x9, x0, x10 mrs x1, cntpct_el0 add x2, x1, x9 msr cntp_cval_el0, x2 mov x10, #1 msr cntp_ctl_el0, x10 isb .Lsecondary_timer_tick0: mrs x10, cntp_ctl_el0 tbz x10, #2, .Lsecondary_timer_tick0 mrs x3, cntpct_el0 add x4, x3, x9 msr cntp_cval_el0, x4 isb .Lsecondary_timer_tick1: mrs x10, cntp_ctl_el0 tbz x10, #2, .Lsecondary_timer_tick1 mrs x5, cntpct_el0 msr cntp_ctl_el0, xzr isb mrs x6, mpidr_el1 adrp x8, __secondary_timer_freq add x8, x8, :lo12:__secondary_timer_freq stp x0, x1, [x8] stp x2, x3, [x8, #16] stp x4, x5, [x8, #32] str x6, [x8, #48] dsb sy mov x7, #1 str x7, [x8, #56] dsb sy sev b .Lsecondary_fault_park .endif __secondary_vector_unexpected: adrp x5, __secondary_fault_seen add x5, x5, :lo12:__secondary_fault_seen mov x0, #2 str x0, [x5] dsb sy sev b .Lsecondary_fault_park .section .text.smp_vectors,"ax" .balign 2048 .global __smp_vectors_start __smp_vectors_start: .rept 4 b __secondary_vector_unexpected .space 124 .endr // Current EL with SP_EL1: synchronous exception slot 4. b __secondary_vector_brk .space 124 .rept 11 b __secondary_vector_unexpected .space 124 .endr .global __smp_vectors_end __smp_vectors_end: .endif .section .bss.smp_boot,"aw",%nobits .align 3 .global __secondary_ready __secondary_ready: .skip 8 .global __secondary_mpidr __secondary_mpidr: .skip 8 .global __secondary_context __secondary_context: .skip 8 .global __secondary_sp __secondary_sp: .skip 8 .align 12 .global __secondary_stack_start __secondary_stack_start: .skip 4096 .global __secondary_stack_top __secondary_stack_top: .if {vector_probe} .align 3 .global __secondary_vector_command __secondary_vector_command: .skip 8 .global __secondary_fault_esr __secondary_fault_esr: .skip 8 .global __secondary_fault_elr __secondary_fault_elr: .skip 8 .global __secondary_fault_mpidr __secondary_fault_mpidr: .skip 8 .global __secondary_fault_sp __secondary_fault_sp: .skip 8 .global __secondary_fault_vbar __secondary_fault_vbar: .skip 8 .global __secondary_fault_seen __secondary_fault_seen: .skip 8 .if {timer_probe} .global __secondary_timer_freq __secondary_timer_freq: .skip 8 .global __secondary_timer_start __secondary_timer_start: .skip 8 .global __secondary_timer_deadline0 __secondary_timer_deadline0: .skip 8 .global __secondary_timer_tick0 __secondary_timer_tick0: .skip 8 .global __secondary_timer_deadline1 __secondary_timer_deadline1: .skip 8 .global __secondary_timer_tick1 __secondary_timer_tick1: .skip 8 .global __secondary_timer_mpidr __secondary_timer_mpidr: .skip 8 .global __secondary_timer_seen __secondary_timer_seen: .skip 8 .endif .endif