Annotation of sys/arch/amd64/include/cpu.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: cpu.h,v 1.31 2007/05/29 18:53:52 deraadt Exp $ */
2: /* $NetBSD: cpu.h,v 1.1 2003/04/26 18:39:39 fvdl Exp $ */
3:
4: /*-
5: * Copyright (c) 1990 The Regents of the University of California.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to Berkeley by
9: * William Jolitz.
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: * 3. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: *
35: * @(#)cpu.h 5.4 (Berkeley) 5/9/91
36: */
37:
38: #ifndef _AMD64_CPU_H_
39: #define _AMD64_CPU_H_
40:
41: /*
42: * Definitions unique to x86-64 cpu support.
43: */
44: #include <machine/frame.h>
45: #include <machine/segments.h>
46: #include <machine/tss.h>
47: #include <machine/intrdefs.h>
48: #include <machine/cacheinfo.h>
49:
50: #ifdef MULTIPROCESSOR
51: #include <machine/i82489reg.h>
52: #include <machine/i82489var.h>
53: #endif
54:
55: #include <sys/device.h>
56: #include <sys/lock.h>
57: #include <sys/sched.h>
58: #include <sys/sensors.h>
59:
60: #ifdef _KERNEL
61:
62: struct cpu_info {
63: struct device *ci_dev;
64: struct cpu_info *ci_self;
65: struct schedstate_percpu ci_schedstate; /* scheduler state */
66: struct cpu_info *ci_next;
67:
68: struct proc *ci_curproc;
69: struct simplelock ci_slock;
70: u_int ci_cpuid;
71: u_int ci_apicid;
72: u_long ci_spin_locks;
73: u_long ci_simple_locks;
74:
75: u_int64_t ci_scratch;
76:
77: struct proc *ci_fpcurproc;
78: int ci_fpsaving;
79:
80: volatile u_int32_t ci_tlb_ipi_mask;
81:
82: struct pcb *ci_curpcb;
83: struct pcb *ci_idle_pcb;
84: int ci_idle_tss_sel;
85:
86: struct intrsource *ci_isources[MAX_INTR_SOURCES];
87: u_int32_t ci_ipending;
88: int ci_ilevel;
89: int ci_idepth;
90: u_int32_t ci_imask[NIPL];
91: u_int32_t ci_iunmask[NIPL];
92:
93: paddr_t ci_idle_pcb_paddr;
94: u_int ci_flags;
95: u_int32_t ci_ipis;
96:
97: u_int32_t ci_feature_flags;
98: u_int32_t ci_feature_eflags;
99: u_int32_t ci_signature;
100: u_int64_t ci_tsc_freq;
101:
102: struct cpu_functions *ci_func;
103: void (*cpu_setup)(struct cpu_info *);
104: void (*ci_info)(struct cpu_info *);
105:
106: int ci_want_resched;
107:
108: struct x86_cache_info ci_cinfo[CAI_COUNT];
109:
110: struct timeval ci_cc_time;
111: int64_t ci_cc_cc;
112: int64_t ci_cc_ms_delta;
113: int64_t ci_cc_denom;
114:
115: char *ci_gdt;
116:
117: volatile int ci_ddb_paused;
118: #define CI_DDB_RUNNING 0
119: #define CI_DDB_SHOULDSTOP 1
120: #define CI_DDB_STOPPED 2
121: #define CI_DDB_ENTERDDB 3
122: #define CI_DDB_INDDB 4
123:
124: volatile int ci_setperf_state;
125: #define CI_SETPERF_READY 0
126: #define CI_SETPERF_SHOULDSTOP 1
127: #define CI_SETPERF_INTRANSIT 2
128: #define CI_SETPERF_DONE 3
129:
130: struct x86_64_tss ci_doubleflt_tss;
131:
132: char *ci_doubleflt_stack;
133:
134: struct ksensordev ci_sensordev;
135: struct ksensor ci_sensor;
136: };
137:
138: #define CPUF_BSP 0x0001 /* CPU is the original BSP */
139: #define CPUF_AP 0x0002 /* CPU is an AP */
140: #define CPUF_SP 0x0004 /* CPU is only processor */
141: #define CPUF_PRIMARY 0x0008 /* CPU is active primary processor */
142:
143: #define CPUF_PRESENT 0x1000 /* CPU is present */
144: #define CPUF_RUNNING 0x2000 /* CPU is running */
145: #define CPUF_PAUSE 0x4000 /* CPU is paused in DDB */
146: #define CPUF_GO 0x8000 /* CPU should start running */
147:
148: #define PROC_PC(p) ((p)->p_md.md_regs->tf_rip)
149:
150: extern struct cpu_info cpu_info_primary;
151: extern struct cpu_info *cpu_info_list;
152:
153: #define CPU_INFO_ITERATOR int
154: #define CPU_INFO_FOREACH(cii, ci) for (cii = 0, ci = cpu_info_list; \
155: ci != NULL; ci = ci->ci_next)
156:
157: #define CPU_INFO_UNIT(ci) ((ci)->ci_dev->dv_unit)
158:
159: /*
160: * Preempt the current process if in interrupt from user mode,
161: * or after the current trap/syscall if in system mode.
162: */
163: extern void need_resched(struct cpu_info *);
164:
165: #if defined(MULTIPROCESSOR)
166:
167: #define X86_MAXPROCS 32 /* bitmask; can be bumped to 64 */
168:
169: #define CPU_STARTUP(_ci) ((_ci)->ci_func->start(_ci))
170: #define CPU_STOP(_ci) ((_ci)->ci_func->stop(_ci))
171: #define CPU_START_CLEANUP(_ci) ((_ci)->ci_func->cleanup(_ci))
172:
173: #define curcpu() ({struct cpu_info *__ci; \
174: asm volatile("movq %%gs:8,%0" : "=r" (__ci)); \
175: __ci;})
176: #define cpu_number() (curcpu()->ci_cpuid)
177:
178: #define CPU_IS_PRIMARY(ci) ((ci)->ci_flags & CPUF_PRIMARY)
179:
180: extern struct cpu_info *cpu_info[X86_MAXPROCS];
181:
182: void cpu_boot_secondary_processors(void);
183: void cpu_init_idle_pcbs(void);
184:
185: #else /* !MULTIPROCESSOR */
186:
187: #define X86_MAXPROCS 1
188:
189: #ifdef _KERNEL
190: extern struct cpu_info cpu_info_primary;
191:
192: #define curcpu() (&cpu_info_primary)
193:
194: #endif
195:
196: /*
197: * definitions of cpu-dependent requirements
198: * referenced in generic code
199: */
200: #define cpu_number() 0
201: #define CPU_IS_PRIMARY(ci) 1
202:
203: #endif /* MULTIPROCESSOR */
204:
205: #endif /* _KERNEL */
206:
207: #include <machine/psl.h>
208:
209: #ifdef MULTIPROCESSOR
210: #include <sys/mplock.h>
211: #endif
212:
213: #define aston(p) ((p)->p_md.md_astpending = 1)
214:
215: extern u_int32_t cpus_attached;
216:
217: #define curpcb curcpu()->ci_curpcb
218: #define curproc curcpu()->ci_curproc
219:
220: /*
221: * Arguments to hardclock, softclock and statclock
222: * encapsulate the previous machine state in an opaque
223: * clockframe; for now, use generic intrframe.
224: */
225: #define clockframe intrframe
226:
227: #define CLKF_USERMODE(frame) USERMODE((frame)->if_cs, (frame)->if_rflags)
228: #define CLKF_PC(frame) ((frame)->if_rip)
229: #define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
230:
231: /*
232: * This is used during profiling to integrate system time.
233: */
234: #define PROC_PC(p) ((p)->p_md.md_regs->tf_rip)
235:
236: /*
237: * Give a profiling tick to the current process when the user profiling
238: * buffer pages are invalid. On the i386, request an ast to send us
239: * through trap(), marking the proc as needing a profiling tick.
240: */
241: #define need_proftick(p) aston(p)
242:
243: void signotify(struct proc *);
244:
245: /*
246: * We need a machine-independent name for this.
247: */
248: extern void (*delay_func)(int);
249: struct timeval;
250:
251: #define DELAY(x) (*delay_func)(x)
252: #define delay(x) (*delay_func)(x)
253:
254:
255: #ifdef _KERNEL
256: extern int biosbasemem;
257: extern int biosextmem;
258: extern int cpu;
259: extern int cpu_feature;
260: extern int cpu_ecxfeature;
261: extern int cpu_id;
262: extern char cpu_vendor[];
263: extern int cpuid_level;
264: extern int cpuspeed;
265:
266: /* identcpu.c */
267: void identifycpu(struct cpu_info *);
268: int cpu_amd64speed(int *);
269: void cpu_probe_features(struct cpu_info *);
270:
271: /* machdep.c */
272: void dumpconf(void);
273: int cpu_maxproc(void);
274: void cpu_reset(void);
275: void x86_64_proc0_tss_ldt_init(void);
276: void x86_64_bufinit(void);
277: void x86_64_init_pcb_tss_ldt(struct cpu_info *);
278: void cpu_proc_fork(struct proc *, struct proc *);
279:
280: struct region_descriptor;
281: void lgdt(struct region_descriptor *);
282: void fillw(short, void *, size_t);
283:
284: struct pcb;
285: void savectx(struct pcb *);
286: void switch_exit(struct proc *, void (*)(struct proc *));
287: void proc_trampoline(void);
288: void child_trampoline(void);
289:
290: /* clock.c */
291: void initrtclock(void);
292: void startrtclock(void);
293: void i8254_delay(int);
294: void i8254_initclocks(void);
295: void i8254_inittimecounter(void);
296: void i8254_inittimecounter_simple(void);
297:
298:
299: void cpu_init_msrs(struct cpu_info *);
300:
301:
302: /* trap.c */
303: void child_return(void *);
304:
305: /* dkcsum.c */
306: void dkcsumattach(void);
307:
308: /* consinit.c */
309: void kgdb_port_init(void);
310:
311: /* bus_machdep.c */
312: void x86_bus_space_init(void);
313: void x86_bus_space_mallocok(void);
314:
315: /* powernow-k8.c */
316: void k8_powernow_init(struct cpu_info *);
317: void k8_powernow_setperf(int);
318:
319: void est_init(struct cpu_info *);
320: void est_setperf(int);
321:
322: #ifdef MULTIPROCESSOR
323: /* mp_setperf.c */
324: void mp_setperf_init(void);
325: #endif
326:
327: #endif /* _KERNEL */
328:
329: /*
330: * CTL_MACHDEP definitions.
331: */
332: #define CPU_CONSDEV 1 /* dev_t: console terminal device */
333: #define CPU_BIOS 2 /* BIOS variables */
334: #define CPU_BLK2CHR 3 /* convert blk maj into chr one */
335: #define CPU_CHR2BLK 4 /* convert chr maj into blk one */
336: #define CPU_ALLOWAPERTURE 5 /* allow mmap of /dev/xf86 */
337: #define CPU_CPUVENDOR 6 /* cpuid vendor string */
338: #define CPU_CPUID 7 /* cpuid */
339: #define CPU_CPUFEATURE 8 /* cpuid features */
340: #define CPU_APMWARN 9 /* APM battery warning percentage */
341: #define CPU_KBDRESET 10 /* keyboard reset under pcvt */
342: #define CPU_APMHALT 11 /* halt -p hack */
343: #define CPU_USERLDT 12
344: #define CPU_MAXID 13 /* number of valid machdep ids */
345:
346: #define CTL_MACHDEP_NAMES { \
347: { 0, 0 }, \
348: { "console_device", CTLTYPE_STRUCT }, \
349: { "bios", CTLTYPE_INT }, \
350: { "blk2chr", CTLTYPE_STRUCT }, \
351: { "chr2blk", CTLTYPE_STRUCT }, \
352: { "allowaperture", CTLTYPE_INT }, \
353: { "cpuvendor", CTLTYPE_STRING }, \
354: { "cpuid", CTLTYPE_INT }, \
355: { "cpufeature", CTLTYPE_INT }, \
356: { "apmwarn", CTLTYPE_INT }, \
357: { "kbdreset", CTLTYPE_INT }, \
358: { "apmhalt", CTLTYPE_INT }, \
359: { "userldt", CTLTYPE_INT }, \
360: }
361:
362: /*
363: * Default cr4 flags.
364: * Doesn't really belong here, but doesn't really belong anywhere else
365: * either. Just to avoid painful mismatches of cr4 flags since they are
366: * set in three different places.
367: */
368: #define CR4_DEFAULT (CR4_PAE|CR4_PGE|CR4_PSE|CR4_OSFXSR|CR4_OSXMMEXCPT)
369:
370: #endif /* !_AMD64_CPU_H_ */
CVSweb