Return to types.h CVS log | Up to [cvs.NetBSD.org] / src / sys / arch / amd64 / include |
File: [cvs.NetBSD.org] / src / sys / arch / amd64 / include / types.h (download)
Revision 1.53, Fri Jan 5 08:04:21 2018 UTC (6 years, 3 months ago) by maxv
Add a __HAVE_PCPU_AREA option, enabled by default on native amd64 but not Xen. With this option, the CPU structures that must always be present in the CPU's page tables are moved on L4 slot 384, which means address 0xffffc00000000000. A new pcpu_area structure is defined. It contains shared structures (IDT, LDT), and then an array of pcpu_entry structures, indexed by cpu_index(ci). Theoretically the LDT should be in the array, but this will be done later. During the boot procedure, cpu0 calls pmap_init_pcpu, which creates a page tree that is able to map the pcpu_area structure entirely. cpu0 then immediately maps the shared structures. Later, every CPU goes through cpu_pcpuarea_init, which allocates physical pages and kenters the relevant pcpu_entry to them. Finally, each pointer is replaced to point to pcpuarea. The point of this change is to make sure that the structures that must always be present in the page tables have their own L4 slot. Until now their L4 slot was that of pmap_kernel, and making a distinction between what must be mapped and what does not need to be was complicated. Even in the non-speculative-bug case this change makes some sense: there are several x86 instructions that leak the addresses of the CPU structures, and putting these structures inside pmap_kernel actually offered a way to compute the address of the kernel heap - which would have made ASLR on it plainly useless, had we implemented that. Note that, for now, pcpuarea does not contain rsp0. Unfortunately this change adds many #ifdefs, and makes the code harder to understand. There is also some duplication, but that will be solved later. |
/* $NetBSD: types.h,v 1.53 2018/01/05 08:04:21 maxv Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. * 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. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. * * @(#)types.h 7.5 (Berkeley) 3/9/91 */ #ifndef _X86_64_TYPES_H_ #define _X86_64_TYPES_H_ #ifdef __x86_64__ #include <sys/cdefs.h> #include <sys/featuretest.h> #include <machine/int_types.h> #if defined(_KERNEL) typedef struct label_t { long val[8]; } label_t; #endif #if defined(_KERNEL) || defined(_KMEMUSER) || defined(_KERNTYPES) || defined(_STANDALONE) typedef unsigned long paddr_t; typedef unsigned long psize_t; typedef unsigned long vaddr_t; typedef unsigned long vsize_t; #define PRIxPADDR "lx" #define PRIxPSIZE "lx" #define PRIuPSIZE "lu" #define PRIxVADDR "lx" #define PRIxVSIZE "lx" #define PRIuVSIZE "lu" typedef int pmc_evid_t; typedef __uint64_t pmc_ctr_t; typedef long int register_t; typedef int register32_t; #define PRIxREGISTER "lx" #define PRIxREGISTER32 "x" #endif typedef long int __register_t; typedef unsigned char __cpu_simple_lock_nv_t; /* __cpu_simple_lock_t used to be a full word. */ #define __CPU_SIMPLE_LOCK_PAD #define __SIMPLELOCK_LOCKED 1 #define __SIMPLELOCK_UNLOCKED 0 /* The amd64 does not have strict alignment requirements. */ #define __NO_STRICT_ALIGNMENT #define __HAVE_NEW_STYLE_BUS_H #define __HAVE_CPU_COUNTER #define __HAVE_CPU_DATA_FIRST #define __HAVE_CPU_BOOTCONF #define __HAVE_MD_CPU_OFFLINE #define __HAVE_SYSCALL_INTERN #define __HAVE_MINIMAL_EMUL #define __HAVE_ATOMIC64_OPS #define __HAVE_MM_MD_KERNACC #define __HAVE_ATOMIC_AS_MEMBAR #define __HAVE_CPU_LWP_SETPRIVATE #define __HAVE___LWP_GETPRIVATE_FAST #define __HAVE_TLS_VARIANT_II #define __HAVE_COMMON___TLS_GET_ADDR #define __HAVE_INTR_CONTROL #define __HAVE_CPU_RNG #define __HAVE_COMPAT_NETBSD32 #ifdef _KERNEL_OPT #define __HAVE_RAS #include "opt_xen.h" #if defined(__x86_64__) && !defined(XEN) #define __HAVE_PCPU_AREA 1 #define __HAVE_DIRECT_MAP 1 #define __HAVE_MM_MD_DIRECT_MAPPED_IO #define __HAVE_MM_MD_DIRECT_MAPPED_PHYS #define __HAVE_CPU_UAREA_ROUTINES #if !defined(NO_PCI_MSI_MSIX) #define __HAVE_PCI_MSI_MSIX #endif #endif #endif #else /* !__x86_64__ */ #include <i386/types.h> #endif /* __x86_64__ */ #endif /* _X86_64_TYPES_H_ */