/usr/src/linux-headers-5.15.0-190/arch/x86/include/asm
NameSizeModeActions
e820/-0755rm
fpu/-0755rm
numachip/-0755rm
trace/-0755rm
uv/-0755rm
vdso/-0755rm
xen/-0755rm
acenv.h14500644editdlrm
acpi.h48040644editdlrm
acrn.h18340644editdlrm
agp.h10730644editdlrm
alternative.h135740644editdlrm
amd-ibs.h42470644editdlrm
amd_nb.h31360644editdlrm
apic.h136460644editdlrm
apicdef.h115630644editdlrm
apm.h18420644editdlrm
archrandom.h23470644editdlrm
arch_hweight.h10830644editdlrm
asm-offsets.h350644editdlrm
asm-prototypes.h4310644editdlrm
asm.h60600644editdlrm
atomic.h67660644editdlrm
atomic64_32.h83670644editdlrm
atomic64_64.h64100644editdlrm
audit.h1700644editdlrm
barrier.h23680644editdlrm
bios_ebda.h9140644editdlrm
bitops.h101490644editdlrm
boot.h23970644editdlrm
bootparam_utils.h28660644editdlrm
bug.h23920644editdlrm
bugs.h3440644editdlrm
cache.h6220644editdlrm
cacheflush.h3290644editdlrm
cacheinfo.h2630644editdlrm
ce4100.h1210644editdlrm
checksum.h2400644editdlrm
checksum_32.h46820644editdlrm
checksum_64.h51640644editdlrm
clocksource.h4800644editdlrm
cmdline.h3020644editdlrm
cmpxchg.h79370644editdlrm
cmpxchg_32.h32430644editdlrm
cmpxchg_64.h5610644editdlrm
compat.h41020644editdlrm
cpu.h20990644editdlrm
cpufeature.h84280644editdlrm
cpufeatures.h333830644editdlrm
cpuidle_haltpoll.h1890644editdlrm
cpumask.h8290644editdlrm
cpu_device_id.h109450644editdlrm
cpu_entry_area.h41960644editdlrm
crash.h3000644editdlrm
current.h4430644editdlrm
debugreg.h36410644editdlrm
delay.h2750644editdlrm
desc.h115240644editdlrm
desc_defs.h33960644editdlrm
device.h1760644editdlrm
disabled-features.h31730644editdlrm
div64.h23350644editdlrm
dma-mapping.h5190644editdlrm
dma.h98110644editdlrm
dmi.h5560644editdlrm
doublefault.h2710644editdlrm
dwarf2.h13250644editdlrm
edac.h4740644editdlrm
efi.h123080644editdlrm
elf.h126230644editdlrm
elfcore-compat.h8900644editdlrm
emergency-restart.h2020644editdlrm
emulate_prefix.h4840644editdlrm
enclu.h1810644editdlrm
entry-common.h33220644editdlrm
espfix.h4260644editdlrm
exec.h370644editdlrm
extable.h18710644editdlrm
extable_fixup_types.h18750644editdlrm
fb.h5400644editdlrm
fixmap.h60940644editdlrm
floppy.h68600644editdlrm
frame.h25550644editdlrm
fsgsbase.h20720644editdlrm
ftrace.h32340644editdlrm
futex.h25530644editdlrm
gart.h27040644editdlrm
GEN-for-each-reg.h3450644editdlrm
genapic.h220644editdlrm
geode.h6930644editdlrm
hardirq.h23420644editdlrm
highmem.h24660644editdlrm
hpet.h30020644editdlrm
hugetlb.h2430644editdlrm
hw_breakpoint.h21120644editdlrm
hw_irq.h30700644editdlrm
hyperv-tlfs.h175550644editdlrm
hypervisor.h23600644editdlrm
i8259.h20610644editdlrm
ia32.h17910644editdlrm
ia32_unistd.h3130644editdlrm
idtentry.h241970644editdlrm
imr.h16840644editdlrm
inat.h60920644editdlrm
inat_types.h3410644editdlrm
init.h6320644editdlrm
insn-eval.h13790644editdlrm
insn.h78670644editdlrm
inst.h20660644editdlrm
intel-family.h57750644editdlrm
intel-mid.h11320644editdlrm
intel_ds.h8490644editdlrm
intel_pconfig.h15450644editdlrm
intel_pt.h12350644editdlrm
intel_punit_ipc.h46660644editdlrm
intel_scu_ipc.h22340644editdlrm
intel_telemetry.h37230644editdlrm
invpcid.h14870644editdlrm
io.h126900644editdlrm
iomap.h5360644editdlrm
iommu.h7800644editdlrm
iommu_table.h39100644editdlrm
iosf_mbi.h73840644editdlrm
io_apic.h52040644editdlrm
io_bitmap.h13700644editdlrm
irq.h12800644editdlrm
irqdomain.h19150644editdlrm
irqflags.h29760644editdlrm
irq_remapping.h20610644editdlrm
irq_stack.h75360644editdlrm
irq_vectors.h42960644editdlrm
irq_work.h3580644editdlrm
ist.h2940644editdlrm
jailhouse_para.h4490644editdlrm
jump_label.h14060644editdlrm
kasan.h12910644editdlrm
kaslr.h3980644editdlrm
kbdleds.h4540644editdlrm
Kbuild3000644editdlrm
kdebug.h10870644editdlrm
kexec-bzimage64.h1950644editdlrm
kexec.h60110644editdlrm
kfence.h21400644editdlrm
kgdb.h21430644editdlrm
kprobes.h34630644editdlrm
kvm-x86-ops.h39210644editdlrm
kvmclock.h5060644editdlrm
kvm_host.h600660644editdlrm
kvm_page_track.h25040644editdlrm
kvm_para.h34670644editdlrm
kvm_types.h1780644editdlrm
kvm_vcpu_regs.h6060644editdlrm
linkage.h11390644editdlrm
livepatch.h4720644editdlrm
local.h39250644editdlrm
mach_timer.h15900644editdlrm
mach_traps.h10130644editdlrm
math_emu.h3950644editdlrm
mc146818rtc.h28350644editdlrm
mce.h131250644editdlrm
memtype.h8990644editdlrm
mem_encrypt.h34270644editdlrm
microcode.h38650644editdlrm
microcode_amd.h15730644editdlrm
microcode_intel.h25210644editdlrm
misc.h1430644editdlrm
mmconfig.h3740644editdlrm
mmu.h17400644editdlrm
mmu_context.h60740644editdlrm
mmx.h3370644editdlrm
mmzone.h1290644editdlrm
mmzone_32.h3430644editdlrm
mmzone_64.h4300644editdlrm
module.h3240644editdlrm
mpspec.h36520644editdlrm
mpspec_def.h42560644editdlrm
mshyperv.h56040644editdlrm
msi.h15490644editdlrm
msr-index.h402300644editdlrm
msr-trace.h13870644editdlrm
msr.h110610644editdlrm
mtrr.h47530644editdlrm
mwait.h44570644editdlrm
nmi.h14440644editdlrm
nops.h19050644editdlrm
nospec-branch.h130730644editdlrm
numa.h21930644editdlrm
numa_32.h2560644editdlrm
olpc.h23820644editdlrm
olpc_ofw.h11280644editdlrm
orc_lookup.h10650644editdlrm
orc_types.h20250644editdlrm
page.h25100644editdlrm
page_32.h10430644editdlrm
page_32_types.h23990644editdlrm
page_64.h27370644editdlrm
page_64_types.h31390644editdlrm
page_types.h22620644editdlrm
paravirt.h188130644editdlrm
paravirt_types.h196710644editdlrm
parport.h3140644editdlrm
pc-conf-reg.h7230644editdlrm
pci-direct.h8500644editdlrm
pci-functions.h6540644editdlrm
pci.h31910644editdlrm
pci_x86.h64770644editdlrm
percpu.h169920644editdlrm
perf_event.h160790644editdlrm
perf_event_p4.h267310644editdlrm
pgalloc.h53060644editdlrm
pgtable-2level.h28150644editdlrm
pgtable-2level_types.h9210644editdlrm
pgtable-3level.h89630644editdlrm
pgtable-3level_types.h10300644editdlrm
pgtable-invert.h10910644editdlrm
pgtable.h334640644editdlrm
pgtable_32.h23460644editdlrm
pgtable_32_areas.h15820644editdlrm
pgtable_32_types.h6340644editdlrm
pgtable_64.h72570644editdlrm
pgtable_64_types.h44680644editdlrm
pgtable_areas.h6230644editdlrm
pgtable_types.h175800644editdlrm
pkeys.h35130644editdlrm
pkru.h13460644editdlrm
platform_sst_audio.h31010644editdlrm
pm-trace.h6110644editdlrm
posix_types.h1440644editdlrm
preempt.h40510644editdlrm
probe_roms.h2730644editdlrm
processor-cyrix.h3830644editdlrm
processor-flags.h17500644editdlrm
processor.h224710644editdlrm
prom.h8210644editdlrm
proto.h9520644editdlrm
pti.h3720644editdlrm
ptrace.h104910644editdlrm
purgatory.h2350644editdlrm
pvclock-abi.h15300644editdlrm
pvclock.h27020644editdlrm
qrwlock.h1990644editdlrm
qspinlock.h31320644editdlrm
qspinlock_paravirt.h19080644editdlrm
realmode.h20990644editdlrm
reboot.h9480644editdlrm
reboot_fixups.h1830644editdlrm
required-features.h28390644editdlrm
resctrl.h28470644editdlrm
rmwcc.h22770644editdlrm
seccomp.h12050644editdlrm
sections.h8950644editdlrm
segment.h106130644editdlrm
serial.h11370644editdlrm
setup.h36330644editdlrm
setup_arch.h770644editdlrm
set_memory.h53880644editdlrm
sev-common.h30530644editdlrm
sev.h24430644editdlrm
sgx.h113890644editdlrm
shmparam.h1930644editdlrm
sigcontext.h2610644editdlrm
sigframe.h21410644editdlrm
sighandling.h5260644editdlrm
signal.h24280644editdlrm
simd.h2870644editdlrm
smap.h20380644editdlrm
smp.h50670644editdlrm
softirq_stack.h2160644editdlrm
sparsemem.h11020644editdlrm
spec-ctrl.h28750644editdlrm
special_insns.h71700644editdlrm
spinlock.h12140644editdlrm
spinlock_types.h2530644editdlrm
sta2x11.h3520644editdlrm
stackprotector.h30950644editdlrm
stacktrace.h28500644editdlrm
static_call.h28680644editdlrm
string.h1290644editdlrm
string_32.h61110644editdlrm
string_64.h28520644editdlrm
suspend.h4960644editdlrm
suspend_32.h8760644editdlrm
suspend_64.h18330644editdlrm
svm.h107910644editdlrm
swiotlb.h6450644editdlrm
switch_to.h23300644editdlrm
sync_bitops.h33360644editdlrm
sync_core.h33150644editdlrm
syscall.h43100644editdlrm
syscalls.h3740644editdlrm
syscall_wrapper.h99980644editdlrm
text-patching.h56460644editdlrm
thermal.h4280644editdlrm
thread_info.h79950644editdlrm
time.h3310644editdlrm
timer.h10270644editdlrm
timex.h5460644editdlrm
tlb.h12000644editdlrm
tlbbatch.h3320644editdlrm
tlbflush.h77100644editdlrm
topology.h64820644editdlrm
trace_clock.h4060644editdlrm
trapnr.h13160644editdlrm
traps.h12600644editdlrm
trap_pf.h7090644editdlrm
tsc.h20160644editdlrm
uaccess.h222100644editdlrm
uaccess_32.h10060644editdlrm
uaccess_64.h24400644editdlrm
umip.h3170644editdlrm
unistd.h16300644editdlrm
unwind.h32200644editdlrm
unwind_hints.h14610644editdlrm
uprobes.h10170644editdlrm
user.h22570644editdlrm
user32.h21560644editdlrm
user_32.h50420644editdlrm
user_64.h53390644editdlrm
vdso.h13910644editdlrm
vermagic.h19930644editdlrm
vga.h7400644editdlrm
vgtod.h5180644editdlrm
virtext.h34600644editdlrm
vm86.h21820644editdlrm
vmalloc.h5600644editdlrm
vmware.h19420644editdlrm
vmx.h261410644editdlrm
vmxfeatures.h60490644editdlrm
vsyscall.h9880644editdlrm
vvar.h15910644editdlrm
word-at-a-time.h25960644editdlrm
x86_init.h101760644editdlrm
xor.h101070644editdlrm
xor_32.h143470644editdlrm
xor_64.h7160644editdlrm
xor_avx.h43440644editdlrm
Edit: /usr/src/linux-headers-5.15.0-190/arch/x86/include/asm/processor.h (22471B)
/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_X86_PROCESSOR_H #define _ASM_X86_PROCESSOR_H #include /* Forward declaration, a strange C thing */ struct task_struct; struct mm_struct; struct io_bitmap; struct vm86; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * We handle most unaligned accesses in hardware. On the other hand * unaligned DMA can be quite expensive on some Nehalem processors. * * Based on this we disable the IP header alignment in network drivers. */ #define NET_IP_ALIGN 0 #define HBP_NUM 4 /* * These alignment constraints are for performance in the vSMP case, * but in the task_struct case we must also meet hardware imposed * alignment requirements of the FPU state: */ #ifdef CONFIG_X86_VSMP # define ARCH_MIN_TASKALIGN (1 << INTERNODE_CACHE_SHIFT) # define ARCH_MIN_MMSTRUCT_ALIGN (1 << INTERNODE_CACHE_SHIFT) #else # define ARCH_MIN_TASKALIGN __alignof__(union fpregs_state) # define ARCH_MIN_MMSTRUCT_ALIGN 0 #endif enum tlb_infos { ENTRIES, NR_INFO }; extern u16 __read_mostly tlb_lli_4k[NR_INFO]; extern u16 __read_mostly tlb_lli_2m[NR_INFO]; extern u16 __read_mostly tlb_lli_4m[NR_INFO]; extern u16 __read_mostly tlb_lld_4k[NR_INFO]; extern u16 __read_mostly tlb_lld_2m[NR_INFO]; extern u16 __read_mostly tlb_lld_4m[NR_INFO]; extern u16 __read_mostly tlb_lld_1g[NR_INFO]; /* * CPU type and hardware bug flags. Kept separately for each CPU. * Members of this structure are referenced in head_32.S, so think twice * before touching them. [mj] */ struct cpuinfo_x86 { __u8 x86; /* CPU family */ __u8 x86_vendor; /* CPU vendor */ __u8 x86_model; __u8 x86_stepping; #ifdef CONFIG_X86_64 /* Number of 4K pages in DTLB/ITLB combined(in pages): */ int x86_tlbsize; #endif #ifdef CONFIG_X86_VMX_FEATURE_NAMES __u32 vmx_capability[NVMXINTS]; #endif __u8 x86_virt_bits; __u8 x86_phys_bits; /* CPUID returned core id bits: */ __u8 x86_coreid_bits; __u8 cu_id; /* Max extended CPUID function supported: */ __u32 extended_cpuid_level; /* Maximum supported CPUID level, -1=no CPUID: */ int cpuid_level; /* * Align to size of unsigned long because the x86_capability array * is passed to bitops which require the alignment. Use unnamed * union to enforce the array is aligned to size of unsigned long. */ union { __u32 x86_capability[NCAPINTS + NBUGINTS]; unsigned long x86_capability_alignment; }; char x86_vendor_id[16]; char x86_model_id[64]; /* in KB - valid for CPUS which support this call: */ unsigned int x86_cache_size; int x86_cache_alignment; /* In bytes */ /* Cache QoS architectural values, valid only on the BSP: */ int x86_cache_max_rmid; /* max index */ int x86_cache_occ_scale; /* scale to bytes */ int x86_cache_mbm_width_offset; int x86_power; unsigned long loops_per_jiffy; /* cpuid returned max cores value: */ u16 x86_max_cores; u16 apicid; u16 initial_apicid; u16 x86_clflush_size; /* number of cores as seen by the OS: */ u16 booted_cores; /* Physical processor id: */ u16 phys_proc_id; /* Logical processor id: */ u16 logical_proc_id; /* Core id: */ u16 cpu_core_id; u16 cpu_die_id; u16 logical_die_id; /* Index into per_cpu list: */ u16 cpu_index; /* Is SMT active on this core? */ bool smt_active; u32 microcode; /* Address space bits used by the cache internally */ u8 x86_cache_bits; unsigned initialized : 1; } __randomize_layout; struct cpuid_regs { u32 eax, ebx, ecx, edx; }; enum cpuid_regs_idx { CPUID_EAX = 0, CPUID_EBX, CPUID_ECX, CPUID_EDX, }; #define X86_VENDOR_INTEL 0 #define X86_VENDOR_CYRIX 1 #define X86_VENDOR_AMD 2 #define X86_VENDOR_UMC 3 #define X86_VENDOR_CENTAUR 5 #define X86_VENDOR_TRANSMETA 7 #define X86_VENDOR_NSC 8 #define X86_VENDOR_HYGON 9 #define X86_VENDOR_ZHAOXIN 10 #define X86_VENDOR_NUM 11 #define X86_VENDOR_UNKNOWN 0xff /* * capabilities of CPUs */ extern struct cpuinfo_x86 boot_cpu_data; extern struct cpuinfo_x86 new_cpu_data; extern __u32 cpu_caps_cleared[NCAPINTS + NBUGINTS]; extern __u32 cpu_caps_set[NCAPINTS + NBUGINTS]; #ifdef CONFIG_SMP DECLARE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info); #define cpu_data(cpu) per_cpu(cpu_info, cpu) #else #define cpu_info boot_cpu_data #define cpu_data(cpu) boot_cpu_data #endif extern const struct seq_operations cpuinfo_op; #define cache_line_size() (boot_cpu_data.x86_cache_alignment) extern void cpu_detect(struct cpuinfo_x86 *c); static inline unsigned long long l1tf_pfn_limit(void) { return BIT_ULL(boot_cpu_data.x86_cache_bits - 1 - PAGE_SHIFT); } void init_cpu_devs(void); void get_cpu_vendor(struct cpuinfo_x86 *c); extern void early_cpu_init(void); extern void identify_boot_cpu(void); extern void identify_secondary_cpu(struct cpuinfo_x86 *); extern void print_cpu_info(struct cpuinfo_x86 *); void print_cpu_msr(struct cpuinfo_x86 *); #ifdef CONFIG_X86_32 extern int have_cpuid_p(void); #else static inline int have_cpuid_p(void) { return 1; } #endif static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { /* ecx is often an input as well as an output. */ asm volatile("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (*eax), "2" (*ecx) : "memory"); } #define native_cpuid_reg(reg) \ static inline unsigned int native_cpuid_##reg(unsigned int op) \ { \ unsigned int eax = op, ebx, ecx = 0, edx; \ \ native_cpuid(&eax, &ebx, &ecx, &edx); \ \ return reg; \ } /* * Native CPUID functions returning a single datum. */ native_cpuid_reg(eax) native_cpuid_reg(ebx) native_cpuid_reg(ecx) native_cpuid_reg(edx) /* * Friendlier CR3 helpers. */ static inline unsigned long read_cr3_pa(void) { return __read_cr3() & CR3_ADDR_MASK; } static inline unsigned long native_read_cr3_pa(void) { return __native_read_cr3() & CR3_ADDR_MASK; } static inline void load_cr3(pgd_t *pgdir) { write_cr3(__sme_pa(pgdir)); } /* * Note that while the legacy 'TSS' name comes from 'Task State Segment', * on modern x86 CPUs the TSS also holds information important to 64-bit mode, * unrelated to the task-switch mechanism: */ #ifdef CONFIG_X86_32 /* This is the TSS defined by the hardware. */ struct x86_hw_tss { unsigned short back_link, __blh; unsigned long sp0; unsigned short ss0, __ss0h; unsigned long sp1; /* * We don't use ring 1, so ss1 is a convenient scratch space in * the same cacheline as sp0. We use ss1 to cache the value in * MSR_IA32_SYSENTER_CS. When we context switch * MSR_IA32_SYSENTER_CS, we first check if the new value being * written matches ss1, and, if it's not, then we wrmsr the new * value and update ss1. * * The only reason we context switch MSR_IA32_SYSENTER_CS is * that we set it to zero in vm86 tasks to avoid corrupting the * stack if we were to go through the sysenter path from vm86 * mode. */ unsigned short ss1; /* MSR_IA32_SYSENTER_CS */ unsigned short __ss1h; unsigned long sp2; unsigned short ss2, __ss2h; unsigned long __cr3; unsigned long ip; unsigned long flags; unsigned long ax; unsigned long cx; unsigned long dx; unsigned long bx; unsigned long sp; unsigned long bp; unsigned long si; unsigned long di; unsigned short es, __esh; unsigned short cs, __csh; unsigned short ss, __ssh; unsigned short ds, __dsh; unsigned short fs, __fsh; unsigned short gs, __gsh; unsigned short ldt, __ldth; unsigned short trace; unsigned short io_bitmap_base; } __attribute__((packed)); #else struct x86_hw_tss { u32 reserved1; u64 sp0; u64 sp1; /* * Since Linux does not use ring 2, the 'sp2' slot is unused by * hardware. entry_SYSCALL_64 uses it as scratch space to stash * the user RSP value. */ u64 sp2; u64 reserved2; u64 ist[7]; u32 reserved3; u32 reserved4; u16 reserved5; u16 io_bitmap_base; } __attribute__((packed)); #endif /* * IO-bitmap sizes: */ #define IO_BITMAP_BITS 65536 #define IO_BITMAP_BYTES (IO_BITMAP_BITS / BITS_PER_BYTE) #define IO_BITMAP_LONGS (IO_BITMAP_BYTES / sizeof(long)) #define IO_BITMAP_OFFSET_VALID_MAP \ (offsetof(struct tss_struct, io_bitmap.bitmap) - \ offsetof(struct tss_struct, x86_tss)) #define IO_BITMAP_OFFSET_VALID_ALL \ (offsetof(struct tss_struct, io_bitmap.mapall) - \ offsetof(struct tss_struct, x86_tss)) #ifdef CONFIG_X86_IOPL_IOPERM /* * sizeof(unsigned long) coming from an extra "long" at the end of the * iobitmap. The limit is inclusive, i.e. the last valid byte. */ # define __KERNEL_TSS_LIMIT \ (IO_BITMAP_OFFSET_VALID_ALL + IO_BITMAP_BYTES + \ sizeof(unsigned long) - 1) #else # define __KERNEL_TSS_LIMIT \ (offsetof(struct tss_struct, x86_tss) + sizeof(struct x86_hw_tss) - 1) #endif /* Base offset outside of TSS_LIMIT so unpriviledged IO causes #GP */ #define IO_BITMAP_OFFSET_INVALID (__KERNEL_TSS_LIMIT + 1) struct entry_stack { char stack[PAGE_SIZE]; }; struct entry_stack_page { struct entry_stack stack; } __aligned(PAGE_SIZE); /* * All IO bitmap related data stored in the TSS: */ struct x86_io_bitmap { /* The sequence number of the last active bitmap. */ u64 prev_sequence; /* * Store the dirty size of the last io bitmap offender. The next * one will have to do the cleanup as the switch out to a non io * bitmap user will just set x86_tss.io_bitmap_base to a value * outside of the TSS limit. So for sane tasks there is no need to * actually touch the io_bitmap at all. */ unsigned int prev_max; /* * The extra 1 is there because the CPU will access an * additional byte beyond the end of the IO permission * bitmap. The extra byte must be all 1 bits, and must * be within the limit. */ unsigned long bitmap[IO_BITMAP_LONGS + 1]; /* * Special I/O bitmap to emulate IOPL(3). All bytes zero, * except the additional byte at the end. */ unsigned long mapall[IO_BITMAP_LONGS + 1]; }; struct tss_struct { /* * The fixed hardware portion. This must not cross a page boundary * at risk of violating the SDM's advice and potentially triggering * errata. */ struct x86_hw_tss x86_tss; struct x86_io_bitmap io_bitmap; } __aligned(PAGE_SIZE); DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw); /* Per CPU interrupt stacks */ struct irq_stack { char stack[IRQ_STACK_SIZE]; } __aligned(IRQ_STACK_SIZE); DECLARE_PER_CPU(unsigned long, cpu_current_top_of_stack); #ifdef CONFIG_X86_64 struct fixed_percpu_data { /* * GCC hardcodes the stack canary as %gs:40. Since the * irq_stack is the object at %gs:0, we reserve the bottom * 48 bytes of the irq stack for the canary. * * Once we are willing to require -mstack-protector-guard-symbol= * support for x86_64 stackprotector, we can get rid of this. */ char gs_base[40]; unsigned long stack_canary; }; DECLARE_PER_CPU_FIRST(struct fixed_percpu_data, fixed_percpu_data) __visible; DECLARE_INIT_PER_CPU(fixed_percpu_data); static inline unsigned long cpu_kernelmode_gs_base(int cpu) { return (unsigned long)per_cpu(fixed_percpu_data.gs_base, cpu); } DECLARE_PER_CPU(void *, hardirq_stack_ptr); DECLARE_PER_CPU(bool, hardirq_stack_inuse); extern asmlinkage void ignore_sysret(void); /* Save actual FS/GS selectors and bases to current->thread */ void current_save_fsgs(void); #else /* X86_64 */ #ifdef CONFIG_STACKPROTECTOR DECLARE_PER_CPU(unsigned long, __stack_chk_guard); #endif DECLARE_PER_CPU(struct irq_stack *, hardirq_stack_ptr); DECLARE_PER_CPU(struct irq_stack *, softirq_stack_ptr); #endif /* !X86_64 */ struct perf_event; struct thread_struct { /* Cached TLS descriptors: */ struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES]; #ifdef CONFIG_X86_32 unsigned long sp0; #endif unsigned long sp; #ifdef CONFIG_X86_32 unsigned long sysenter_cs; #else unsigned short es; unsigned short ds; unsigned short fsindex; unsigned short gsindex; #endif #ifdef CONFIG_X86_64 unsigned long fsbase; unsigned long gsbase; #else /* * XXX: this could presumably be unsigned short. Alternatively, * 32-bit kernels could be taught to use fsindex instead. */ unsigned long fs; unsigned long gs; #endif /* Save middle states of ptrace breakpoints */ struct perf_event *ptrace_bps[HBP_NUM]; /* Debug status used for traps, single steps, etc... */ unsigned long virtual_dr6; /* Keep track of the exact dr7 value set by the user */ unsigned long ptrace_dr7; /* Fault info: */ unsigned long cr2; unsigned long trap_nr; unsigned long error_code; #ifdef CONFIG_VM86 /* Virtual 86 mode info */ struct vm86 *vm86; #endif /* IO permissions: */ struct io_bitmap *io_bitmap; /* * IOPL. Privilege level dependent I/O permission which is * emulated via the I/O bitmap to prevent user space from disabling * interrupts. */ unsigned long iopl_emul; unsigned int iopl_warn:1; /* * Protection Keys Register for Userspace. Loaded immediately on * context switch. Store it in thread_struct to avoid a lookup in * the tasks's FPU xstate buffer. This value is only valid when a * task is scheduled out. For 'current' the authoritative source of * PKRU is the hardware itself. */ u32 pkru; /* Floating point and extended processor state */ struct fpu fpu; /* * WARNING: 'fpu' is dynamically-sized. It *MUST* be at * the end. */ }; extern void fpu_thread_struct_whitelist(unsigned long *offset, unsigned long *size); static inline void arch_thread_struct_whitelist(unsigned long *offset, unsigned long *size) { fpu_thread_struct_whitelist(offset, size); } static inline void native_load_sp0(unsigned long sp0) { this_cpu_write(cpu_tss_rw.x86_tss.sp0, sp0); } static __always_inline void native_swapgs(void) { #ifdef CONFIG_X86_64 asm volatile("swapgs" ::: "memory"); #endif } static inline unsigned long current_top_of_stack(void) { /* * We can't read directly from tss.sp0: sp0 on x86_32 is special in * and around vm86 mode and sp0 on x86_64 is special because of the * entry trampoline. */ return this_cpu_read_stable(cpu_current_top_of_stack); } static inline bool on_thread_stack(void) { return (unsigned long)(current_top_of_stack() - current_stack_pointer) < THREAD_SIZE; } #ifdef CONFIG_PARAVIRT_XXL #include #else #define __cpuid native_cpuid static inline void load_sp0(unsigned long sp0) { native_load_sp0(sp0); } #endif /* CONFIG_PARAVIRT_XXL */ /* Free all resources held by a thread. */ extern void release_thread(struct task_struct *); unsigned long __get_wchan(struct task_struct *p); /* * Generic CPUID function * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx * resulting in stale register contents being returned. */ static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { *eax = op; *ecx = 0; __cpuid(eax, ebx, ecx, edx); } /* Some CPUID calls want 'count' to be placed in ecx */ static inline void cpuid_count(unsigned int op, int count, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { *eax = op; *ecx = count; __cpuid(eax, ebx, ecx, edx); } /* * CPUID functions returning a single datum */ static inline unsigned int cpuid_eax(unsigned int op) { unsigned int eax, ebx, ecx, edx; cpuid(op, &eax, &ebx, &ecx, &edx); return eax; } static inline unsigned int cpuid_ebx(unsigned int op) { unsigned int eax, ebx, ecx, edx; cpuid(op, &eax, &ebx, &ecx, &edx); return ebx; } static inline unsigned int cpuid_ecx(unsigned int op) { unsigned int eax, ebx, ecx, edx; cpuid(op, &eax, &ebx, &ecx, &edx); return ecx; } static inline unsigned int cpuid_edx(unsigned int op) { unsigned int eax, ebx, ecx, edx; cpuid(op, &eax, &ebx, &ecx, &edx); return edx; } extern void select_idle_routine(const struct cpuinfo_x86 *c); extern void amd_e400_c1e_apic_setup(void); extern unsigned long boot_option_idle_override; enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT, IDLE_POLL}; extern void enable_sep_cpu(void); extern int sysenter_setup(void); /* Defined in head.S */ extern struct desc_ptr early_gdt_descr; extern void switch_to_new_gdt(int); extern void load_direct_gdt(int); extern void load_fixmap_gdt(int); extern void load_percpu_segment(int); extern void cpu_init(void); extern void cpu_init_secondary(void); extern void cpu_init_exception_handling(void); extern void cr4_init(void); static inline unsigned long get_debugctlmsr(void) { unsigned long debugctlmsr = 0; #ifndef CONFIG_X86_DEBUGCTLMSR if (boot_cpu_data.x86 < 6) return 0; #endif rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr); return debugctlmsr; } static inline void update_debugctlmsr(unsigned long debugctlmsr) { #ifndef CONFIG_X86_DEBUGCTLMSR if (boot_cpu_data.x86 < 6) return; #endif wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr); } extern void set_task_blockstep(struct task_struct *task, bool on); /* Boot loader type from the setup header: */ extern int bootloader_type; extern int bootloader_version; extern char ignore_fpu_irq; #define HAVE_ARCH_PICK_MMAP_LAYOUT 1 #define ARCH_HAS_PREFETCHW #define ARCH_HAS_SPINLOCK_PREFETCH #ifdef CONFIG_X86_32 # define BASE_PREFETCH "" # define ARCH_HAS_PREFETCH #else # define BASE_PREFETCH "prefetcht0 %P1" #endif /* * Prefetch instructions for Pentium III (+) and AMD Athlon (+) * * It's not worth to care about 3dnow prefetches for the K6 * because they are microcoded there and very slow. */ static inline void prefetch(const void *x) { alternative_input(BASE_PREFETCH, "prefetchnta %P1", X86_FEATURE_XMM, "m" (*(const char *)x)); } /* * 3dnow prefetch to get an exclusive cache line. * Useful for spinlocks to avoid one state transition in the * cache coherency protocol: */ static __always_inline void prefetchw(const void *x) { alternative_input(BASE_PREFETCH, "prefetchw %P1", X86_FEATURE_3DNOWPREFETCH, "m" (*(const char *)x)); } static inline void spin_lock_prefetch(const void *x) { prefetchw(x); } #define TOP_OF_INIT_STACK ((unsigned long)&init_stack + sizeof(init_stack) - \ TOP_OF_KERNEL_STACK_PADDING) #define task_top_of_stack(task) ((unsigned long)(task_pt_regs(task) + 1)) #define task_pt_regs(task) \ ({ \ unsigned long __ptr = (unsigned long)task_stack_page(task); \ __ptr += THREAD_SIZE - TOP_OF_KERNEL_STACK_PADDING; \ ((struct pt_regs *)__ptr) - 1; \ }) #ifdef CONFIG_X86_32 #define INIT_THREAD { \ .sp0 = TOP_OF_INIT_STACK, \ .sysenter_cs = __KERNEL_CS, \ } #define KSTK_ESP(task) (task_pt_regs(task)->sp) #else #define INIT_THREAD { } extern unsigned long KSTK_ESP(struct task_struct *task); #endif /* CONFIG_X86_64 */ extern void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp); /* * This decides where the kernel will search for a free chunk of vm * space during mmap's. */ #define __TASK_UNMAPPED_BASE(task_size) (PAGE_ALIGN(task_size / 3)) #define TASK_UNMAPPED_BASE __TASK_UNMAPPED_BASE(TASK_SIZE_LOW) #define KSTK_EIP(task) (task_pt_regs(task)->ip) /* Get/set a process' ability to use the timestamp counter instruction */ #define GET_TSC_CTL(adr) get_tsc_mode((adr)) #define SET_TSC_CTL(val) set_tsc_mode((val)) extern int get_tsc_mode(unsigned long adr); extern int set_tsc_mode(unsigned int val); DECLARE_PER_CPU(u64, msr_misc_features_shadow); extern u16 get_llc_id(unsigned int cpu); #ifdef CONFIG_CPU_SUP_AMD extern u32 amd_get_nodes_per_socket(void); extern u32 amd_get_highest_perf(void); extern bool cpu_has_ibpb_brtype_microcode(void); extern void amd_clear_divider(void); #else static inline u32 amd_get_nodes_per_socket(void) { return 0; } static inline u32 amd_get_highest_perf(void) { return 0; } static inline bool cpu_has_ibpb_brtype_microcode(void) { return false; } static inline void amd_clear_divider(void) { } #endif static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves) { uint32_t base, eax, signature[3]; for (base = 0x40000000; base < 0x40010000; base += 0x100) { cpuid(base, &eax, &signature[0], &signature[1], &signature[2]); if (!memcmp(sig, signature, 12) && (leaves == 0 || ((eax - base) >= leaves))) return base; } return 0; } extern unsigned long arch_align_stack(unsigned long sp); void free_init_pages(const char *what, unsigned long begin, unsigned long end); extern void free_kernel_image_pages(const char *what, void *begin, void *end); void default_idle(void); #ifdef CONFIG_XEN bool xen_set_default_idle(void); #else #define xen_set_default_idle 0 #endif void __noreturn stop_this_cpu(void *dummy); void microcode_check(struct cpuinfo_x86 *prev_info); void store_cpu_caps(struct cpuinfo_x86 *info); enum l1tf_mitigations { L1TF_MITIGATION_OFF, L1TF_MITIGATION_FLUSH_NOWARN, L1TF_MITIGATION_FLUSH, L1TF_MITIGATION_FLUSH_NOSMT, L1TF_MITIGATION_FULL, L1TF_MITIGATION_FULL_FORCE }; extern enum l1tf_mitigations l1tf_mitigation; enum mds_mitigations { MDS_MITIGATION_OFF, MDS_MITIGATION_FULL, MDS_MITIGATION_VMWERV, }; extern bool gds_ucode_mitigated(void); /* * Make previous memory operations globally visible before * a WRMSR. * * MFENCE makes writes visible, but only affects load/store * instructions. WRMSR is unfortunately not a load/store * instruction and is unaffected by MFENCE. The LFENCE ensures * that the WRMSR is not reordered. * * Most WRMSRs are full serializing instructions themselves and * do not require this barrier. This is only required for the * IA32_TSC_DEADLINE and X2APIC MSRs. */ static inline void weak_wrmsr_fence(void) { alternative("mfence; lfence", "", ALT_NOT(X86_FEATURE_APIC_MSRS_FENCE)); } #endif /* _ASM_X86_PROCESSOR_H */