Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
script3r
GitHub Repository: script3r/os161
Path: blob/master/kern/arch/mips/include/current.h
2093 views
1
/*
2
* Copyright (c) 2009
3
* The President and Fellows of Harvard College.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* 3. Neither the name of the University nor the names of its contributors
14
* may be used to endorse or promote products derived from this software
15
* without specific prior written permission.
16
*
17
* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*/
29
30
#ifndef _MIPS_CURRENT_H_
31
#define _MIPS_CURRENT_H_
32
33
34
/*
35
* Macro for current thread, or alternatively current cpu.
36
*
37
* This file should only be included via <current.h> (q.v.)
38
*
39
* These are machine-dependent because on some platforms it is
40
* better/easier to keep track of curcpu and make curthread be
41
* curcpu->c_curthread, and on others to keep track of curthread and
42
* make curcpu be curthread->t_cpu.
43
*
44
* Either way we don't want retrieving curthread or curcpu to be
45
* expensive; digging around in system board registers and whatnot is
46
* not a very good idea. So we want to keep either curthread or curcpu
47
* on-chip somewhere in some fashion.
48
*
49
* There are various possible approaches; for example, one might use
50
* the MMU on each CPU to map that CPU's cpu structure to a fixed
51
* virtual address that's the same on all CPUs. Then curcpu can be a
52
* constant. (But one has to remember to use curcpu->c_self as the
53
* canonical form of the pointer anywhere that's visible to other
54
* CPUs.) Another approach is to reserve a register to hold curthread.
55
*
56
* On mips there's an architectural issue that informs this choice:
57
* there's no easy way to find the current cpu, the current thread, or
58
* even the kernel stack of the current thread when entering the
59
* kernel at trap time. (On most CPUs there's a canonical way to find
60
* at least the stack.)
61
*
62
* Therefore we do the following:
63
*
64
* - We misuse a kernel-settable field of a nonessential MMU register
65
* to hold the CPU number.
66
*
67
* - On trap entry we use this number to index an array that gets us
68
* both the kernel stack and curthread.
69
*
70
* - We tell the compiler not to use the s7 register and keep
71
* curthread there.
72
*
73
* Note that if you want to change this scheme to use a different
74
* register, or change to a different scheme, you need to touch three
75
* places: here, the mips-specific kernel CFLAGS in the makefiles, and
76
* the trap entry and return code.
77
*/
78
79
register struct thread *curthread asm("$23"); /* s7 register */
80
#undef __NEED_CURTHREAD
81
#define __NEED_CURCPU
82
83
/* For how we've defined it, curthread gets set first, then curcpu. */
84
#define INIT_CURCPU(cpu, thread) (curthread = (thread), curcpu = (cpu))
85
86
#endif /* _MIPS_CURRENT_H_ */
87
88