linux/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h
<<
>>
Prefs
   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
  221:
  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
  342:
  35        di
  36        wait
  37        b       2b                      # Unknown CPU, loop forever.
  381:
  39        PTR_LA  t1, paravirt_smp_sp
  40        PTR_SLL t0, PTR_SCALESHIFT
  41        PTR_ADDU t1, t1, t0
  423:
  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