|
@@ -50,28 +50,37 @@
|
|
.endm
|
|
.endm
|
|
|
|
|
|
.section .init.text, "ax",@progbits
|
|
.section .init.text, "ax",@progbits
|
|
- .type stext, @function
|
|
|
|
- .globl stext
|
|
|
|
-stext:
|
|
|
|
- ;-------------------------------------------------------------------
|
|
|
|
- ; Don't clobber r0-r2 yet. It might have bootloader provided info
|
|
|
|
- ;-------------------------------------------------------------------
|
|
|
|
|
|
+
|
|
|
|
+;----------------------------------------------------------------
|
|
|
|
+; Default Reset Handler (jumped into from Reset vector)
|
|
|
|
+; - Don't clobber r0,r1,r2 as they might have u-boot provided args
|
|
|
|
+; - Platforms can override this weak version if needed
|
|
|
|
+;----------------------------------------------------------------
|
|
|
|
+WEAK(res_service)
|
|
|
|
+ j stext
|
|
|
|
+END(res_service)
|
|
|
|
+
|
|
|
|
+;----------------------------------------------------------------
|
|
|
|
+; Kernel Entry point
|
|
|
|
+;----------------------------------------------------------------
|
|
|
|
+ENTRY(stext)
|
|
|
|
|
|
CPU_EARLY_SETUP
|
|
CPU_EARLY_SETUP
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
- ; Ensure Boot (Master) proceeds. Others wait in platform dependent way
|
|
|
|
- ; IDENTITY Reg [ 3 2 1 0 ]
|
|
|
|
- ; (cpu-id) ^^^ => Zero for UP ARC700
|
|
|
|
- ; => #Core-ID if SMP (Master 0)
|
|
|
|
- ; Note that non-boot CPUs might not land here if halt-on-reset and
|
|
|
|
- ; instead breath life from @first_lines_of_secondary, but we still
|
|
|
|
- ; need to make sure only boot cpu takes this path.
|
|
|
|
GET_CPU_ID r5
|
|
GET_CPU_ID r5
|
|
cmp r5, 0
|
|
cmp r5, 0
|
|
- mov.ne r0, r5
|
|
|
|
- jne arc_platform_smp_wait_to_boot
|
|
|
|
|
|
+ mov.nz r0, r5
|
|
|
|
+#ifdef CONFIG_ARC_SMP_HALT_ON_RESET
|
|
|
|
+ ; Non-Master can proceed as system would be booted sufficiently
|
|
|
|
+ jnz first_lines_of_secondary
|
|
|
|
+#else
|
|
|
|
+ ; Non-Masters wait for Master to boot enough and bring them up
|
|
|
|
+ jnz arc_platform_smp_wait_to_boot
|
|
|
|
+#endif
|
|
|
|
+ ; Master falls thru
|
|
#endif
|
|
#endif
|
|
|
|
+
|
|
; Clear BSS before updating any globals
|
|
; Clear BSS before updating any globals
|
|
; XXX: use ZOL here
|
|
; XXX: use ZOL here
|
|
mov r5, __bss_start
|
|
mov r5, __bss_start
|
|
@@ -102,16 +111,14 @@ stext:
|
|
GET_TSK_STACK_BASE r9, sp ; r9 = tsk, sp = stack base(output)
|
|
GET_TSK_STACK_BASE r9, sp ; r9 = tsk, sp = stack base(output)
|
|
|
|
|
|
j start_kernel ; "C" entry point
|
|
j start_kernel ; "C" entry point
|
|
|
|
+END(stext)
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
;----------------------------------------------------------------
|
|
;----------------------------------------------------------------
|
|
; First lines of code run by secondary before jumping to 'C'
|
|
; First lines of code run by secondary before jumping to 'C'
|
|
;----------------------------------------------------------------
|
|
;----------------------------------------------------------------
|
|
.section .text, "ax",@progbits
|
|
.section .text, "ax",@progbits
|
|
- .type first_lines_of_secondary, @function
|
|
|
|
- .globl first_lines_of_secondary
|
|
|
|
-
|
|
|
|
-first_lines_of_secondary:
|
|
|
|
|
|
+ENTRY(first_lines_of_secondary)
|
|
|
|
|
|
CPU_EARLY_SETUP
|
|
CPU_EARLY_SETUP
|
|
|
|
|
|
@@ -126,5 +133,5 @@ first_lines_of_secondary:
|
|
GET_TSK_STACK_BASE r0, sp
|
|
GET_TSK_STACK_BASE r0, sp
|
|
|
|
|
|
j start_kernel_secondary
|
|
j start_kernel_secondary
|
|
-
|
|
|
|
|
|
+END(first_lines_of_secondary)
|
|
#endif
|
|
#endif
|