/*1* Copyright (c) 20092* The President and Fellows of Harvard College.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the University nor the names of its contributors13* may be used to endorse or promote products derived from this software14* without specific prior written permission.15*16* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829#ifndef _MIPS_CURRENT_H_30#define _MIPS_CURRENT_H_313233/*34* Macro for current thread, or alternatively current cpu.35*36* This file should only be included via <current.h> (q.v.)37*38* These are machine-dependent because on some platforms it is39* better/easier to keep track of curcpu and make curthread be40* curcpu->c_curthread, and on others to keep track of curthread and41* make curcpu be curthread->t_cpu.42*43* Either way we don't want retrieving curthread or curcpu to be44* expensive; digging around in system board registers and whatnot is45* not a very good idea. So we want to keep either curthread or curcpu46* on-chip somewhere in some fashion.47*48* There are various possible approaches; for example, one might use49* the MMU on each CPU to map that CPU's cpu structure to a fixed50* virtual address that's the same on all CPUs. Then curcpu can be a51* constant. (But one has to remember to use curcpu->c_self as the52* canonical form of the pointer anywhere that's visible to other53* CPUs.) Another approach is to reserve a register to hold curthread.54*55* On mips there's an architectural issue that informs this choice:56* there's no easy way to find the current cpu, the current thread, or57* even the kernel stack of the current thread when entering the58* kernel at trap time. (On most CPUs there's a canonical way to find59* at least the stack.)60*61* Therefore we do the following:62*63* - We misuse a kernel-settable field of a nonessential MMU register64* to hold the CPU number.65*66* - On trap entry we use this number to index an array that gets us67* both the kernel stack and curthread.68*69* - We tell the compiler not to use the s7 register and keep70* curthread there.71*72* Note that if you want to change this scheme to use a different73* register, or change to a different scheme, you need to touch three74* places: here, the mips-specific kernel CFLAGS in the makefiles, and75* the trap entry and return code.76*/7778register struct thread *curthread asm("$23"); /* s7 register */79#undef __NEED_CURTHREAD80#define __NEED_CURCPU8182/* For how we've defined it, curthread gets set first, then curcpu. */83#define INIT_CURCPU(cpu, thread) (curthread = (thread), curcpu = (cpu))8485#endif /* _MIPS_CURRENT_H_ */868788