| /* | |
| * This file is subject to the terms and conditions of the GNU General Public | |
| * License. See the file "COPYING" in the main directory of this archive | |
| * for more details. | |
| * | |
| * Copyright (C) 2013 Cavium, Inc | |
| */ | |
| #ifndef __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H | |
| #define __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H | |
| #define CP0_EBASE $15, 1 | |
| .macro kernel_entry_setup | |
| #ifdef CONFIG_SMP | |
| mfc0 t0, CP0_EBASE | |
| andi t0, t0, 0x3ff # CPUNum | |
| beqz t0, 1f | |
| # CPUs other than zero goto smp_bootstrap | |
| j smp_bootstrap | |
| #endif /* CONFIG_SMP */ | |
| 1: | |
| .endm | |
| /* | |
| * Do SMP slave processor setup necessary before we can safely execute | |
| * C code. | |
| */ | |
| .macro smp_slave_setup | |
| mfc0 t0, CP0_EBASE | |
| andi t0, t0, 0x3ff # CPUNum | |
| slti t1, t0, NR_CPUS | |
| bnez t1, 1f | |
| 2: | |
| di | |
| wait | |
| b 2b # Unknown CPU, loop forever. | |
| 1: | |
| PTR_LA t1, paravirt_smp_sp | |
| PTR_SLL t0, PTR_SCALESHIFT | |
| PTR_ADDU t1, t1, t0 | |
| 3: | |
| PTR_L sp, 0(t1) | |
| beqz sp, 3b # Spin until told to proceed. | |
| PTR_LA t1, paravirt_smp_gp | |
| PTR_ADDU t1, t1, t0 | |
| sync | |
| PTR_L gp, 0(t1) | |
| .endm | |
| #endif /* __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H */ |