LCOV - code coverage report
Current view: top level - arch/x86/include/asm - processor.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 55 69 79.7 %
Date: 2021-04-22 12:43:58 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef _ASM_X86_PROCESSOR_H
       3             : #define _ASM_X86_PROCESSOR_H
       4             : 
       5             : #include <asm/processor-flags.h>
       6             : 
       7             : /* Forward declaration, a strange C thing */
       8             : struct task_struct;
       9             : struct mm_struct;
      10             : struct io_bitmap;
      11             : struct vm86;
      12             : 
      13             : #include <asm/math_emu.h>
      14             : #include <asm/segment.h>
      15             : #include <asm/types.h>
      16             : #include <uapi/asm/sigcontext.h>
      17             : #include <asm/current.h>
      18             : #include <asm/cpufeatures.h>
      19             : #include <asm/page.h>
      20             : #include <asm/pgtable_types.h>
      21             : #include <asm/percpu.h>
      22             : #include <asm/msr.h>
      23             : #include <asm/desc_defs.h>
      24             : #include <asm/nops.h>
      25             : #include <asm/special_insns.h>
      26             : #include <asm/fpu/types.h>
      27             : #include <asm/unwind_hints.h>
      28             : #include <asm/vmxfeatures.h>
      29             : #include <asm/vdso/processor.h>
      30             : 
      31             : #include <linux/personality.h>
      32             : #include <linux/cache.h>
      33             : #include <linux/threads.h>
      34             : #include <linux/math64.h>
      35             : #include <linux/err.h>
      36             : #include <linux/irqflags.h>
      37             : #include <linux/mem_encrypt.h>
      38             : 
      39             : /*
      40             :  * We handle most unaligned accesses in hardware.  On the other hand
      41             :  * unaligned DMA can be quite expensive on some Nehalem processors.
      42             :  *
      43             :  * Based on this we disable the IP header alignment in network drivers.
      44             :  */
      45             : #define NET_IP_ALIGN    0
      46             : 
      47             : #define HBP_NUM 4
      48             : 
      49             : /*
      50             :  * These alignment constraints are for performance in the vSMP case,
      51             :  * but in the task_struct case we must also meet hardware imposed
      52             :  * alignment requirements of the FPU state:
      53             :  */
      54             : #ifdef CONFIG_X86_VSMP
      55             : # define ARCH_MIN_TASKALIGN             (1 << INTERNODE_CACHE_SHIFT)
      56             : # define ARCH_MIN_MMSTRUCT_ALIGN        (1 << INTERNODE_CACHE_SHIFT)
      57             : #else
      58             : # define ARCH_MIN_TASKALIGN             __alignof__(union fpregs_state)
      59             : # define ARCH_MIN_MMSTRUCT_ALIGN        0
      60             : #endif
      61             : 
      62             : enum tlb_infos {
      63             :         ENTRIES,
      64             :         NR_INFO
      65             : };
      66             : 
      67             : extern u16 __read_mostly tlb_lli_4k[NR_INFO];
      68             : extern u16 __read_mostly tlb_lli_2m[NR_INFO];
      69             : extern u16 __read_mostly tlb_lli_4m[NR_INFO];
      70             : extern u16 __read_mostly tlb_lld_4k[NR_INFO];
      71             : extern u16 __read_mostly tlb_lld_2m[NR_INFO];
      72             : extern u16 __read_mostly tlb_lld_4m[NR_INFO];
      73             : extern u16 __read_mostly tlb_lld_1g[NR_INFO];
      74             : 
      75             : /*
      76             :  *  CPU type and hardware bug flags. Kept separately for each CPU.
      77             :  *  Members of this structure are referenced in head_32.S, so think twice
      78             :  *  before touching them. [mj]
      79             :  */
      80             : 
      81             : struct cpuinfo_x86 {
      82             :         __u8                    x86;            /* CPU family */
      83             :         __u8                    x86_vendor;     /* CPU vendor */
      84             :         __u8                    x86_model;
      85             :         __u8                    x86_stepping;
      86             : #ifdef CONFIG_X86_64
      87             :         /* Number of 4K pages in DTLB/ITLB combined(in pages): */
      88             :         int                     x86_tlbsize;
      89             : #endif
      90             : #ifdef CONFIG_X86_VMX_FEATURE_NAMES
      91             :         __u32                   vmx_capability[NVMXINTS];
      92             : #endif
      93             :         __u8                    x86_virt_bits;
      94             :         __u8                    x86_phys_bits;
      95             :         /* CPUID returned core id bits: */
      96             :         __u8                    x86_coreid_bits;
      97             :         __u8                    cu_id;
      98             :         /* Max extended CPUID function supported: */
      99             :         __u32                   extended_cpuid_level;
     100             :         /* Maximum supported CPUID level, -1=no CPUID: */
     101             :         int                     cpuid_level;
     102             :         /*
     103             :          * Align to size of unsigned long because the x86_capability array
     104             :          * is passed to bitops which require the alignment. Use unnamed
     105             :          * union to enforce the array is aligned to size of unsigned long.
     106             :          */
     107             :         union {
     108             :                 __u32           x86_capability[NCAPINTS + NBUGINTS];
     109             :                 unsigned long   x86_capability_alignment;
     110             :         };
     111             :         char                    x86_vendor_id[16];
     112             :         char                    x86_model_id[64];
     113             :         /* in KB - valid for CPUS which support this call: */
     114             :         unsigned int            x86_cache_size;
     115             :         int                     x86_cache_alignment;    /* In bytes */
     116             :         /* Cache QoS architectural values, valid only on the BSP: */
     117             :         int                     x86_cache_max_rmid;     /* max index */
     118             :         int                     x86_cache_occ_scale;    /* scale to bytes */
     119             :         int                     x86_cache_mbm_width_offset;
     120             :         int                     x86_power;
     121             :         unsigned long           loops_per_jiffy;
     122             :         /* cpuid returned max cores value: */
     123             :         u16                     x86_max_cores;
     124             :         u16                     apicid;
     125             :         u16                     initial_apicid;
     126             :         u16                     x86_clflush_size;
     127             :         /* number of cores as seen by the OS: */
     128             :         u16                     booted_cores;
     129             :         /* Physical processor id: */
     130             :         u16                     phys_proc_id;
     131             :         /* Logical processor id: */
     132             :         u16                     logical_proc_id;
     133             :         /* Core id: */
     134             :         u16                     cpu_core_id;
     135             :         u16                     cpu_die_id;
     136             :         u16                     logical_die_id;
     137             :         /* Index into per_cpu list: */
     138             :         u16                     cpu_index;
     139             :         u32                     microcode;
     140             :         /* Address space bits used by the cache internally */
     141             :         u8                      x86_cache_bits;
     142             :         unsigned                initialized : 1;
     143             : } __randomize_layout;
     144             : 
     145             : struct cpuid_regs {
     146             :         u32 eax, ebx, ecx, edx;
     147             : };
     148             : 
     149             : enum cpuid_regs_idx {
     150             :         CPUID_EAX = 0,
     151             :         CPUID_EBX,
     152             :         CPUID_ECX,
     153             :         CPUID_EDX,
     154             : };
     155             : 
     156             : #define X86_VENDOR_INTEL        0
     157             : #define X86_VENDOR_CYRIX        1
     158             : #define X86_VENDOR_AMD          2
     159             : #define X86_VENDOR_UMC          3
     160             : #define X86_VENDOR_CENTAUR      5
     161             : #define X86_VENDOR_TRANSMETA    7
     162             : #define X86_VENDOR_NSC          8
     163             : #define X86_VENDOR_HYGON        9
     164             : #define X86_VENDOR_ZHAOXIN      10
     165             : #define X86_VENDOR_NUM          11
     166             : 
     167             : #define X86_VENDOR_UNKNOWN      0xff
     168             : 
     169             : /*
     170             :  * capabilities of CPUs
     171             :  */
     172             : extern struct cpuinfo_x86       boot_cpu_data;
     173             : extern struct cpuinfo_x86       new_cpu_data;
     174             : 
     175             : extern __u32                    cpu_caps_cleared[NCAPINTS + NBUGINTS];
     176             : extern __u32                    cpu_caps_set[NCAPINTS + NBUGINTS];
     177             : 
     178             : #ifdef CONFIG_SMP
     179             : DECLARE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info);
     180             : #define cpu_data(cpu)           per_cpu(cpu_info, cpu)
     181             : #else
     182             : #define cpu_info                boot_cpu_data
     183             : #define cpu_data(cpu)           boot_cpu_data
     184             : #endif
     185             : 
     186             : extern const struct seq_operations cpuinfo_op;
     187             : 
     188             : #define cache_line_size()       (boot_cpu_data.x86_cache_alignment)
     189             : 
     190             : extern void cpu_detect(struct cpuinfo_x86 *c);
     191             : 
     192           1 : static inline unsigned long long l1tf_pfn_limit(void)
     193             : {
     194           1 :         return BIT_ULL(boot_cpu_data.x86_cache_bits - 1 - PAGE_SHIFT);
     195             : }
     196             : 
     197             : extern void early_cpu_init(void);
     198             : extern void identify_boot_cpu(void);
     199             : extern void identify_secondary_cpu(struct cpuinfo_x86 *);
     200             : extern void print_cpu_info(struct cpuinfo_x86 *);
     201             : void print_cpu_msr(struct cpuinfo_x86 *);
     202             : 
     203             : #ifdef CONFIG_X86_32
     204             : extern int have_cpuid_p(void);
     205             : #else
     206           5 : static inline int have_cpuid_p(void)
     207             : {
     208           5 :         return 1;
     209             : }
     210             : #endif
     211         305 : static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
     212             :                                 unsigned int *ecx, unsigned int *edx)
     213             : {
     214             :         /* ecx is often an input as well as an output. */
     215         528 :         asm volatile("cpuid"
     216             :             : "=a" (*eax),
     217             :               "=b" (*ebx),
     218             :               "=c" (*ecx),
     219             :               "=d" (*edx)
     220           0 :             : "0" (*eax), "2" (*ecx)
     221             :             : "memory");
     222             : }
     223             : 
     224             : #define native_cpuid_reg(reg)                                   \
     225             : static inline unsigned int native_cpuid_##reg(unsigned int op)  \
     226             : {                                                               \
     227             :         unsigned int eax = op, ebx, ecx = 0, edx;               \
     228             :                                                                 \
     229             :         native_cpuid(&eax, &ebx, &ecx, &edx);                   \
     230             :                                                                 \
     231             :         return reg;                                             \
     232             : }
     233             : 
     234             : /*
     235             :  * Native CPUID functions returning a single datum.
     236             :  */
     237           5 : native_cpuid_reg(eax)
     238             : native_cpuid_reg(ebx)
     239             : native_cpuid_reg(ecx)
     240             : native_cpuid_reg(edx)
     241             : 
     242             : /*
     243             :  * Friendlier CR3 helpers.
     244             :  */
     245           7 : static inline unsigned long read_cr3_pa(void)
     246             : {
     247           7 :         return __read_cr3() & CR3_ADDR_MASK;
     248             : }
     249             : 
     250             : static inline unsigned long native_read_cr3_pa(void)
     251             : {
     252             :         return __native_read_cr3() & CR3_ADDR_MASK;
     253             : }
     254             : 
     255           3 : static inline void load_cr3(pgd_t *pgdir)
     256             : {
     257           6 :         write_cr3(__sme_pa(pgdir));
     258             : }
     259             : 
     260             : /*
     261             :  * Note that while the legacy 'TSS' name comes from 'Task State Segment',
     262             :  * on modern x86 CPUs the TSS also holds information important to 64-bit mode,
     263             :  * unrelated to the task-switch mechanism:
     264             :  */
     265             : #ifdef CONFIG_X86_32
     266             : /* This is the TSS defined by the hardware. */
     267             : struct x86_hw_tss {
     268             :         unsigned short          back_link, __blh;
     269             :         unsigned long           sp0;
     270             :         unsigned short          ss0, __ss0h;
     271             :         unsigned long           sp1;
     272             : 
     273             :         /*
     274             :          * We don't use ring 1, so ss1 is a convenient scratch space in
     275             :          * the same cacheline as sp0.  We use ss1 to cache the value in
     276             :          * MSR_IA32_SYSENTER_CS.  When we context switch
     277             :          * MSR_IA32_SYSENTER_CS, we first check if the new value being
     278             :          * written matches ss1, and, if it's not, then we wrmsr the new
     279             :          * value and update ss1.
     280             :          *
     281             :          * The only reason we context switch MSR_IA32_SYSENTER_CS is
     282             :          * that we set it to zero in vm86 tasks to avoid corrupting the
     283             :          * stack if we were to go through the sysenter path from vm86
     284             :          * mode.
     285             :          */
     286             :         unsigned short          ss1;    /* MSR_IA32_SYSENTER_CS */
     287             : 
     288             :         unsigned short          __ss1h;
     289             :         unsigned long           sp2;
     290             :         unsigned short          ss2, __ss2h;
     291             :         unsigned long           __cr3;
     292             :         unsigned long           ip;
     293             :         unsigned long           flags;
     294             :         unsigned long           ax;
     295             :         unsigned long           cx;
     296             :         unsigned long           dx;
     297             :         unsigned long           bx;
     298             :         unsigned long           sp;
     299             :         unsigned long           bp;
     300             :         unsigned long           si;
     301             :         unsigned long           di;
     302             :         unsigned short          es, __esh;
     303             :         unsigned short          cs, __csh;
     304             :         unsigned short          ss, __ssh;
     305             :         unsigned short          ds, __dsh;
     306             :         unsigned short          fs, __fsh;
     307             :         unsigned short          gs, __gsh;
     308             :         unsigned short          ldt, __ldth;
     309             :         unsigned short          trace;
     310             :         unsigned short          io_bitmap_base;
     311             : 
     312             : } __attribute__((packed));
     313             : #else
     314             : struct x86_hw_tss {
     315             :         u32                     reserved1;
     316             :         u64                     sp0;
     317             : 
     318             :         /*
     319             :          * We store cpu_current_top_of_stack in sp1 so it's always accessible.
     320             :          * Linux does not use ring 1, so sp1 is not otherwise needed.
     321             :          */
     322             :         u64                     sp1;
     323             : 
     324             :         /*
     325             :          * Since Linux does not use ring 2, the 'sp2' slot is unused by
     326             :          * hardware.  entry_SYSCALL_64 uses it as scratch space to stash
     327             :          * the user RSP value.
     328             :          */
     329             :         u64                     sp2;
     330             : 
     331             :         u64                     reserved2;
     332             :         u64                     ist[7];
     333             :         u32                     reserved3;
     334             :         u32                     reserved4;
     335             :         u16                     reserved5;
     336             :         u16                     io_bitmap_base;
     337             : 
     338             : } __attribute__((packed));
     339             : #endif
     340             : 
     341             : /*
     342             :  * IO-bitmap sizes:
     343             :  */
     344             : #define IO_BITMAP_BITS                  65536
     345             : #define IO_BITMAP_BYTES                 (IO_BITMAP_BITS / BITS_PER_BYTE)
     346             : #define IO_BITMAP_LONGS                 (IO_BITMAP_BYTES / sizeof(long))
     347             : 
     348             : #define IO_BITMAP_OFFSET_VALID_MAP                              \
     349             :         (offsetof(struct tss_struct, io_bitmap.bitmap) -        \
     350             :          offsetof(struct tss_struct, x86_tss))
     351             : 
     352             : #define IO_BITMAP_OFFSET_VALID_ALL                              \
     353             :         (offsetof(struct tss_struct, io_bitmap.mapall) -        \
     354             :          offsetof(struct tss_struct, x86_tss))
     355             : 
     356             : #ifdef CONFIG_X86_IOPL_IOPERM
     357             : /*
     358             :  * sizeof(unsigned long) coming from an extra "long" at the end of the
     359             :  * iobitmap. The limit is inclusive, i.e. the last valid byte.
     360             :  */
     361             : # define __KERNEL_TSS_LIMIT     \
     362             :         (IO_BITMAP_OFFSET_VALID_ALL + IO_BITMAP_BYTES + \
     363             :          sizeof(unsigned long) - 1)
     364             : #else
     365             : # define __KERNEL_TSS_LIMIT     \
     366             :         (offsetof(struct tss_struct, x86_tss) + sizeof(struct x86_hw_tss) - 1)
     367             : #endif
     368             : 
     369             : /* Base offset outside of TSS_LIMIT so unpriviledged IO causes #GP */
     370             : #define IO_BITMAP_OFFSET_INVALID        (__KERNEL_TSS_LIMIT + 1)
     371             : 
     372             : struct entry_stack {
     373             :         char    stack[PAGE_SIZE];
     374             : };
     375             : 
     376             : struct entry_stack_page {
     377             :         struct entry_stack stack;
     378             : } __aligned(PAGE_SIZE);
     379             : 
     380             : /*
     381             :  * All IO bitmap related data stored in the TSS:
     382             :  */
     383             : struct x86_io_bitmap {
     384             :         /* The sequence number of the last active bitmap. */
     385             :         u64                     prev_sequence;
     386             : 
     387             :         /*
     388             :          * Store the dirty size of the last io bitmap offender. The next
     389             :          * one will have to do the cleanup as the switch out to a non io
     390             :          * bitmap user will just set x86_tss.io_bitmap_base to a value
     391             :          * outside of the TSS limit. So for sane tasks there is no need to
     392             :          * actually touch the io_bitmap at all.
     393             :          */
     394             :         unsigned int            prev_max;
     395             : 
     396             :         /*
     397             :          * The extra 1 is there because the CPU will access an
     398             :          * additional byte beyond the end of the IO permission
     399             :          * bitmap. The extra byte must be all 1 bits, and must
     400             :          * be within the limit.
     401             :          */
     402             :         unsigned long           bitmap[IO_BITMAP_LONGS + 1];
     403             : 
     404             :         /*
     405             :          * Special I/O bitmap to emulate IOPL(3). All bytes zero,
     406             :          * except the additional byte at the end.
     407             :          */
     408             :         unsigned long           mapall[IO_BITMAP_LONGS + 1];
     409             : };
     410             : 
     411             : struct tss_struct {
     412             :         /*
     413             :          * The fixed hardware portion.  This must not cross a page boundary
     414             :          * at risk of violating the SDM's advice and potentially triggering
     415             :          * errata.
     416             :          */
     417             :         struct x86_hw_tss       x86_tss;
     418             : 
     419             :         struct x86_io_bitmap    io_bitmap;
     420             : } __aligned(PAGE_SIZE);
     421             : 
     422             : DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw);
     423             : 
     424             : /* Per CPU interrupt stacks */
     425             : struct irq_stack {
     426             :         char            stack[IRQ_STACK_SIZE];
     427             : } __aligned(IRQ_STACK_SIZE);
     428             : 
     429             : #ifdef CONFIG_X86_32
     430             : DECLARE_PER_CPU(unsigned long, cpu_current_top_of_stack);
     431             : #else
     432             : /* The RO copy can't be accessed with this_cpu_xyz(), so use the RW copy. */
     433             : #define cpu_current_top_of_stack cpu_tss_rw.x86_tss.sp1
     434             : #endif
     435             : 
     436             : #ifdef CONFIG_X86_64
     437             : struct fixed_percpu_data {
     438             :         /*
     439             :          * GCC hardcodes the stack canary as %gs:40.  Since the
     440             :          * irq_stack is the object at %gs:0, we reserve the bottom
     441             :          * 48 bytes of the irq stack for the canary.
     442             :          */
     443             :         char            gs_base[40];
     444             :         unsigned long   stack_canary;
     445             : };
     446             : 
     447             : DECLARE_PER_CPU_FIRST(struct fixed_percpu_data, fixed_percpu_data) __visible;
     448             : DECLARE_INIT_PER_CPU(fixed_percpu_data);
     449             : 
     450           6 : static inline unsigned long cpu_kernelmode_gs_base(int cpu)
     451             : {
     452           6 :         return (unsigned long)per_cpu(fixed_percpu_data.gs_base, cpu);
     453             : }
     454             : 
     455             : DECLARE_PER_CPU(void *, hardirq_stack_ptr);
     456             : DECLARE_PER_CPU(bool, hardirq_stack_inuse);
     457             : extern asmlinkage void ignore_sysret(void);
     458             : 
     459             : /* Save actual FS/GS selectors and bases to current->thread */
     460             : void current_save_fsgs(void);
     461             : #else   /* X86_64 */
     462             : #ifdef CONFIG_STACKPROTECTOR
     463             : /*
     464             :  * Make sure stack canary segment base is cached-aligned:
     465             :  *   "For Intel Atom processors, avoid non zero segment base address
     466             :  *    that is not aligned to cache line boundary at all cost."
     467             :  * (Optim Ref Manual Assembly/Compiler Coding Rule 15.)
     468             :  */
     469             : struct stack_canary {
     470             :         char __pad[20];         /* canary at %gs:20 */
     471             :         unsigned long canary;
     472             : };
     473             : DECLARE_PER_CPU_ALIGNED(struct stack_canary, stack_canary);
     474             : #endif
     475             : DECLARE_PER_CPU(struct irq_stack *, hardirq_stack_ptr);
     476             : DECLARE_PER_CPU(struct irq_stack *, softirq_stack_ptr);
     477             : #endif  /* !X86_64 */
     478             : 
     479             : extern unsigned int fpu_kernel_xstate_size;
     480             : extern unsigned int fpu_user_xstate_size;
     481             : 
     482             : struct perf_event;
     483             : 
     484             : struct thread_struct {
     485             :         /* Cached TLS descriptors: */
     486             :         struct desc_struct      tls_array[GDT_ENTRY_TLS_ENTRIES];
     487             : #ifdef CONFIG_X86_32
     488             :         unsigned long           sp0;
     489             : #endif
     490             :         unsigned long           sp;
     491             : #ifdef CONFIG_X86_32
     492             :         unsigned long           sysenter_cs;
     493             : #else
     494             :         unsigned short          es;
     495             :         unsigned short          ds;
     496             :         unsigned short          fsindex;
     497             :         unsigned short          gsindex;
     498             : #endif
     499             : 
     500             : #ifdef CONFIG_X86_64
     501             :         unsigned long           fsbase;
     502             :         unsigned long           gsbase;
     503             : #else
     504             :         /*
     505             :          * XXX: this could presumably be unsigned short.  Alternatively,
     506             :          * 32-bit kernels could be taught to use fsindex instead.
     507             :          */
     508             :         unsigned long fs;
     509             :         unsigned long gs;
     510             : #endif
     511             : 
     512             :         /* Save middle states of ptrace breakpoints */
     513             :         struct perf_event       *ptrace_bps[HBP_NUM];
     514             :         /* Debug status used for traps, single steps, etc... */
     515             :         unsigned long           virtual_dr6;
     516             :         /* Keep track of the exact dr7 value set by the user */
     517             :         unsigned long           ptrace_dr7;
     518             :         /* Fault info: */
     519             :         unsigned long           cr2;
     520             :         unsigned long           trap_nr;
     521             :         unsigned long           error_code;
     522             : #ifdef CONFIG_VM86
     523             :         /* Virtual 86 mode info */
     524             :         struct vm86             *vm86;
     525             : #endif
     526             :         /* IO permissions: */
     527             :         struct io_bitmap        *io_bitmap;
     528             : 
     529             :         /*
     530             :          * IOPL. Priviledge level dependent I/O permission which is
     531             :          * emulated via the I/O bitmap to prevent user space from disabling
     532             :          * interrupts.
     533             :          */
     534             :         unsigned long           iopl_emul;
     535             : 
     536             :         unsigned int            sig_on_uaccess_err:1;
     537             : 
     538             :         /* Floating point and extended processor state */
     539             :         struct fpu              fpu;
     540             :         /*
     541             :          * WARNING: 'fpu' is dynamically-sized.  It *MUST* be at
     542             :          * the end.
     543             :          */
     544             : };
     545             : 
     546             : /* Whitelist the FPU state from the task_struct for hardened usercopy. */
     547           1 : static inline void arch_thread_struct_whitelist(unsigned long *offset,
     548             :                                                 unsigned long *size)
     549             : {
     550           1 :         *offset = offsetof(struct thread_struct, fpu.state);
     551           1 :         *size = fpu_kernel_xstate_size;
     552             : }
     553             : 
     554             : /*
     555             :  * Thread-synchronous status.
     556             :  *
     557             :  * This is different from the flags in that nobody else
     558             :  * ever touches our thread-synchronous status, so we don't
     559             :  * have to worry about atomic accesses.
     560             :  */
     561             : #define TS_COMPAT               0x0002  /* 32bit syscall active (64BIT)*/
     562             : 
     563             : static inline void
     564           4 : native_load_sp0(unsigned long sp0)
     565             : {
     566           8 :         this_cpu_write(cpu_tss_rw.x86_tss.sp0, sp0);
     567             : }
     568             : 
     569      218955 : static __always_inline void native_swapgs(void)
     570             : {
     571             : #ifdef CONFIG_X86_64
     572      218955 :         asm volatile("swapgs" ::: "memory");
     573             : #endif
     574      109479 : }
     575             : 
     576             : static inline unsigned long current_top_of_stack(void)
     577             : {
     578             :         /*
     579             :          *  We can't read directly from tss.sp0: sp0 on x86_32 is special in
     580             :          *  and around vm86 mode and sp0 on x86_64 is special because of the
     581             :          *  entry trampoline.
     582             :          */
     583             :         return this_cpu_read_stable(cpu_current_top_of_stack);
     584             : }
     585             : 
     586             : static inline bool on_thread_stack(void)
     587             : {
     588             :         return (unsigned long)(current_top_of_stack() -
     589             :                                current_stack_pointer) < THREAD_SIZE;
     590             : }
     591             : 
     592             : #ifdef CONFIG_PARAVIRT_XXL
     593             : #include <asm/paravirt.h>
     594             : #else
     595             : #define __cpuid                 native_cpuid
     596             : 
     597           4 : static inline void load_sp0(unsigned long sp0)
     598             : {
     599           4 :         native_load_sp0(sp0);
     600           0 : }
     601             : 
     602             : #endif /* CONFIG_PARAVIRT_XXL */
     603             : 
     604             : /* Free all resources held by a thread. */
     605             : extern void release_thread(struct task_struct *);
     606             : 
     607             : unsigned long get_wchan(struct task_struct *p);
     608             : 
     609             : /*
     610             :  * Generic CPUID function
     611             :  * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
     612             :  * resulting in stale register contents being returned.
     613             :  */
     614         186 : static inline void cpuid(unsigned int op,
     615             :                          unsigned int *eax, unsigned int *ebx,
     616             :                          unsigned int *ecx, unsigned int *edx)
     617             : {
     618         186 :         *eax = op;
     619         129 :         *ecx = 0;
     620         265 :         __cpuid(eax, ebx, ecx, edx);
     621             : }
     622             : 
     623             : /* Some CPUID calls want 'count' to be placed in ecx */
     624         114 : static inline void cpuid_count(unsigned int op, int count,
     625             :                                unsigned int *eax, unsigned int *ebx,
     626             :                                unsigned int *ecx, unsigned int *edx)
     627             : {
     628         114 :         *eax = op;
     629         105 :         *ecx = count;
     630         108 :         __cpuid(eax, ebx, ecx, edx);
     631          32 : }
     632             : 
     633             : /*
     634             :  * CPUID functions returning a single datum
     635             :  */
     636         121 : static inline unsigned int cpuid_eax(unsigned int op)
     637             : {
     638         121 :         unsigned int eax, ebx, ecx, edx;
     639             : 
     640         121 :         cpuid(op, &eax, &ebx, &ecx, &edx);
     641             : 
     642         119 :         return eax;
     643             : }
     644             : 
     645           4 : static inline unsigned int cpuid_ebx(unsigned int op)
     646             : {
     647           4 :         unsigned int eax, ebx, ecx, edx;
     648             : 
     649           4 :         cpuid(op, &eax, &ebx, &ecx, &edx);
     650             : 
     651           4 :         return ebx;
     652             : }
     653             : 
     654           0 : static inline unsigned int cpuid_ecx(unsigned int op)
     655             : {
     656           0 :         unsigned int eax, ebx, ecx, edx;
     657             : 
     658           0 :         cpuid(op, &eax, &ebx, &ecx, &edx);
     659             : 
     660           0 :         return ecx;
     661             : }
     662             : 
     663           4 : static inline unsigned int cpuid_edx(unsigned int op)
     664             : {
     665           4 :         unsigned int eax, ebx, ecx, edx;
     666             : 
     667           4 :         cpuid(op, &eax, &ebx, &ecx, &edx);
     668             : 
     669           4 :         return edx;
     670             : }
     671             : 
     672             : extern void select_idle_routine(const struct cpuinfo_x86 *c);
     673             : extern void amd_e400_c1e_apic_setup(void);
     674             : 
     675             : extern unsigned long            boot_option_idle_override;
     676             : 
     677             : enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT,
     678             :                          IDLE_POLL};
     679             : 
     680             : extern void enable_sep_cpu(void);
     681             : extern int sysenter_setup(void);
     682             : 
     683             : 
     684             : /* Defined in head.S */
     685             : extern struct desc_ptr          early_gdt_descr;
     686             : 
     687             : extern void switch_to_new_gdt(int);
     688             : extern void load_direct_gdt(int);
     689             : extern void load_fixmap_gdt(int);
     690             : extern void load_percpu_segment(int);
     691             : extern void cpu_init(void);
     692             : extern void cpu_init_exception_handling(void);
     693             : extern void cr4_init(void);
     694             : 
     695           0 : static inline unsigned long get_debugctlmsr(void)
     696             : {
     697           0 :         unsigned long debugctlmsr = 0;
     698             : 
     699             : #ifndef CONFIG_X86_DEBUGCTLMSR
     700             :         if (boot_cpu_data.x86 < 6)
     701             :                 return 0;
     702             : #endif
     703           0 :         rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
     704             : 
     705           0 :         return debugctlmsr;
     706             : }
     707             : 
     708           0 : static inline void update_debugctlmsr(unsigned long debugctlmsr)
     709             : {
     710             : #ifndef CONFIG_X86_DEBUGCTLMSR
     711             :         if (boot_cpu_data.x86 < 6)
     712             :                 return;
     713             : #endif
     714           0 :         wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
     715           0 : }
     716             : 
     717             : extern void set_task_blockstep(struct task_struct *task, bool on);
     718             : 
     719             : /* Boot loader type from the setup header: */
     720             : extern int                      bootloader_type;
     721             : extern int                      bootloader_version;
     722             : 
     723             : extern char                     ignore_fpu_irq;
     724             : 
     725             : #define HAVE_ARCH_PICK_MMAP_LAYOUT 1
     726             : #define ARCH_HAS_PREFETCHW
     727             : #define ARCH_HAS_SPINLOCK_PREFETCH
     728             : 
     729             : #ifdef CONFIG_X86_32
     730             : # define BASE_PREFETCH          ""
     731             : # define ARCH_HAS_PREFETCH
     732             : #else
     733             : # define BASE_PREFETCH          "prefetcht0 %P1"
     734             : #endif
     735             : 
     736             : /*
     737             :  * Prefetch instructions for Pentium III (+) and AMD Athlon (+)
     738             :  *
     739             :  * It's not worth to care about 3dnow prefetches for the K6
     740             :  * because they are microcoded there and very slow.
     741             :  */
     742             : static inline void prefetch(const void *x)
     743             : {
     744             :         alternative_input(BASE_PREFETCH, "prefetchnta %P1",
     745             :                           X86_FEATURE_XMM,
     746             :                           "m" (*(const char *)x));
     747             : }
     748             : 
     749             : /*
     750             :  * 3dnow prefetch to get an exclusive cache line.
     751             :  * Useful for spinlocks to avoid one state transition in the
     752             :  * cache coherency protocol:
     753             :  */
     754      541161 : static __always_inline void prefetchw(const void *x)
     755             : {
     756      541161 :         alternative_input(BASE_PREFETCH, "prefetchw %P1",
     757             :                           X86_FEATURE_3DNOWPREFETCH,
     758             :                           "m" (*(const char *)x));
     759       21072 : }
     760             : 
     761       11283 : static inline void spin_lock_prefetch(const void *x)
     762             : {
     763       11283 :         prefetchw(x);
     764             : }
     765             : 
     766             : #define TOP_OF_INIT_STACK ((unsigned long)&init_stack + sizeof(init_stack) - \
     767             :                            TOP_OF_KERNEL_STACK_PADDING)
     768             : 
     769             : #define task_top_of_stack(task) ((unsigned long)(task_pt_regs(task) + 1))
     770             : 
     771             : #define task_pt_regs(task) \
     772             : ({                                                                      \
     773             :         unsigned long __ptr = (unsigned long)task_stack_page(task);     \
     774             :         __ptr += THREAD_SIZE - TOP_OF_KERNEL_STACK_PADDING;             \
     775             :         ((struct pt_regs *)__ptr) - 1;                                  \
     776             : })
     777             : 
     778             : #ifdef CONFIG_X86_32
     779             : #define INIT_THREAD  {                                                    \
     780             :         .sp0                    = TOP_OF_INIT_STACK,                      \
     781             :         .sysenter_cs            = __KERNEL_CS,                            \
     782             : }
     783             : 
     784             : #define KSTK_ESP(task)          (task_pt_regs(task)->sp)
     785             : 
     786             : #else
     787             : #define INIT_THREAD { }
     788             : 
     789             : extern unsigned long KSTK_ESP(struct task_struct *task);
     790             : 
     791             : #endif /* CONFIG_X86_64 */
     792             : 
     793             : extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
     794             :                                                unsigned long new_sp);
     795             : 
     796             : /*
     797             :  * This decides where the kernel will search for a free chunk of vm
     798             :  * space during mmap's.
     799             :  */
     800             : #define __TASK_UNMAPPED_BASE(task_size) (PAGE_ALIGN(task_size / 3))
     801             : #define TASK_UNMAPPED_BASE              __TASK_UNMAPPED_BASE(TASK_SIZE_LOW)
     802             : 
     803             : #define KSTK_EIP(task)          (task_pt_regs(task)->ip)
     804             : 
     805             : /* Get/set a process' ability to use the timestamp counter instruction */
     806             : #define GET_TSC_CTL(adr)        get_tsc_mode((adr))
     807             : #define SET_TSC_CTL(val)        set_tsc_mode((val))
     808             : 
     809             : extern int get_tsc_mode(unsigned long adr);
     810             : extern int set_tsc_mode(unsigned int val);
     811             : 
     812             : DECLARE_PER_CPU(u64, msr_misc_features_shadow);
     813             : 
     814             : #ifdef CONFIG_CPU_SUP_AMD
     815             : extern u32 amd_get_nodes_per_socket(void);
     816             : #else
     817             : static inline u32 amd_get_nodes_per_socket(void)        { return 0; }
     818             : #endif
     819             : 
     820           1 : static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves)
     821             : {
     822           1 :         uint32_t base, eax, signature[3];
     823             : 
     824           1 :         for (base = 0x40000000; base < 0x40010000; base += 0x100) {
     825           1 :                 cpuid(base, &eax, &signature[0], &signature[1], &signature[2]);
     826             : 
     827           1 :                 if (!memcmp(sig, signature, 12) &&
     828           0 :                     (leaves == 0 || ((eax - base) >= leaves)))
     829           1 :                         return base;
     830             :         }
     831             : 
     832             :         return 0;
     833             : }
     834             : 
     835             : extern unsigned long arch_align_stack(unsigned long sp);
     836             : void free_init_pages(const char *what, unsigned long begin, unsigned long end);
     837             : extern void free_kernel_image_pages(const char *what, void *begin, void *end);
     838             : 
     839             : void default_idle(void);
     840             : #ifdef  CONFIG_XEN
     841             : bool xen_set_default_idle(void);
     842             : #else
     843             : #define xen_set_default_idle 0
     844             : #endif
     845             : 
     846             : void stop_this_cpu(void *dummy);
     847             : void microcode_check(void);
     848             : 
     849             : enum l1tf_mitigations {
     850             :         L1TF_MITIGATION_OFF,
     851             :         L1TF_MITIGATION_FLUSH_NOWARN,
     852             :         L1TF_MITIGATION_FLUSH,
     853             :         L1TF_MITIGATION_FLUSH_NOSMT,
     854             :         L1TF_MITIGATION_FULL,
     855             :         L1TF_MITIGATION_FULL_FORCE
     856             : };
     857             : 
     858             : extern enum l1tf_mitigations l1tf_mitigation;
     859             : 
     860             : enum mds_mitigations {
     861             :         MDS_MITIGATION_OFF,
     862             :         MDS_MITIGATION_FULL,
     863             :         MDS_MITIGATION_VMWERV,
     864             : };
     865             : 
     866             : #endif /* _ASM_X86_PROCESSOR_H */

Generated by: LCOV version 1.14