cpu.h revision 1.93 1 /* $NetBSD: cpu.h,v 1.93 2020/09/04 03:53:12 thorpej Exp $ */
2
3 /*-
4 * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 * NASA Ames Research Center, and by Charles M. Hannum.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 /*
34 * Copyright (c) 1988 University of Utah.
35 * Copyright (c) 1982, 1990, 1993
36 * The Regents of the University of California. All rights reserved.
37 *
38 * This code is derived from software contributed to Berkeley by
39 * the Systems Programming Group of the University of Utah Computer
40 * Science Department.
41 *
42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions
44 * are met:
45 * 1. Redistributions of source code must retain the above copyright
46 * notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright
48 * notice, this list of conditions and the following disclaimer in the
49 * documentation and/or other materials provided with the distribution.
50 * 3. Neither the name of the University nor the names of its contributors
51 * may be used to endorse or promote products derived from this software
52 * without specific prior written permission.
53 *
54 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 * SUCH DAMAGE.
65 *
66 * from: Utah $Hdr: cpu.h 1.16 91/03/25$
67 *
68 * @(#)cpu.h 8.4 (Berkeley) 1/5/94
69 */
70
71 #ifndef _ALPHA_CPU_H_
72 #define _ALPHA_CPU_H_
73
74 #if defined(_KERNEL_OPT)
75 #include "opt_multiprocessor.h"
76 #include "opt_lockdebug.h"
77 #endif
78
79 /*
80 * Exported definitions unique to Alpha cpu support.
81 */
82
83 #include <machine/alpha_cpu.h>
84
85 #if defined(_KERNEL) || defined(_KMEMUSER)
86 #include <sys/cpu_data.h>
87 #include <sys/cctr.h>
88 #include <machine/frame.h>
89
90 /*
91 * Machine check information.
92 */
93 struct mchkinfo {
94 volatile int mc_expected; /* machine check is expected */
95 volatile int mc_received; /* machine check was received */
96 };
97
98 /*
99 * Per-cpu information. Data accessed by MI code is marked [MI].
100 */
101 struct cpu_info {
102 struct lwp *ci_curlwp; /* [MI] current owner of the cpu */
103 struct lwp *ci_onproc; /* [MI] current user LWP / kthread */
104 struct cpu_data ci_data; /* [MI] general per-cpu data */
105 struct cctr_state ci_cc; /* [MI] cycle counter state */
106
107 volatile int ci_mtx_count; /* [MI] neg count of spin mutexes */
108 volatile int ci_mtx_oldspl; /* [MI] for spin mutex splx() */
109
110 u_long ci_intrdepth; /* interrupt trap depth */
111 struct cpu_softc *ci_softc; /* pointer to our device */
112
113 struct pmap *ci_pmap; /* currently-activated pmap */
114 u_int ci_next_asn; /* next ASN to assign */
115 u_long ci_asn_gen; /* current ASN generation */
116
117 struct mchkinfo ci_mcinfo; /* machine check info */
118
119 /*
120 * The following must be in their own cache line, as they are
121 * stored to regularly by remote CPUs.
122 */
123 volatile u_long ci_ipis /* interprocessor interrupts pending */
124 __aligned(64);
125 u_int ci_want_resched; /* [MI] preempt current process */
126
127 /*
128 * These are largely static, and will frequently be fetched
129 * by other CPUs. For that reason, they get their own cache
130 * line, too.
131 */
132 struct cpu_info *ci_next /* next cpu_info structure */
133 __aligned(64);
134 cpuid_t ci_cpuid; /* [MI] our CPU ID */
135 volatile u_long ci_flags; /* flags; see below */
136 uint64_t ci_pcc_freq; /* cpu cycles/second */
137 struct trapframe *ci_db_regs; /* registers for debuggers */
138 };
139
140 /* Ensure cpu_info::ci_curlwp is within the signed 16-bit displacement. */
141 __CTASSERT(offsetof(struct cpu_info, ci_curlwp) <= 0x7ff0);
142
143 #endif /* _KERNEL || _KMEMUSER */
144
145 #if defined(_KERNEL)
146
147 #define CPUF_PRIMARY 0x01 /* CPU is primary CPU */
148 #define CPUF_PRESENT 0x02 /* CPU is present */
149 #define CPUF_RUNNING 0x04 /* CPU is running */
150 #define CPUF_PAUSED 0x08 /* CPU is paused */
151
152 extern struct cpu_info cpu_info_primary;
153 extern struct cpu_info *cpu_info_list;
154
155 #define CPU_INFO_ITERATOR int __unused
156 #define CPU_INFO_FOREACH(cii, ci) ci = cpu_info_list; \
157 ci != NULL; ci = ci->ci_next
158
159 #if defined(MULTIPROCESSOR)
160 extern volatile u_long cpus_running;
161 extern volatile u_long cpus_paused;
162 extern struct cpu_info *cpu_info[];
163
164 #define curlwp ((struct lwp *)alpha_pal_rdval())
165 #define curcpu() curlwp->l_cpu
166 #define CPU_IS_PRIMARY(ci) ((ci)->ci_flags & CPUF_PRIMARY)
167
168 void cpu_boot_secondary_processors(void);
169
170 void cpu_pause_resume(unsigned long, int);
171 void cpu_pause_resume_all(int);
172 #else /* ! MULTIPROCESSOR */
173 #define curcpu() (&cpu_info_primary)
174 #define curlwp curcpu()->ci_curlwp
175 #endif /* MULTIPROCESSOR */
176
177
178 /*
179 * definitions of cpu-dependent requirements
180 * referenced in generic code
181 */
182 #define cpu_number() alpha_pal_whami()
183 #define cpu_proc_fork(p1, p2) /* nothing */
184
185 /*
186 * Arguments to hardclock and gatherstats encapsulate the previous
187 * machine state in an opaque clockframe. On the alpha, we use
188 * what we push on an interrupt (a trapframe).
189 */
190 struct clockframe {
191 struct trapframe cf_tf;
192 };
193 #define CLKF_USERMODE(framep) \
194 (((framep)->cf_tf.tf_regs[FRAME_PS] & ALPHA_PSL_USERMODE) != 0)
195 #define CLKF_PC(framep) ((framep)->cf_tf.tf_regs[FRAME_PC])
196
197 /*
198 * This isn't perfect; if the clock interrupt comes in before the
199 * r/m/w cycle is complete, we won't be counted... but it's not
200 * like this stastic has to be extremely accurate.
201 */
202 #define CLKF_INTR(framep) (curcpu()->ci_intrdepth)
203
204 /*
205 * This is used during profiling to integrate system time. It can safely
206 * assume that the process is resident.
207 */
208 #define LWP_PC(p) ((l)->l_md.md_tf->tf_regs[FRAME_PC])
209
210 void cpu_need_proftick(struct lwp *);
211 void cpu_signotify(struct lwp *);
212
213 #define aston(l) ((l)->l_md.md_astpending = 1)
214 #endif /* _KERNEL */
215
216 /*
217 * CTL_MACHDEP definitions.
218 */
219 #define CPU_CONSDEV 1 /* dev_t: console terminal device */
220 #define CPU_ROOT_DEVICE 2 /* string: root device name */
221 #define CPU_UNALIGNED_PRINT 3 /* int: print unaligned accesses */
222 #define CPU_UNALIGNED_FIX 4 /* int: fix unaligned accesses */
223 #define CPU_UNALIGNED_SIGBUS 5 /* int: SIGBUS unaligned accesses */
224 #define CPU_BOOTED_KERNEL 6 /* string: booted kernel name */
225 #define CPU_FP_SYNC_COMPLETE 7 /* int: always fixup sync fp traps */
226
227 #ifdef _KERNEL
228
229 struct pcb;
230 struct proc;
231 struct reg;
232 struct rpb;
233 struct trapframe;
234
235 int badaddr(void *, size_t);
236 void * cpu_uarea_alloc(bool);
237 bool cpu_uarea_free(void *);
238
239 #define cpu_idle() /* nothing */
240
241 #endif /* _KERNEL */
242 #endif /* _ALPHA_CPU_H_ */
243