Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / mips / include / asm / mach-paravirt / kernel-entry-init.h
diff --git a/kernel/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h b/kernel/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h
new file mode 100644 (file)
index 0000000..2f82bfa
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * 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
+       mfc0    t0, CP0_EBASE
+       andi    t0, t0, 0x3ff           # CPUNum
+       beqz    t0, 1f
+       # CPUs other than zero goto smp_bootstrap
+       j       smp_bootstrap
+
+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 */