Annotation of sys/arch/alpha/include/cpu.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: cpu.h,v 1.30 2007/05/06 19:05:11 martin Exp $ */
2: /* $NetBSD: cpu.h,v 1.45 2000/08/21 02:03:12 thorpej Exp $ */
3:
4: /*-
5: * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10: * NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41: /*
42: * Copyright (c) 1988 University of Utah.
43: * Copyright (c) 1982, 1990, 1993
44: * The Regents of the University of California. All rights reserved.
45: *
46: * This code is derived from software contributed to Berkeley by
47: * the Systems Programming Group of the University of Utah Computer
48: * Science Department.
49: *
50: * Redistribution and use in source and binary forms, with or without
51: * modification, are permitted provided that the following conditions
52: * are met:
53: * 1. Redistributions of source code must retain the above copyright
54: * notice, this list of conditions and the following disclaimer.
55: * 2. Redistributions in binary form must reproduce the above copyright
56: * notice, this list of conditions and the following disclaimer in the
57: * documentation and/or other materials provided with the distribution.
58: * 3. Neither the name of the University nor the names of its contributors
59: * may be used to endorse or promote products derived from this software
60: * without specific prior written permission.
61: *
62: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
63: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
64: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
65: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
66: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
67: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
68: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
69: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
70: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
71: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
72: * SUCH DAMAGE.
73: *
74: * from: Utah $Hdr: cpu.h 1.16 91/03/25$
75: *
76: * @(#)cpu.h 8.4 (Berkeley) 1/5/94
77: */
78:
79: #ifndef _ALPHA_CPU_H_
80: #define _ALPHA_CPU_H_
81:
82: #ifndef NO_IEEE
83: typedef union alpha_s_float {
84: u_int32_t i;
85: u_int32_t frac: 23,
86: exp: 8,
87: sign: 1;
88: } s_float;
89:
90: typedef union alpha_t_float {
91: u_int64_t i;
92: u_int64_t frac: 52,
93: exp: 11,
94: sign: 1;
95: } t_float;
96: #endif
97:
98: /*
99: * Exported definitions unique to Alpha cpu support.
100: */
101:
102: #include <machine/alpha_cpu.h>
103: #include <machine/frame.h>
104: #include <machine/param.h>
105:
106: #ifdef _KERNEL
107:
108: #include <machine/bus.h>
109: #include <machine/intr.h>
110: #include <sys/device.h>
111: #include <sys/sched.h>
112:
113: struct pcb;
114: struct proc;
115: struct reg;
116: struct rpb;
117: struct trapframe;
118:
119: extern u_long cpu_implver; /* from IMPLVER instruction */
120: extern u_long cpu_amask; /* from AMASK instruction */
121: extern int bootdev_debug;
122: extern int alpha_fp_sync_complete;
123: extern int alpha_unaligned_print, alpha_unaligned_fix, alpha_unaligned_sigbus;
124:
125: void XentArith(u_int64_t, u_int64_t, u_int64_t); /* MAGIC */
126: void XentIF(u_int64_t, u_int64_t, u_int64_t); /* MAGIC */
127: void XentInt(u_int64_t, u_int64_t, u_int64_t); /* MAGIC */
128: void XentMM(u_int64_t, u_int64_t, u_int64_t); /* MAGIC */
129: void XentRestart(void); /* MAGIC */
130: void XentSys(u_int64_t, u_int64_t, u_int64_t); /* MAGIC */
131: void XentUna(u_int64_t, u_int64_t, u_int64_t); /* MAGIC */
132: void alpha_init(u_long, u_long, u_long, u_long, u_long);
133: int alpha_pa_access(u_long);
134: void ast(struct trapframe *);
135: int badaddr(void *, size_t);
136: int badaddr_read(void *, size_t, void *);
137: u_int64_t console_restart(struct trapframe *);
138: void do_sir(void);
139: void dumpconf(void);
140: void exception_return(void); /* MAGIC */
141: void frametoreg(struct trapframe *, struct reg *);
142: long fswintrberr(void); /* MAGIC */
143: void init_bootstrap_console(void);
144: void init_prom_interface(struct rpb *);
145: void interrupt(unsigned long, unsigned long, unsigned long,
146: struct trapframe *);
147: void machine_check(unsigned long, struct trapframe *, unsigned long,
148: unsigned long);
149: u_int64_t hwrpb_checksum(void);
150: void hwrpb_restart_setup(void);
151: void regdump(struct trapframe *);
152: void regtoframe(struct reg *, struct trapframe *);
153: void savectx(struct pcb *);
154: void switch_exit(struct proc *); /* MAGIC */
155: void switch_trampoline(void); /* MAGIC */
156: void syscall(u_int64_t, struct trapframe *);
157: void trap(unsigned long, unsigned long, unsigned long, unsigned long,
158: struct trapframe *);
159: void trap_init(void);
160: void enable_nsio_ide(bus_space_tag_t);
161:
162: /* Multiprocessor glue; cpu.c */
163: struct cpu_info;
164: int cpu_iccb_send(cpuid_t, const char *);
165: void cpu_iccb_receive(void);
166: void cpu_hatch(struct cpu_info *);
167: void cpu_halt_secondary(unsigned long);
168: void cpu_spinup_trampoline(void); /* MAGIC */
169: void cpu_pause(unsigned long);
170: void cpu_resume(unsigned long);
171:
172: /*
173: * Machine check information.
174: */
175: struct mchkinfo {
176: __volatile int mc_expected; /* machine check is expected */
177: __volatile int mc_received; /* machine check was received */
178: };
179:
180: struct cpu_info {
181: struct device *ci_dev; /* pointer to our device */
182: /*
183: * Public members.
184: */
185: struct schedstate_percpu ci_schedstate; /* scheduler state */
186: #if defined(DIAGNOSTIC) || defined(LOCKDEBUG)
187: u_long ci_spin_locks; /* # of spin locks held */
188: u_long ci_simple_locks; /* # of simple locks held */
189: #endif
190: struct proc *ci_curproc; /* current owner of the processor */
191: struct simplelock ci_slock; /* lock on this data structure */
192: cpuid_t ci_cpuid; /* our CPU ID */
193: struct cpu_info *ci_next;
194:
195: /*
196: * Private members.
197: */
198: struct mchkinfo ci_mcinfo; /* machine check info */
199: struct proc *ci_fpcurproc; /* current owner of the FPU */
200: paddr_t ci_curpcb; /* PA of current HW PCB */
201: struct pcb *ci_idle_pcb; /* our idle PCB */
202: paddr_t ci_idle_pcb_paddr; /* PA of idle PCB */
203: struct cpu_softc *ci_softc; /* pointer to our device */
204: u_long ci_want_resched; /* preempt current process */
205: u_long ci_astpending; /* AST is pending */
206: u_long ci_intrdepth; /* interrupt trap depth */
207: struct trapframe *ci_db_regs; /* registers for debuggers */
208: #if defined(MULTIPROCESSOR)
209: u_long ci_flags; /* flags; see below */
210: u_long ci_ipis; /* interprocessor interrupts pending */
211: #endif
212: };
213:
214: #define CPUF_PRIMARY 0x01 /* CPU is primary CPU */
215: #define CPUF_PRESENT 0x02 /* CPU is present */
216: #define CPUF_RUNNING 0x04 /* CPU is running */
217: #define CPUF_PAUSED 0x08 /* CPU is paused */
218: #define CPUF_FPUSAVE 0x10 /* CPU is currently in fpusave_cpu() */
219:
220: void fpusave_cpu(struct cpu_info *, int);
221: void fpusave_proc(struct proc *, int);
222:
223: #define CPU_INFO_UNIT(ci) ((ci)->ci_dev->dv_unit)
224: #define CPU_INFO_ITERATOR int
225: #define CPU_INFO_FOREACH(cii, ci) for (cii = 0, ci = curcpu(); \
226: ci != NULL; ci = ci->ci_next)
227:
228: #if defined(MULTIPROCESSOR)
229: extern __volatile u_long cpus_running;
230: extern __volatile u_long cpus_paused;
231: extern struct cpu_info cpu_info[];
232:
233: #define curcpu() ((struct cpu_info *)alpha_pal_rdval())
234: #define CPU_IS_PRIMARY(ci) ((ci)->ci_flags & CPUF_PRIMARY)
235:
236: void cpu_boot_secondary_processors(void);
237:
238: void cpu_pause_resume(unsigned long, int);
239: void cpu_pause_resume_all(int);
240: #else /* ! MULTIPROCESSOR */
241: extern struct cpu_info cpu_info_store;
242:
243: #define curcpu() (&cpu_info_store)
244: #define CPU_IS_PRIMARY(ci) 1
245: #endif /* MULTIPROCESSOR */
246:
247: #define curproc curcpu()->ci_curproc
248: #define fpcurproc curcpu()->ci_fpcurproc
249: #define curpcb curcpu()->ci_curpcb
250:
251: /*
252: * definitions of cpu-dependent requirements
253: * referenced in generic code
254: */
255: #define cpu_wait(p) /* nothing */
256: #define cpu_number() alpha_pal_whami()
257:
258: /*
259: * Arguments to hardclock and gatherstats encapsulate the previous
260: * machine state in an opaque clockframe. One the Alpha, we use
261: * what we push on an interrupt (a trapframe).
262: */
263: struct clockframe {
264: struct trapframe cf_tf;
265: };
266: #define CLKF_USERMODE(framep) \
267: (((framep)->cf_tf.tf_regs[FRAME_PS] & ALPHA_PSL_USERMODE) != 0)
268: #define CLKF_PC(framep) ((framep)->cf_tf.tf_regs[FRAME_PC])
269:
270: /*
271: * This isn't perfect; if the clock interrupt comes in before the
272: * r/m/w cycle is complete, we won't be counted... but it's not
273: * like this stastic has to be extremely accurate.
274: */
275: #define CLKF_INTR(framep) (curcpu()->ci_intrdepth)
276:
277: /*
278: * This is used during profiling to integrate system time.
279: */
280: #define PROC_PC(p) ((p)->p_md.md_tf->tf_regs[FRAME_PC])
281:
282: /*
283: * Preempt the current process if in interrupt from user mode,
284: * or after the current trap/syscall if in system mode.
285: */
286: #ifdef MULTIPROCESSOR
287: #define need_resched(ci) \
288: do { \
289: ci->ci_want_resched = 1; \
290: aston(curcpu()); \
291: } while (/*CONSTCOND*/0)
292: #else
293: #define need_resched(ci) \
294: do { \
295: curcpu()->ci_want_resched = 1; \
296: aston(curcpu()); \
297: } while (/*CONSTCOND*/0)
298: #endif
299:
300: /*
301: * Give a profiling tick to the current process when the user profiling
302: * buffer pages are invalid. On the Alpha, request an AST to send us
303: * through trap, marking the proc as needing a profiling tick.
304: */
305: #ifdef notyet
306: #define need_proftick(p) \
307: do { \
308: aston((p)->p_cpu); \
309: } while (/*CONSTCOND*/0)
310: #else
311: #define need_proftick(p) \
312: do { \
313: aston(curcpu()); \
314: } while (/*CONSTCOND*/0)
315: #endif
316:
317: /*
318: * Notify the current process (p) that it has a signal pending,
319: * process as soon as possible.
320: */
321: #ifdef notyet
322: #define signotify(p) aston((p)->p_cpu)
323: #else
324: #define signotify(p) aston(curcpu())
325: #endif
326:
327: /*
328: * XXXSMP
329: * Should we send an AST IPI? Or just let it handle it next time
330: * it sees a normal kernel entry? I guess letting it happen later
331: * follows the `asynchronous' part of the name...
332: */
333: #define aston(ci) ((ci)->ci_astpending = 1)
334: #endif /* _KERNEL */
335:
336: /*
337: * CTL_MACHDEP definitions.
338: */
339: #define CPU_CONSDEV 1 /* dev_t: console terminal device */
340: #define CPU_ROOT_DEVICE 2 /* string: root device name */
341: #define CPU_UNALIGNED_PRINT 3 /* int: print unaligned accesses */
342: #define CPU_UNALIGNED_FIX 4 /* int: fix unaligned accesses */
343: #define CPU_UNALIGNED_SIGBUS 5 /* int: SIGBUS unaligned accesses */
344: #define CPU_BOOTED_KERNEL 6 /* string: booted kernel name */
345: #define CPU_FP_SYNC_COMPLETE 7 /* int: always fixup sync fp traps */
346: #define CPU_CHIPSET 8 /* chipset information */
347: #define CPU_ALLOWAPERTURE 9
348:
349: #define CPU_MAXID 10 /* valid machdep IDs */
350:
351: #define CPU_CHIPSET_MEM 1 /* PCI memory address */
352: #define CPU_CHIPSET_BWX 2 /* PCI supports BWX */
353: #define CPU_CHIPSET_TYPE 3 /* PCI chipset name */
354: #define CPU_CHIPSET_DENSE 4 /* PCI chipset dense memory addr */
355: #define CPU_CHIPSET_PORTS 5 /* PCI port address */
356: #define CPU_CHIPSET_HAE_MASK 6 /* PCI chipset mask for HAE register */
357: #define CPU_CHIPSET_MAXID 7
358:
359: #define CTL_MACHDEP_NAMES { \
360: { 0, 0 }, \
361: { "console_device", CTLTYPE_STRUCT }, \
362: { "root_device", CTLTYPE_STRING }, \
363: { "unaligned_print", CTLTYPE_INT }, \
364: { "unaligned_fix", CTLTYPE_INT }, \
365: { "unaligned_sigbus", CTLTYPE_INT }, \
366: { "booted_kernel", CTLTYPE_STRING }, \
367: { "fp_sync_complete", CTLTYPE_INT }, \
368: { "chipset", CTLTYPE_NODE }, \
369: { "allowaperture", CTLTYPE_INT }, \
370: }
371:
372: #define CTL_CHIPSET_NAMES { \
373: { 0, 0 }, \
374: { "memory", CTLTYPE_QUAD }, \
375: { "bwx", CTLTYPE_INT }, \
376: { "type", CTLTYPE_STRING }, \
377: { "dense_base", CTLTYPE_QUAD }, \
378: { "ports_base", CTLTYPE_QUAD }, \
379: { "hae_mask", CTLTYPE_QUAD }, \
380: }
381:
382: #ifdef _KERNEL
383:
384: struct pcb;
385: struct proc;
386: struct reg;
387: struct rpb;
388: struct trapframe;
389:
390: /* IEEE and VAX FP completion */
391:
392: #ifndef NO_IEEE
393: void alpha_sts(int, s_float *); /* MAGIC */
394: void alpha_stt(int, t_float *); /* MAGIC */
395: void alpha_lds(int, s_float *); /* MAGIC */
396: void alpha_ldt(int, t_float *); /* MAGIC */
397:
398: uint64_t alpha_read_fpcr(void); /* MAGIC */
399: void alpha_write_fpcr(u_int64_t); /* MAGIC */
400:
401: u_int64_t alpha_read_fp_c(struct proc *);
402: void alpha_write_fp_c(struct proc *, u_int64_t);
403:
404: int alpha_fp_complete(u_long, u_long, struct proc *, u_int64_t *);
405: #endif
406:
407: void alpha_enable_fp(struct proc *, int);
408:
409: #ifdef MULTIPROCESSOR
410: #include <sys/mplock.h>
411: #endif
412:
413: #endif /* _KERNEL */
414: #endif /* _ALPHA_CPU_H_ */
CVSweb