/* * 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 [31mCONFIG_SMP[0m 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 */ |