📄 processor.h
字号:
/* Portions are: Copyright (c) 1994 Linus Torvalds */#ifndef __ASM_X86_PROCESSOR_H#define __ASM_X86_PROCESSOR_H#ifndef __ASSEMBLY__#include <xen/config.h>#include <xen/cache.h>#include <xen/types.h>#include <xen/smp.h>#include <xen/percpu.h>#include <public/xen.h>#include <asm/types.h>#include <asm/cpufeature.h>#include <asm/desc.h>#endif/* * CPU vendor IDs */#define X86_VENDOR_INTEL 0#define X86_VENDOR_CYRIX 1#define X86_VENDOR_AMD 2#define X86_VENDOR_UMC 3#define X86_VENDOR_NEXGEN 4#define X86_VENDOR_CENTAUR 5#define X86_VENDOR_RISE 6#define X86_VENDOR_TRANSMETA 7#define X86_VENDOR_NSC 8#define X86_VENDOR_NUM 9#define X86_VENDOR_UNKNOWN 0xff/* * EFLAGS bits */#define X86_EFLAGS_CF 0x00000001 /* Carry Flag */#define X86_EFLAGS_PF 0x00000004 /* Parity Flag */#define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */#define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */#define X86_EFLAGS_SF 0x00000080 /* Sign Flag */#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */#define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */#define X86_EFLAGS_DF 0x00000400 /* Direction Flag */#define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */#define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */#define X86_EFLAGS_NT 0x00004000 /* Nested Task */#define X86_EFLAGS_RF 0x00010000 /* Resume Flag */#define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */#define X86_EFLAGS_AC 0x00040000 /* Alignment Check */#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */#define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag *//* * Intel CPU flags in CR0 */#define X86_CR0_PE 0x00000001 /* Enable Protected Mode (RW) */#define X86_CR0_MP 0x00000002 /* Monitor Coprocessor (RW) */#define X86_CR0_EM 0x00000004 /* Require FPU Emulation (RO) */#define X86_CR0_TS 0x00000008 /* Task Switched (RW) */#define X86_CR0_ET 0x00000010 /* Extension type (RO) */#define X86_CR0_NE 0x00000020 /* Numeric Error Reporting (RW) */#define X86_CR0_WP 0x00010000 /* Supervisor Write Protect (RW) */#define X86_CR0_AM 0x00040000 /* Alignment Checking (RW) */#define X86_CR0_NW 0x20000000 /* Not Write-Through (RW) */#define X86_CR0_CD 0x40000000 /* Cache Disable (RW) */#define X86_CR0_PG 0x80000000 /* Paging (RW) *//* * Intel CPU features in CR4 */#define X86_CR4_VME 0x0001 /* enable vm86 extensions */#define X86_CR4_PVI 0x0002 /* virtual interrupts flag enable */#define X86_CR4_TSD 0x0004 /* disable time stamp at ipl 3 */#define X86_CR4_DE 0x0008 /* enable debugging extensions */#define X86_CR4_PSE 0x0010 /* enable page size extensions */#define X86_CR4_PAE 0x0020 /* enable physical address extensions */#define X86_CR4_MCE 0x0040 /* Machine check enable */#define X86_CR4_PGE 0x0080 /* enable global pages */#define X86_CR4_PCE 0x0100 /* enable performance counters at ipl 3 */#define X86_CR4_OSFXSR 0x0200 /* enable fast FPU save and restore */#define X86_CR4_OSXMMEXCPT 0x0400 /* enable unmasked SSE exceptions */#define X86_CR4_VMXE 0x2000 /* enable VMX */#define X86_CR4_SMXE 0x4000 /* enable SMX *//* * Trap/fault mnemonics. */#define TRAP_divide_error 0#define TRAP_debug 1#define TRAP_nmi 2#define TRAP_int3 3#define TRAP_overflow 4#define TRAP_bounds 5#define TRAP_invalid_op 6#define TRAP_no_device 7#define TRAP_double_fault 8#define TRAP_copro_seg 9#define TRAP_invalid_tss 10#define TRAP_no_segment 11#define TRAP_stack_error 12#define TRAP_gp_fault 13#define TRAP_page_fault 14#define TRAP_spurious_int 15#define TRAP_copro_error 16#define TRAP_alignment_check 17#define TRAP_machine_check 18#define TRAP_simd_error 19/* Set for entry via SYSCALL. Informs return code to use SYSRETQ not IRETQ. *//* NB. Same as VGCF_in_syscall. No bits in common with any other TRAP_ defn. */#define TRAP_syscall 256/* Boolean return code: the reason for a fault has been fixed. */#define EXCRET_fault_fixed 1/* 'trap_bounce' flags values */#define TBF_EXCEPTION 1#define TBF_EXCEPTION_ERRCODE 2#define TBF_INTERRUPT 8#define TBF_FAILSAFE 16/* 'arch_vcpu' flags values */#define _TF_kernel_mode 0#define TF_kernel_mode (1<<_TF_kernel_mode)/* #PF error code values. */#define PFEC_page_present (1U<<0)#define PFEC_write_access (1U<<1)#define PFEC_user_mode (1U<<2)#define PFEC_reserved_bit (1U<<3)#define PFEC_insn_fetch (1U<<4)#ifndef __ASSEMBLY__struct domain;struct vcpu;/* * Default implementation of macro that returns current * instruction pointer ("program counter"). */#ifdef __x86_64__#define current_text_addr() ({ \ void *pc; \ asm ( "leaq 1f(%%rip),%0\n1:" : "=r" (pc) ); \ pc; \})#else#define current_text_addr() ({ \ void *pc; \ asm ( "movl $1f,%0\n1:" : "=g" (pc) ); \ pc; \})#endifstruct cpuinfo_x86 { __u8 x86; /* CPU family */ __u8 x86_vendor; /* CPU vendor */ __u8 x86_model; __u8 x86_mask; int cpuid_level; /* Maximum supported CPUID level, -1=no CPUID */ unsigned int x86_capability[NCAPINTS]; char x86_vendor_id[16]; char x86_model_id[64]; int x86_cache_size; /* in KB - valid for CPUS which support this call */ int x86_cache_alignment; /* In bytes */ int x86_power; __u32 x86_max_cores; /* cpuid returned max cores value */ __u32 booted_cores; /* number of cores as seen by OS */ __u32 apicid; unsigned short x86_clflush_size;} __cacheline_aligned;/* * capabilities of CPUs */extern struct cpuinfo_x86 boot_cpu_data;#ifdef CONFIG_SMPextern struct cpuinfo_x86 cpu_data[];#define current_cpu_data cpu_data[smp_processor_id()]#else#define cpu_data (&boot_cpu_data)#define current_cpu_data boot_cpu_data#endifextern int phys_proc_id[NR_CPUS];extern int cpu_core_id[NR_CPUS];extern void identify_cpu(struct cpuinfo_x86 *);extern void print_cpu_info(struct cpuinfo_x86 *);extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);extern void dodgy_tsc(void);#ifdef CONFIG_X86_HTextern void detect_ht(struct cpuinfo_x86 *c);#elsestatic always_inline void detect_ht(struct cpuinfo_x86 *c) {}#endif/* * Generic CPUID function * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx * resulting in stale register contents being returned. */#define cpuid(_op,_eax,_ebx,_ecx,_edx) \ asm ( "cpuid" \ : "=a" (*(int *)(_eax)), \ "=b" (*(int *)(_ebx)), \ "=c" (*(int *)(_ecx)), \ "=d" (*(int *)(_edx)) \ : "0" (_op), "2" (0) )/* Some CPUID calls want 'count' to be placed in ecx */static inline void cpuid_count( int op, int count, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx){ asm ( "cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op), "c" (count) );}/* * CPUID functions returning a single datum */static always_inline unsigned int cpuid_eax(unsigned int op){ unsigned int eax; asm ( "cpuid" : "=a" (eax) : "0" (op) : "bx", "cx", "dx" ); return eax;}static always_inline unsigned int cpuid_ebx(unsigned int op){ unsigned int eax, ebx; asm ( "cpuid" : "=a" (eax), "=b" (ebx) : "0" (op) : "cx", "dx" ); return ebx;}static always_inline unsigned int cpuid_ecx(unsigned int op){ unsigned int eax, ecx; asm ( "cpuid" : "=a" (eax), "=c" (ecx) : "0" (op) : "bx", "dx" ); return ecx;}static always_inline unsigned int cpuid_edx(unsigned int op){ unsigned int eax, edx; asm ( "cpuid" : "=a" (eax), "=d" (edx) : "0" (op) : "bx", "cx" ); return edx;}static inline unsigned long read_cr0(void){ unsigned long cr0; asm volatile ( "mov %%cr0,%0\n\t" : "=r" (cr0) ); return cr0;} static inline void write_cr0(unsigned long val){ asm volatile ( "mov %0,%%cr0" : : "r" ((unsigned long)val) );}static inline unsigned long read_cr2(void){ unsigned long cr2; asm volatile ( "mov %%cr2,%0\n\t" : "=r" (cr2) ); return cr2;}DECLARE_PER_CPU(unsigned long, cr4);static inline unsigned long read_cr4(void){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -