diff options
author | peter <peter@FreeBSD.org> | 1998-04-06 15:37:21 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1998-04-06 15:37:21 +0000 |
commit | 531b8c0e84e96c719dd1b9c8f44fc65f09851979 (patch) | |
tree | fce861176b7a9996205c164ed8724db3bee757e0 /sys/amd64 | |
parent | 45ae9cd4b8dc4095238734bfcfa5086c5a32a1c7 (diff) | |
download | FreeBSD-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.h | 101 |
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 |