2 * Copyright (c) Peter Wemm <peter@netplex.com.au>
3 * Copyright (c) 2008 The DragonFly Project.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * Only machine-dependant code should ever include this file. MI
28 * code and header files do NOT include this file. e.g. sys/globaldata.h
29 * should not include this file.
31 * $FreeBSD: src/sys/i386/include/globaldata.h,v 1.11.2.1 2000/05/16 06:58:10 dillon Exp $
34 #ifndef _MACHINE_GLOBALDATA_H_
35 #define _MACHINE_GLOBALDATA_H_
37 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
39 #ifndef _SYS_GLOBALDATA_H_
40 #include <sys/globaldata.h> /* struct globaldata */
42 #ifndef _SYS_THREAD_H_
43 #include <sys/thread.h> /* struct thread */
45 #include <machine/segments.h> /* struct user_segment_descriptor */
46 #include <machine/tss.h> /* struct x86_64tss */
47 #include <machine/npx.h>
52 * Note on interrupt control. Pending interrupts not yet dispatched are
53 * marked in gd_fpending or gd_spending. Once dispatched the interrupt's
54 * pending bit is cleared and the interrupt is masked. Upon completion
55 * the interrupt is unmasked.
57 * For edge triggered interrupts interrupts may be enabled again at this
58 * point and if they occur before the interrupt service routine is complete
59 * the service routine will loop.
61 * The current thread's cpl is stored in the thread structure.
63 * Note: the embedded globaldata and/or the mdglobaldata structure
64 * may exceed the size of a page.
68 struct user_segment_descriptor gd_common_tssd;
69 struct user_segment_descriptor *gd_tss_gdt;
70 struct thread *gd_npxthread;
71 struct x86_64tss gd_common_tss;
72 union savefpu gd_savefpu; /* fast bcopy/zero temp fpu save area */
73 int gd_fpu_lock; /* fast bcopy/zero cpu lock */
74 int gd_xinvaltlb; /* reentrancy check invaltlb routine */
76 int gd_spending; /* software interrupt pending */
77 int gd_sdelayed; /* delayed software ints */
83 pt_entry_t *gd_cunused0;
84 pt_entry_t *gd_cunused1;
85 pt_entry_t *gd_cunused2;
86 pt_entry_t *gd_cunused3;
90 struct pv_entry *gd_newpv;
93 register_t gd_scratch_rsp;
95 register_t gd_user_fs; /* current user fs in MSR */
96 register_t gd_user_gs; /* current user gs in MSR */
97 cpumask_t gd_unused006;
98 u_long gd_ipending[3];
101 #define MDGLOBALDATA_BASEALLOC_SIZE \
102 ((sizeof(struct mdglobaldata) + PAGE_MASK) & ~PAGE_MASK)
103 #define MDGLOBALDATA_BASEALLOC_PAGES \
104 (MDGLOBALDATA_BASEALLOC_SIZE / PAGE_SIZE)
105 #define MDGLOBALDATA_PAD \
106 (MDGLOBALDATA_BASEALLOC_SIZE - sizeof(struct mdglobaldata))
109 * This is the upper (0xff800000) address space layout that is per-cpu.
110 * It is setup in locore.s and pmap.c for the BSP and in mp_machdep.c for
111 * each AP. genassym helps export this to the assembler code.
113 struct privatespace {
114 /* JG TODO: fix comments describing layout */
115 /* page 0 - data page */
116 struct mdglobaldata mdglobaldata;
117 char __filler0[MDGLOBALDATA_PAD];
119 /* page 1..4 - CPAGE1,CPAGE2,CPAGE3,PPAGE1 (unused) */
120 char unused1[PAGE_SIZE];
121 char unused2[PAGE_SIZE];
122 char unused3[PAGE_SIZE];
123 char unused4[PAGE_SIZE];
125 /* page 5..4+UPAGES - idle stack (UPAGES pages) */
126 char idlestack[UPAGES * PAGE_SIZE];
128 #define mdcpu ((struct mdglobaldata *)_get_mycpu())
134 extern struct privatespace *CPU_prvspace[];