cpu.h revision 1.95 1 /* $NetBSD: cpu.h,v 1.95 2020/09/05 18:01:42 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 cpu_data ci_data; /* [MI] general per-cpu data */
103 struct lwp *ci_curlwp; /* [MI] current owner of the cpu */
104 struct lwp *ci_onproc; /* [MI] current user LWP / kthread */
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 volatile u_long ci_ssir; /* simulated software interrupt reg */
112 struct cpu_softc *ci_softc; /* pointer to our device */
113
114 struct pmap *ci_pmap; /* currently-activated pmap */
115 u_int ci_next_asn; /* next ASN to assign */
116 u_long ci_asn_gen; /* current ASN generation */
117
118 struct mchkinfo ci_mcinfo; /* machine check info */
119
120 /*
121 * The following must be in their own cache line, as they are
122 * stored to regularly by remote CPUs.
123 */
124 volatile u_long ci_ipis /* interprocessor interrupts pending */
125 __aligned(64);
126 u_int ci_want_resched; /* [MI] preempt current process */
127
128 /*
129 * These are largely static, and will frequently be fetched
130 * by other CPUs. For that reason, they get their own cache
131 * line, too.
132 */
133 struct cpu_info *ci_next /* next cpu_info structure */
134 __aligned(64);
135 cpuid_t ci_cpuid; /* [MI] our CPU ID */
136 volatile u_long ci_flags; /* flags; see below */
137 uint64_t ci_pcc_freq; /* cpu cycles/second */
138 struct trapframe *ci_db_regs; /* registers for debuggers */
139 };
140
141 /* Ensure some cpu_info fields are within the signed 16-bit displacement. */
142 __CTASSERT(offsetof(struct cpu_info, ci_curlwp) <= 0x7ff0);
143 __CTASSERT(offsetof(struct cpu_info, ci_ssir) <= 0x7ff0);
144
145 #endif /* _KERNEL || _KMEMUSER */
146
147 #if defined(_KERNEL)
148
149 #define CPUF_PRIMARY 0x01 /* CPU is primary CPU */
150 #define CPUF_PRESENT 0x02 /* CPU is present */
151 #define CPUF_RUNNING 0x04 /* CPU is running */
152 #define CPUF_PAUSED 0x08 /* CPU is paused */
153
154 extern struct cpu_info cpu_info_primary;
155 extern struct cpu_info *cpu_info_list;
156
157 #define CPU_INFO_ITERATOR int __unused
158 #define CPU_INFO_FOREACH(cii, ci) ci = cpu_info_list; \
159 ci != NULL; ci = ci->ci_next
160
161 #if defined(MULTIPROCESSOR)
162 extern volatile u_long cpus_running;
163 extern volatile u_long cpus_paused;
164 extern struct cpu_info *cpu_info[];
165
166 #define curlwp ((struct lwp *)alpha_pal_rdval())
167 #define curcpu() curlwp->l_cpu
168 #define CPU_IS_PRIMARY(ci) ((ci)->ci_flags & CPUF_PRIMARY)
169
170 void cpu_boot_secondary_processors(void);
171
172 void cpu_pause_resume(unsigned long, int);
173 void cpu_pause_resume_all(int);
174 #else /* ! MULTIPROCESSOR */
175 #define curcpu() (&cpu_info_primary)
176 #define curlwp curcpu()->ci_curlwp
177 #endif /* MULTIPROCESSOR */
178
179
180 /*
181 * definitions of cpu-dependent requirements
182 * referenced in generic code
183 */
184 #define cpu_number() alpha_pal_whami()
185 #define cpu_proc_fork(p1, p2) /* nothing */
186
187 /*
188 * Arguments to hardclock and gatherstats encapsulate the previous
189 * machine state in an opaque clockframe. On the alpha, we use
190 * what we push on an interrupt (a trapframe).
191 */
192 struct clockframe {
193 struct trapframe cf_tf;
194 };
195 #define CLKF_USERMODE(framep) \
196 (((framep)->cf_tf.tf_regs[FRAME_PS] & ALPHA_PSL_USERMODE) != 0)
197 #define CLKF_PC(framep) ((framep)->cf_tf.tf_regs[FRAME_PC])
198
199 /*
200 * This isn't perfect; if the clock interrupt comes in before the
201 * r/m/w cycle is complete, we won't be counted... but it's not
202 * like this stastic has to be extremely accurate.
203 */
204 #define CLKF_INTR(framep) (curcpu()->ci_intrdepth)
205
206 /*
207 * This is used during profiling to integrate system time. It can safely
208 * assume that the process is resident.
209 */
210 #define LWP_PC(p) ((l)->l_md.md_tf->tf_regs[FRAME_PC])
211
212 void cpu_need_proftick(struct lwp *);
213 void cpu_signotify(struct lwp *);
214
215 #define aston(l) ((l)->l_md.md_astpending = 1)
216 #endif /* _KERNEL */
217
218 /*
219 * CTL_MACHDEP definitions.
220 */
221 #define CPU_CONSDEV 1 /* dev_t: console terminal device */
222 #define CPU_ROOT_DEVICE 2 /* string: root device name */
223 #define CPU_UNALIGNED_PRINT 3 /* int: print unaligned accesses */
224 #define CPU_UNALIGNED_FIX 4 /* int: fix unaligned accesses */
225 #define CPU_UNALIGNED_SIGBUS 5 /* int: SIGBUS unaligned accesses */
226 #define CPU_BOOTED_KERNEL 6 /* string: booted kernel name */
227 #define CPU_FP_SYNC_COMPLETE 7 /* int: always fixup sync fp traps */
228
229 #ifdef _KERNEL
230
231 struct pcb;
232 struct proc;
233 struct reg;
234 struct rpb;
235 struct trapframe;
236
237 int badaddr(void *, size_t);
238 void * cpu_uarea_alloc(bool);
239 bool cpu_uarea_free(void *);
240
241 #define cpu_idle() /* nothing */
242
243 #endif /* _KERNEL */
244 #endif /* _ALPHA_CPU_H_ */
245