1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2013 Cavium, Inc
7  */
8 #ifndef __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H
9 #define __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H
10 
11 #define CP0_EBASE $15, 1
12 
13 	.macro  kernel_entry_setup
14 #ifdef CONFIG_SMP
15 	mfc0	t0, CP0_EBASE
16 	andi	t0, t0, 0x3ff		# CPUNum
17 	beqz	t0, 1f
18 	# CPUs other than zero goto smp_bootstrap
19 	j	smp_bootstrap
20 #endif /* CONFIG_SMP */
21 
22 1:
23 	.endm
24 
25 /*
26  * Do SMP slave processor setup necessary before we can safely execute
27  * C code.
28  */
29 	.macro  smp_slave_setup
30 	mfc0	t0, CP0_EBASE
31 	andi	t0, t0, 0x3ff		# CPUNum
32 	slti	t1, t0, NR_CPUS
33 	bnez	t1, 1f
34 2:
35 	di
36 	wait
37 	b	2b			# Unknown CPU, loop forever.
38 1:
39 	PTR_LA	t1, paravirt_smp_sp
40 	PTR_SLL	t0, PTR_SCALESHIFT
41 	PTR_ADDU t1, t1, t0
42 3:
43 	PTR_L	sp, 0(t1)
44 	beqz	sp, 3b			# Spin until told to proceed.
45 
46 	PTR_LA	t1, paravirt_smp_gp
47 	PTR_ADDU t1, t1, t0
48 	sync
49 	PTR_L	gp, 0(t1)
50 	.endm
51 
52 #endif /* __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H */
53