summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1998-04-06 15:37:21 +0000
committerpeter <peter@FreeBSD.org>1998-04-06 15:37:21 +0000
commit531b8c0e84e96c719dd1b9c8f44fc65f09851979 (patch)
treefce861176b7a9996205c164ed8724db3bee757e0 /sys/amd64
parent45ae9cd4b8dc4095238734bfcfa5086c5a32a1c7 (diff)
downloadFreeBSD-src-531b8c0e84e96c719dd1b9c8f44fc65f09851979.zip
FreeBSD-src-531b8c0e84e96c719dd1b9c8f44fc65f09851979.tar.gz
A pair of C structures used for laying out the SMP per-cpu data space.
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/include/pcpu.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/sys/amd64/include/pcpu.h b/sys/amd64/include/pcpu.h
new file mode 100644
index 0000000..9bdfaf0
--- /dev/null
+++ b/sys/amd64/include/pcpu.h
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) Peter Wemm <peter@netplex.com.au>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+/*
+ * This structure maps out the global data that needs to be kept on a
+ * per-cpu basis. genassym uses this to generate offsets for the assembler
+ * code, which also provides external symbols so that C can get at them as
+ * though they were really globals.
+ *
+ * The SMP parts are setup in pmap.c and locore.s for the BSP, and
+ * mp_machdep.c sets up the data for the AP's to "see" when they awake.
+ * The reason for doing it via a struct is so that an array of pointers
+ * to each CPU's data can be set up for things like "check curproc on all
+ * other processors"
+ */
+struct globaldata {
+ struct proc *curproc;
+ struct proc *npxproc;
+ struct pcb *curpcb;
+ struct i386tss common_tss;
+#ifdef VM86
+ struct segment_descriptor common_tssd;
+ u_int private_tss;
+#endif
+#ifdef SMP
+ u_int cpuid;
+ u_int cpu_lockid;
+ u_int other_cpus;
+ pd_entry_t *my_idlePTD;
+ u_int ss_tpr;
+ pt_entry_t *prv_CMAP1;
+ pt_entry_t *prv_CMAP2;
+ pt_entry_t *prv_CMAP3;
+ int inside_intr;
+#ifdef VM86
+ u_int my_tr; /* XX VM86 only */
+#endif
+#endif
+
+};
+
+#ifdef SMP
+/*
+ * This is the upper (0xff800000) address space layout that is per-cpu.
+ * It is setup in locore.s and pmap.c for the BSP and in mp_machdep.c for
+ * each AP. genassym helps export this to the assembler code.
+ */
+struct privatespace {
+ /* page 0 - data page */
+ struct globaldata globaldata;
+ char __filler0[PAGE_SIZE - sizeof(struct globaldata)];
+
+ /* page 1 - page table page */
+ pt_entry_t prvpt[NPTEPG];
+
+ /* page 2 - local apic mapping */
+ lapic_t lapic;
+ char __filler1[PAGE_SIZE - sizeof(lapic_t)];
+
+ /* page 3,4 - idle stack (2 pages) */
+ char idlestack[2 * PAGE_SIZE];
+
+ /* page 5,6,7 - CPAGE1,CPAGE2,CPAGE3 */
+ char CPAGE1[PAGE_SIZE];
+ char CPAGE2[PAGE_SIZE];
+ char CPAGE3[PAGE_SIZE];
+
+ /* page 8-15 - spare, unmapped */
+ char __filler2[8 * PAGE_SIZE];
+
+ /* page 16-31 - space for IO apics */
+ char ioapics[16 * PAGE_SIZE];
+
+ /* page 32-47 - maybe other cpu's globaldata pages? */
+};
+#endif
OpenPOWER on IntegriCloud