1da673940SJordan Gordeev /*-
2da673940SJordan Gordeev  * Copyright (c) Peter Wemm <peter@netplex.com.au>
3da673940SJordan Gordeev  * All rights reserved.
4da673940SJordan Gordeev  *
5da673940SJordan Gordeev  * Redistribution and use in source and binary forms, with or without
6da673940SJordan Gordeev  * modification, are permitted provided that the following conditions
7da673940SJordan Gordeev  * are met:
8da673940SJordan Gordeev  * 1. Redistributions of source code must retain the above copyright
9da673940SJordan Gordeev  *    notice, this list of conditions and the following disclaimer.
10da673940SJordan Gordeev  * 2. Redistributions in binary form must reproduce the above copyright
11da673940SJordan Gordeev  *    notice, this list of conditions and the following disclaimer in the
12da673940SJordan Gordeev  *    documentation and/or other materials provided with the distribution.
13da673940SJordan Gordeev  *
14da673940SJordan Gordeev  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15da673940SJordan Gordeev  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16da673940SJordan Gordeev  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17da673940SJordan Gordeev  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18da673940SJordan Gordeev  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19da673940SJordan Gordeev  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20da673940SJordan Gordeev  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21da673940SJordan Gordeev  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22da673940SJordan Gordeev  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23da673940SJordan Gordeev  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24da673940SJordan Gordeev  * SUCH DAMAGE.
25da673940SJordan Gordeev  *
26da673940SJordan Gordeev  *	Only machine-dependant code should ever include this file.  MI
27da673940SJordan Gordeev  *	code and header files do NOT include this file.  e.g. sys/globaldata.h
28da673940SJordan Gordeev  *	should not include this file.
29da673940SJordan Gordeev  *
30da673940SJordan Gordeev  * $FreeBSD: src/sys/i386/include/globaldata.h,v 1.11.2.1 2000/05/16 06:58:10 dillon Exp $
31da673940SJordan Gordeev  */
32da673940SJordan Gordeev 
33da673940SJordan Gordeev #ifndef _MACHINE_GLOBALDATA_H_
34da673940SJordan Gordeev #define _MACHINE_GLOBALDATA_H_
35da673940SJordan Gordeev 
36da673940SJordan Gordeev #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
37da673940SJordan Gordeev 
38da673940SJordan Gordeev #ifndef _SYS_GLOBALDATA_H_
39da673940SJordan Gordeev #include <sys/globaldata.h>	/* struct globaldata */
40da673940SJordan Gordeev #endif
41da673940SJordan Gordeev #ifndef _SYS_THREAD_H_
42da673940SJordan Gordeev #include <sys/thread.h>		/* struct thread */
43da673940SJordan Gordeev #endif
44da673940SJordan Gordeev #ifndef _SYS_VKERNEL_H_
45da673940SJordan Gordeev #include <sys/vkernel.h>	/* vpte_t */
46da673940SJordan Gordeev #endif
47da673940SJordan Gordeev #include <machine/segments.h>	/* struct segment_descriptor */
48*466d4f43Szrj #include <machine/tss.h>	/* struct x86_64tss */
49da673940SJordan Gordeev #include <machine/npx.h>
50da673940SJordan Gordeev 
51da673940SJordan Gordeev /*
52da673940SJordan Gordeev  * Note on interrupt control.  Pending interrupts not yet dispatched are
53da673940SJordan Gordeev  * marked in gd_fpending, gd_ipending, or gd_spending.  Once dispatched
54da673940SJordan Gordeev  * the interrupt's pending bit is cleared and the interrupt is masked.
55da673940SJordan Gordeev  * Upon completion the interrupt is unmasked.
56da673940SJordan Gordeev  *
57da673940SJordan Gordeev  * For edge triggered interrupts interrupts may be enabled again at this
58da673940SJordan Gordeev  * point and if they occur before the interrupt service routine is complete
59da673940SJordan Gordeev  * the service routine will loop.
60da673940SJordan Gordeev  *
61da673940SJordan Gordeev  * The current thread's cpl is stored in the thread structure.
62da673940SJordan Gordeev  *
63da673940SJordan Gordeev  * Note: the embedded globaldata and/or the mdglobaldata structure
64da673940SJordan Gordeev  * may exceed the size of a page.
65da673940SJordan Gordeev  */
66da673940SJordan Gordeev struct mdglobaldata {
67da673940SJordan Gordeev 	struct globaldata mi;
68da673940SJordan Gordeev 	struct user_segment_descriptor gd_common_tssd;
69da673940SJordan Gordeev 	struct user_segment_descriptor *gd_tss_gdt;
70da673940SJordan Gordeev 	struct thread   *gd_npxthread;
710e6594a8SSascha Wildner 	struct x86_64tss gd_common_tss;
72da673940SJordan Gordeev 	union savefpu	gd_savefpu;	/* fast bcopy/zero temp fpu save area */
73da673940SJordan Gordeev 	int		gd_fpu_lock;	/* fast bcopy/zero cpu lock */
74da673940SJordan Gordeev 	int		gd_fpending;	/* fast interrupt pending */
75da673940SJordan Gordeev 	int		gd_ipending;	/* normal interrupt pending */
76da673940SJordan Gordeev 	int		gd_spending;	/* software interrupt pending */
77da673940SJordan Gordeev 	int		gd_sdelayed;	/* delayed software ints */
78da673940SJordan Gordeev 	int		gd_currentldt;
79da23a592SMatthew Dillon 	int		unused001;
80da673940SJordan Gordeev 	int		unused002;
81da23a592SMatthew Dillon 	u_int		unused003;
82da23a592SMatthew Dillon 	cpumask_t	unused004;
83da673940SJordan Gordeev 	u_int		gd_ss_eflags;
84da673940SJordan Gordeev };
85da673940SJordan Gordeev 
86da673940SJordan Gordeev #define MDGLOBALDATA_BASEALLOC_SIZE	\
87da673940SJordan Gordeev 	((sizeof(struct mdglobaldata) + PAGE_MASK) & ~PAGE_MASK)
88da673940SJordan Gordeev #define MDGLOBALDATA_BASEALLOC_PAGES	\
89da673940SJordan Gordeev 	(MDGLOBALDATA_BASEALLOC_SIZE / PAGE_SIZE)
90da673940SJordan Gordeev #define MDGLOBALDATA_PAD		\
91da673940SJordan Gordeev 	(MDGLOBALDATA_BASEALLOC_SIZE - sizeof(struct mdglobaldata))
92da673940SJordan Gordeev 
93da673940SJordan Gordeev /*
94da673940SJordan Gordeev  * This is the upper (0xff800000) address space layout that is per-cpu.
95da673940SJordan Gordeev  * It is setup in locore.s and pmap.c for the BSP and in mp_machdep.c for
96da673940SJordan Gordeev  * each AP.  genassym helps export this to the assembler code.
97da673940SJordan Gordeev  *
98da673940SJordan Gordeev  * WARNING!  This structure must be segment-aligned and portions within the
99da673940SJordan Gordeev  *           structure must also be segment-aligned.  The structure typically
100da673940SJordan Gordeev  *	     takes 3 segments per cpu (12MB).
101da673940SJordan Gordeev  */
102da673940SJordan Gordeev #define PRIVATESPACE_SEGPAD	\
103da673940SJordan Gordeev 	(SEG_SIZE -		\
104da673940SJordan Gordeev 	((sizeof(struct mdglobaldata) + MDGLOBALDATA_PAD + PAGE_SIZE * 4 +  \
105da673940SJordan Gordeev 	UPAGES * PAGE_SIZE) % SEG_SIZE))				    \
106da673940SJordan Gordeev 
107da673940SJordan Gordeev struct privatespace {
108da673940SJordan Gordeev 	/* main data page */
109da673940SJordan Gordeev 	struct mdglobaldata mdglobaldata;
110da673940SJordan Gordeev 	char		__filler0[MDGLOBALDATA_PAD];
111da673940SJordan Gordeev 
112da673940SJordan Gordeev 	/* idle stack (UPAGES pages) */
113da673940SJordan Gordeev 	char		idlestack[UPAGES * PAGE_SIZE];
114da673940SJordan Gordeev };
115da673940SJordan Gordeev #define mdcpu		((struct mdglobaldata *)_get_mycpu())
116da673940SJordan Gordeev 
117da673940SJordan Gordeev #endif
118da673940SJordan Gordeev 
119da673940SJordan Gordeev #ifdef _KERNEL
120da673940SJordan Gordeev 
121da673940SJordan Gordeev extern struct privatespace *CPU_prvspace;
122da673940SJordan Gordeev 
123da673940SJordan Gordeev #endif
124da673940SJordan Gordeev 
125da673940SJordan Gordeev #endif
126