1*bb898558SAl Viro #ifndef ASM_X86__PROCESSOR_H 2*bb898558SAl Viro #define ASM_X86__PROCESSOR_H 3*bb898558SAl Viro 4*bb898558SAl Viro #include <asm/processor-flags.h> 5*bb898558SAl Viro 6*bb898558SAl Viro /* Forward declaration, a strange C thing */ 7*bb898558SAl Viro struct task_struct; 8*bb898558SAl Viro struct mm_struct; 9*bb898558SAl Viro 10*bb898558SAl Viro #include <asm/vm86.h> 11*bb898558SAl Viro #include <asm/math_emu.h> 12*bb898558SAl Viro #include <asm/segment.h> 13*bb898558SAl Viro #include <asm/types.h> 14*bb898558SAl Viro #include <asm/sigcontext.h> 15*bb898558SAl Viro #include <asm/current.h> 16*bb898558SAl Viro #include <asm/cpufeature.h> 17*bb898558SAl Viro #include <asm/system.h> 18*bb898558SAl Viro #include <asm/page.h> 19*bb898558SAl Viro #include <asm/percpu.h> 20*bb898558SAl Viro #include <asm/msr.h> 21*bb898558SAl Viro #include <asm/desc_defs.h> 22*bb898558SAl Viro #include <asm/nops.h> 23*bb898558SAl Viro #include <asm/ds.h> 24*bb898558SAl Viro 25*bb898558SAl Viro #include <linux/personality.h> 26*bb898558SAl Viro #include <linux/cpumask.h> 27*bb898558SAl Viro #include <linux/cache.h> 28*bb898558SAl Viro #include <linux/threads.h> 29*bb898558SAl Viro #include <linux/init.h> 30*bb898558SAl Viro 31*bb898558SAl Viro /* 32*bb898558SAl Viro * Default implementation of macro that returns current 33*bb898558SAl Viro * instruction pointer ("program counter"). 34*bb898558SAl Viro */ 35*bb898558SAl Viro static inline void *current_text_addr(void) 36*bb898558SAl Viro { 37*bb898558SAl Viro void *pc; 38*bb898558SAl Viro 39*bb898558SAl Viro asm volatile("mov $1f, %0; 1:":"=r" (pc)); 40*bb898558SAl Viro 41*bb898558SAl Viro return pc; 42*bb898558SAl Viro } 43*bb898558SAl Viro 44*bb898558SAl Viro #ifdef CONFIG_X86_VSMP 45*bb898558SAl Viro # define ARCH_MIN_TASKALIGN (1 << INTERNODE_CACHE_SHIFT) 46*bb898558SAl Viro # define ARCH_MIN_MMSTRUCT_ALIGN (1 << INTERNODE_CACHE_SHIFT) 47*bb898558SAl Viro #else 48*bb898558SAl Viro # define ARCH_MIN_TASKALIGN 16 49*bb898558SAl Viro # define ARCH_MIN_MMSTRUCT_ALIGN 0 50*bb898558SAl Viro #endif 51*bb898558SAl Viro 52*bb898558SAl Viro /* 53*bb898558SAl Viro * CPU type and hardware bug flags. Kept separately for each CPU. 54*bb898558SAl Viro * Members of this structure are referenced in head.S, so think twice 55*bb898558SAl Viro * before touching them. [mj] 56*bb898558SAl Viro */ 57*bb898558SAl Viro 58*bb898558SAl Viro struct cpuinfo_x86 { 59*bb898558SAl Viro __u8 x86; /* CPU family */ 60*bb898558SAl Viro __u8 x86_vendor; /* CPU vendor */ 61*bb898558SAl Viro __u8 x86_model; 62*bb898558SAl Viro __u8 x86_mask; 63*bb898558SAl Viro #ifdef CONFIG_X86_32 64*bb898558SAl Viro char wp_works_ok; /* It doesn't on 386's */ 65*bb898558SAl Viro 66*bb898558SAl Viro /* Problems on some 486Dx4's and old 386's: */ 67*bb898558SAl Viro char hlt_works_ok; 68*bb898558SAl Viro char hard_math; 69*bb898558SAl Viro char rfu; 70*bb898558SAl Viro char fdiv_bug; 71*bb898558SAl Viro char f00f_bug; 72*bb898558SAl Viro char coma_bug; 73*bb898558SAl Viro char pad0; 74*bb898558SAl Viro #else 75*bb898558SAl Viro /* Number of 4K pages in DTLB/ITLB combined(in pages): */ 76*bb898558SAl Viro int x86_tlbsize; 77*bb898558SAl Viro __u8 x86_virt_bits; 78*bb898558SAl Viro __u8 x86_phys_bits; 79*bb898558SAl Viro #endif 80*bb898558SAl Viro /* CPUID returned core id bits: */ 81*bb898558SAl Viro __u8 x86_coreid_bits; 82*bb898558SAl Viro /* Max extended CPUID function supported: */ 83*bb898558SAl Viro __u32 extended_cpuid_level; 84*bb898558SAl Viro /* Maximum supported CPUID level, -1=no CPUID: */ 85*bb898558SAl Viro int cpuid_level; 86*bb898558SAl Viro __u32 x86_capability[NCAPINTS]; 87*bb898558SAl Viro char x86_vendor_id[16]; 88*bb898558SAl Viro char x86_model_id[64]; 89*bb898558SAl Viro /* in KB - valid for CPUS which support this call: */ 90*bb898558SAl Viro int x86_cache_size; 91*bb898558SAl Viro int x86_cache_alignment; /* In bytes */ 92*bb898558SAl Viro int x86_power; 93*bb898558SAl Viro unsigned long loops_per_jiffy; 94*bb898558SAl Viro #ifdef CONFIG_SMP 95*bb898558SAl Viro /* cpus sharing the last level cache: */ 96*bb898558SAl Viro cpumask_t llc_shared_map; 97*bb898558SAl Viro #endif 98*bb898558SAl Viro /* cpuid returned max cores value: */ 99*bb898558SAl Viro u16 x86_max_cores; 100*bb898558SAl Viro u16 apicid; 101*bb898558SAl Viro u16 initial_apicid; 102*bb898558SAl Viro u16 x86_clflush_size; 103*bb898558SAl Viro #ifdef CONFIG_SMP 104*bb898558SAl Viro /* number of cores as seen by the OS: */ 105*bb898558SAl Viro u16 booted_cores; 106*bb898558SAl Viro /* Physical processor id: */ 107*bb898558SAl Viro u16 phys_proc_id; 108*bb898558SAl Viro /* Core id: */ 109*bb898558SAl Viro u16 cpu_core_id; 110*bb898558SAl Viro /* Index into per_cpu list: */ 111*bb898558SAl Viro u16 cpu_index; 112*bb898558SAl Viro #endif 113*bb898558SAl Viro } __attribute__((__aligned__(SMP_CACHE_BYTES))); 114*bb898558SAl Viro 115*bb898558SAl Viro #define X86_VENDOR_INTEL 0 116*bb898558SAl Viro #define X86_VENDOR_CYRIX 1 117*bb898558SAl Viro #define X86_VENDOR_AMD 2 118*bb898558SAl Viro #define X86_VENDOR_UMC 3 119*bb898558SAl Viro #define X86_VENDOR_CENTAUR 5 120*bb898558SAl Viro #define X86_VENDOR_TRANSMETA 7 121*bb898558SAl Viro #define X86_VENDOR_NSC 8 122*bb898558SAl Viro #define X86_VENDOR_NUM 9 123*bb898558SAl Viro 124*bb898558SAl Viro #define X86_VENDOR_UNKNOWN 0xff 125*bb898558SAl Viro 126*bb898558SAl Viro /* 127*bb898558SAl Viro * capabilities of CPUs 128*bb898558SAl Viro */ 129*bb898558SAl Viro extern struct cpuinfo_x86 boot_cpu_data; 130*bb898558SAl Viro extern struct cpuinfo_x86 new_cpu_data; 131*bb898558SAl Viro 132*bb898558SAl Viro extern struct tss_struct doublefault_tss; 133*bb898558SAl Viro extern __u32 cleared_cpu_caps[NCAPINTS]; 134*bb898558SAl Viro 135*bb898558SAl Viro #ifdef CONFIG_SMP 136*bb898558SAl Viro DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info); 137*bb898558SAl Viro #define cpu_data(cpu) per_cpu(cpu_info, cpu) 138*bb898558SAl Viro #define current_cpu_data __get_cpu_var(cpu_info) 139*bb898558SAl Viro #else 140*bb898558SAl Viro #define cpu_data(cpu) boot_cpu_data 141*bb898558SAl Viro #define current_cpu_data boot_cpu_data 142*bb898558SAl Viro #endif 143*bb898558SAl Viro 144*bb898558SAl Viro extern const struct seq_operations cpuinfo_op; 145*bb898558SAl Viro 146*bb898558SAl Viro static inline int hlt_works(int cpu) 147*bb898558SAl Viro { 148*bb898558SAl Viro #ifdef CONFIG_X86_32 149*bb898558SAl Viro return cpu_data(cpu).hlt_works_ok; 150*bb898558SAl Viro #else 151*bb898558SAl Viro return 1; 152*bb898558SAl Viro #endif 153*bb898558SAl Viro } 154*bb898558SAl Viro 155*bb898558SAl Viro #define cache_line_size() (boot_cpu_data.x86_cache_alignment) 156*bb898558SAl Viro 157*bb898558SAl Viro extern void cpu_detect(struct cpuinfo_x86 *c); 158*bb898558SAl Viro 159*bb898558SAl Viro extern struct pt_regs *idle_regs(struct pt_regs *); 160*bb898558SAl Viro 161*bb898558SAl Viro extern void early_cpu_init(void); 162*bb898558SAl Viro extern void identify_boot_cpu(void); 163*bb898558SAl Viro extern void identify_secondary_cpu(struct cpuinfo_x86 *); 164*bb898558SAl Viro extern void print_cpu_info(struct cpuinfo_x86 *); 165*bb898558SAl Viro extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c); 166*bb898558SAl Viro extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); 167*bb898558SAl Viro extern unsigned short num_cache_leaves; 168*bb898558SAl Viro 169*bb898558SAl Viro extern void detect_extended_topology(struct cpuinfo_x86 *c); 170*bb898558SAl Viro extern void detect_ht(struct cpuinfo_x86 *c); 171*bb898558SAl Viro 172*bb898558SAl Viro static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, 173*bb898558SAl Viro unsigned int *ecx, unsigned int *edx) 174*bb898558SAl Viro { 175*bb898558SAl Viro /* ecx is often an input as well as an output. */ 176*bb898558SAl Viro asm("cpuid" 177*bb898558SAl Viro : "=a" (*eax), 178*bb898558SAl Viro "=b" (*ebx), 179*bb898558SAl Viro "=c" (*ecx), 180*bb898558SAl Viro "=d" (*edx) 181*bb898558SAl Viro : "0" (*eax), "2" (*ecx)); 182*bb898558SAl Viro } 183*bb898558SAl Viro 184*bb898558SAl Viro static inline void load_cr3(pgd_t *pgdir) 185*bb898558SAl Viro { 186*bb898558SAl Viro write_cr3(__pa(pgdir)); 187*bb898558SAl Viro } 188*bb898558SAl Viro 189*bb898558SAl Viro #ifdef CONFIG_X86_32 190*bb898558SAl Viro /* This is the TSS defined by the hardware. */ 191*bb898558SAl Viro struct x86_hw_tss { 192*bb898558SAl Viro unsigned short back_link, __blh; 193*bb898558SAl Viro unsigned long sp0; 194*bb898558SAl Viro unsigned short ss0, __ss0h; 195*bb898558SAl Viro unsigned long sp1; 196*bb898558SAl Viro /* ss1 caches MSR_IA32_SYSENTER_CS: */ 197*bb898558SAl Viro unsigned short ss1, __ss1h; 198*bb898558SAl Viro unsigned long sp2; 199*bb898558SAl Viro unsigned short ss2, __ss2h; 200*bb898558SAl Viro unsigned long __cr3; 201*bb898558SAl Viro unsigned long ip; 202*bb898558SAl Viro unsigned long flags; 203*bb898558SAl Viro unsigned long ax; 204*bb898558SAl Viro unsigned long cx; 205*bb898558SAl Viro unsigned long dx; 206*bb898558SAl Viro unsigned long bx; 207*bb898558SAl Viro unsigned long sp; 208*bb898558SAl Viro unsigned long bp; 209*bb898558SAl Viro unsigned long si; 210*bb898558SAl Viro unsigned long di; 211*bb898558SAl Viro unsigned short es, __esh; 212*bb898558SAl Viro unsigned short cs, __csh; 213*bb898558SAl Viro unsigned short ss, __ssh; 214*bb898558SAl Viro unsigned short ds, __dsh; 215*bb898558SAl Viro unsigned short fs, __fsh; 216*bb898558SAl Viro unsigned short gs, __gsh; 217*bb898558SAl Viro unsigned short ldt, __ldth; 218*bb898558SAl Viro unsigned short trace; 219*bb898558SAl Viro unsigned short io_bitmap_base; 220*bb898558SAl Viro 221*bb898558SAl Viro } __attribute__((packed)); 222*bb898558SAl Viro #else 223*bb898558SAl Viro struct x86_hw_tss { 224*bb898558SAl Viro u32 reserved1; 225*bb898558SAl Viro u64 sp0; 226*bb898558SAl Viro u64 sp1; 227*bb898558SAl Viro u64 sp2; 228*bb898558SAl Viro u64 reserved2; 229*bb898558SAl Viro u64 ist[7]; 230*bb898558SAl Viro u32 reserved3; 231*bb898558SAl Viro u32 reserved4; 232*bb898558SAl Viro u16 reserved5; 233*bb898558SAl Viro u16 io_bitmap_base; 234*bb898558SAl Viro 235*bb898558SAl Viro } __attribute__((packed)) ____cacheline_aligned; 236*bb898558SAl Viro #endif 237*bb898558SAl Viro 238*bb898558SAl Viro /* 239*bb898558SAl Viro * IO-bitmap sizes: 240*bb898558SAl Viro */ 241*bb898558SAl Viro #define IO_BITMAP_BITS 65536 242*bb898558SAl Viro #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) 243*bb898558SAl Viro #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) 244*bb898558SAl Viro #define IO_BITMAP_OFFSET offsetof(struct tss_struct, io_bitmap) 245*bb898558SAl Viro #define INVALID_IO_BITMAP_OFFSET 0x8000 246*bb898558SAl Viro #define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000 247*bb898558SAl Viro 248*bb898558SAl Viro struct tss_struct { 249*bb898558SAl Viro /* 250*bb898558SAl Viro * The hardware state: 251*bb898558SAl Viro */ 252*bb898558SAl Viro struct x86_hw_tss x86_tss; 253*bb898558SAl Viro 254*bb898558SAl Viro /* 255*bb898558SAl Viro * The extra 1 is there because the CPU will access an 256*bb898558SAl Viro * additional byte beyond the end of the IO permission 257*bb898558SAl Viro * bitmap. The extra byte must be all 1 bits, and must 258*bb898558SAl Viro * be within the limit. 259*bb898558SAl Viro */ 260*bb898558SAl Viro unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; 261*bb898558SAl Viro /* 262*bb898558SAl Viro * Cache the current maximum and the last task that used the bitmap: 263*bb898558SAl Viro */ 264*bb898558SAl Viro unsigned long io_bitmap_max; 265*bb898558SAl Viro struct thread_struct *io_bitmap_owner; 266*bb898558SAl Viro 267*bb898558SAl Viro /* 268*bb898558SAl Viro * .. and then another 0x100 bytes for the emergency kernel stack: 269*bb898558SAl Viro */ 270*bb898558SAl Viro unsigned long stack[64]; 271*bb898558SAl Viro 272*bb898558SAl Viro } ____cacheline_aligned; 273*bb898558SAl Viro 274*bb898558SAl Viro DECLARE_PER_CPU(struct tss_struct, init_tss); 275*bb898558SAl Viro 276*bb898558SAl Viro /* 277*bb898558SAl Viro * Save the original ist values for checking stack pointers during debugging 278*bb898558SAl Viro */ 279*bb898558SAl Viro struct orig_ist { 280*bb898558SAl Viro unsigned long ist[7]; 281*bb898558SAl Viro }; 282*bb898558SAl Viro 283*bb898558SAl Viro #define MXCSR_DEFAULT 0x1f80 284*bb898558SAl Viro 285*bb898558SAl Viro struct i387_fsave_struct { 286*bb898558SAl Viro u32 cwd; /* FPU Control Word */ 287*bb898558SAl Viro u32 swd; /* FPU Status Word */ 288*bb898558SAl Viro u32 twd; /* FPU Tag Word */ 289*bb898558SAl Viro u32 fip; /* FPU IP Offset */ 290*bb898558SAl Viro u32 fcs; /* FPU IP Selector */ 291*bb898558SAl Viro u32 foo; /* FPU Operand Pointer Offset */ 292*bb898558SAl Viro u32 fos; /* FPU Operand Pointer Selector */ 293*bb898558SAl Viro 294*bb898558SAl Viro /* 8*10 bytes for each FP-reg = 80 bytes: */ 295*bb898558SAl Viro u32 st_space[20]; 296*bb898558SAl Viro 297*bb898558SAl Viro /* Software status information [not touched by FSAVE ]: */ 298*bb898558SAl Viro u32 status; 299*bb898558SAl Viro }; 300*bb898558SAl Viro 301*bb898558SAl Viro struct i387_fxsave_struct { 302*bb898558SAl Viro u16 cwd; /* Control Word */ 303*bb898558SAl Viro u16 swd; /* Status Word */ 304*bb898558SAl Viro u16 twd; /* Tag Word */ 305*bb898558SAl Viro u16 fop; /* Last Instruction Opcode */ 306*bb898558SAl Viro union { 307*bb898558SAl Viro struct { 308*bb898558SAl Viro u64 rip; /* Instruction Pointer */ 309*bb898558SAl Viro u64 rdp; /* Data Pointer */ 310*bb898558SAl Viro }; 311*bb898558SAl Viro struct { 312*bb898558SAl Viro u32 fip; /* FPU IP Offset */ 313*bb898558SAl Viro u32 fcs; /* FPU IP Selector */ 314*bb898558SAl Viro u32 foo; /* FPU Operand Offset */ 315*bb898558SAl Viro u32 fos; /* FPU Operand Selector */ 316*bb898558SAl Viro }; 317*bb898558SAl Viro }; 318*bb898558SAl Viro u32 mxcsr; /* MXCSR Register State */ 319*bb898558SAl Viro u32 mxcsr_mask; /* MXCSR Mask */ 320*bb898558SAl Viro 321*bb898558SAl Viro /* 8*16 bytes for each FP-reg = 128 bytes: */ 322*bb898558SAl Viro u32 st_space[32]; 323*bb898558SAl Viro 324*bb898558SAl Viro /* 16*16 bytes for each XMM-reg = 256 bytes: */ 325*bb898558SAl Viro u32 xmm_space[64]; 326*bb898558SAl Viro 327*bb898558SAl Viro u32 padding[12]; 328*bb898558SAl Viro 329*bb898558SAl Viro union { 330*bb898558SAl Viro u32 padding1[12]; 331*bb898558SAl Viro u32 sw_reserved[12]; 332*bb898558SAl Viro }; 333*bb898558SAl Viro 334*bb898558SAl Viro } __attribute__((aligned(16))); 335*bb898558SAl Viro 336*bb898558SAl Viro struct i387_soft_struct { 337*bb898558SAl Viro u32 cwd; 338*bb898558SAl Viro u32 swd; 339*bb898558SAl Viro u32 twd; 340*bb898558SAl Viro u32 fip; 341*bb898558SAl Viro u32 fcs; 342*bb898558SAl Viro u32 foo; 343*bb898558SAl Viro u32 fos; 344*bb898558SAl Viro /* 8*10 bytes for each FP-reg = 80 bytes: */ 345*bb898558SAl Viro u32 st_space[20]; 346*bb898558SAl Viro u8 ftop; 347*bb898558SAl Viro u8 changed; 348*bb898558SAl Viro u8 lookahead; 349*bb898558SAl Viro u8 no_update; 350*bb898558SAl Viro u8 rm; 351*bb898558SAl Viro u8 alimit; 352*bb898558SAl Viro struct info *info; 353*bb898558SAl Viro u32 entry_eip; 354*bb898558SAl Viro }; 355*bb898558SAl Viro 356*bb898558SAl Viro struct xsave_hdr_struct { 357*bb898558SAl Viro u64 xstate_bv; 358*bb898558SAl Viro u64 reserved1[2]; 359*bb898558SAl Viro u64 reserved2[5]; 360*bb898558SAl Viro } __attribute__((packed)); 361*bb898558SAl Viro 362*bb898558SAl Viro struct xsave_struct { 363*bb898558SAl Viro struct i387_fxsave_struct i387; 364*bb898558SAl Viro struct xsave_hdr_struct xsave_hdr; 365*bb898558SAl Viro /* new processor state extensions will go here */ 366*bb898558SAl Viro } __attribute__ ((packed, aligned (64))); 367*bb898558SAl Viro 368*bb898558SAl Viro union thread_xstate { 369*bb898558SAl Viro struct i387_fsave_struct fsave; 370*bb898558SAl Viro struct i387_fxsave_struct fxsave; 371*bb898558SAl Viro struct i387_soft_struct soft; 372*bb898558SAl Viro struct xsave_struct xsave; 373*bb898558SAl Viro }; 374*bb898558SAl Viro 375*bb898558SAl Viro #ifdef CONFIG_X86_64 376*bb898558SAl Viro DECLARE_PER_CPU(struct orig_ist, orig_ist); 377*bb898558SAl Viro #endif 378*bb898558SAl Viro 379*bb898558SAl Viro extern void print_cpu_info(struct cpuinfo_x86 *); 380*bb898558SAl Viro extern unsigned int xstate_size; 381*bb898558SAl Viro extern void free_thread_xstate(struct task_struct *); 382*bb898558SAl Viro extern struct kmem_cache *task_xstate_cachep; 383*bb898558SAl Viro extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c); 384*bb898558SAl Viro extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); 385*bb898558SAl Viro extern unsigned short num_cache_leaves; 386*bb898558SAl Viro 387*bb898558SAl Viro struct thread_struct { 388*bb898558SAl Viro /* Cached TLS descriptors: */ 389*bb898558SAl Viro struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES]; 390*bb898558SAl Viro unsigned long sp0; 391*bb898558SAl Viro unsigned long sp; 392*bb898558SAl Viro #ifdef CONFIG_X86_32 393*bb898558SAl Viro unsigned long sysenter_cs; 394*bb898558SAl Viro #else 395*bb898558SAl Viro unsigned long usersp; /* Copy from PDA */ 396*bb898558SAl Viro unsigned short es; 397*bb898558SAl Viro unsigned short ds; 398*bb898558SAl Viro unsigned short fsindex; 399*bb898558SAl Viro unsigned short gsindex; 400*bb898558SAl Viro #endif 401*bb898558SAl Viro unsigned long ip; 402*bb898558SAl Viro unsigned long fs; 403*bb898558SAl Viro unsigned long gs; 404*bb898558SAl Viro /* Hardware debugging registers: */ 405*bb898558SAl Viro unsigned long debugreg0; 406*bb898558SAl Viro unsigned long debugreg1; 407*bb898558SAl Viro unsigned long debugreg2; 408*bb898558SAl Viro unsigned long debugreg3; 409*bb898558SAl Viro unsigned long debugreg6; 410*bb898558SAl Viro unsigned long debugreg7; 411*bb898558SAl Viro /* Fault info: */ 412*bb898558SAl Viro unsigned long cr2; 413*bb898558SAl Viro unsigned long trap_no; 414*bb898558SAl Viro unsigned long error_code; 415*bb898558SAl Viro /* floating point and extended processor state */ 416*bb898558SAl Viro union thread_xstate *xstate; 417*bb898558SAl Viro #ifdef CONFIG_X86_32 418*bb898558SAl Viro /* Virtual 86 mode info */ 419*bb898558SAl Viro struct vm86_struct __user *vm86_info; 420*bb898558SAl Viro unsigned long screen_bitmap; 421*bb898558SAl Viro unsigned long v86flags; 422*bb898558SAl Viro unsigned long v86mask; 423*bb898558SAl Viro unsigned long saved_sp0; 424*bb898558SAl Viro unsigned int saved_fs; 425*bb898558SAl Viro unsigned int saved_gs; 426*bb898558SAl Viro #endif 427*bb898558SAl Viro /* IO permissions: */ 428*bb898558SAl Viro unsigned long *io_bitmap_ptr; 429*bb898558SAl Viro unsigned long iopl; 430*bb898558SAl Viro /* Max allowed port in the bitmap, in bytes: */ 431*bb898558SAl Viro unsigned io_bitmap_max; 432*bb898558SAl Viro /* MSR_IA32_DEBUGCTLMSR value to switch in if TIF_DEBUGCTLMSR is set. */ 433*bb898558SAl Viro unsigned long debugctlmsr; 434*bb898558SAl Viro #ifdef CONFIG_X86_DS 435*bb898558SAl Viro /* Debug Store context; see include/asm-x86/ds.h; goes into MSR_IA32_DS_AREA */ 436*bb898558SAl Viro struct ds_context *ds_ctx; 437*bb898558SAl Viro #endif /* CONFIG_X86_DS */ 438*bb898558SAl Viro #ifdef CONFIG_X86_PTRACE_BTS 439*bb898558SAl Viro /* the signal to send on a bts buffer overflow */ 440*bb898558SAl Viro unsigned int bts_ovfl_signal; 441*bb898558SAl Viro #endif /* CONFIG_X86_PTRACE_BTS */ 442*bb898558SAl Viro }; 443*bb898558SAl Viro 444*bb898558SAl Viro static inline unsigned long native_get_debugreg(int regno) 445*bb898558SAl Viro { 446*bb898558SAl Viro unsigned long val = 0; /* Damn you, gcc! */ 447*bb898558SAl Viro 448*bb898558SAl Viro switch (regno) { 449*bb898558SAl Viro case 0: 450*bb898558SAl Viro asm("mov %%db0, %0" :"=r" (val)); 451*bb898558SAl Viro break; 452*bb898558SAl Viro case 1: 453*bb898558SAl Viro asm("mov %%db1, %0" :"=r" (val)); 454*bb898558SAl Viro break; 455*bb898558SAl Viro case 2: 456*bb898558SAl Viro asm("mov %%db2, %0" :"=r" (val)); 457*bb898558SAl Viro break; 458*bb898558SAl Viro case 3: 459*bb898558SAl Viro asm("mov %%db3, %0" :"=r" (val)); 460*bb898558SAl Viro break; 461*bb898558SAl Viro case 6: 462*bb898558SAl Viro asm("mov %%db6, %0" :"=r" (val)); 463*bb898558SAl Viro break; 464*bb898558SAl Viro case 7: 465*bb898558SAl Viro asm("mov %%db7, %0" :"=r" (val)); 466*bb898558SAl Viro break; 467*bb898558SAl Viro default: 468*bb898558SAl Viro BUG(); 469*bb898558SAl Viro } 470*bb898558SAl Viro return val; 471*bb898558SAl Viro } 472*bb898558SAl Viro 473*bb898558SAl Viro static inline void native_set_debugreg(int regno, unsigned long value) 474*bb898558SAl Viro { 475*bb898558SAl Viro switch (regno) { 476*bb898558SAl Viro case 0: 477*bb898558SAl Viro asm("mov %0, %%db0" ::"r" (value)); 478*bb898558SAl Viro break; 479*bb898558SAl Viro case 1: 480*bb898558SAl Viro asm("mov %0, %%db1" ::"r" (value)); 481*bb898558SAl Viro break; 482*bb898558SAl Viro case 2: 483*bb898558SAl Viro asm("mov %0, %%db2" ::"r" (value)); 484*bb898558SAl Viro break; 485*bb898558SAl Viro case 3: 486*bb898558SAl Viro asm("mov %0, %%db3" ::"r" (value)); 487*bb898558SAl Viro break; 488*bb898558SAl Viro case 6: 489*bb898558SAl Viro asm("mov %0, %%db6" ::"r" (value)); 490*bb898558SAl Viro break; 491*bb898558SAl Viro case 7: 492*bb898558SAl Viro asm("mov %0, %%db7" ::"r" (value)); 493*bb898558SAl Viro break; 494*bb898558SAl Viro default: 495*bb898558SAl Viro BUG(); 496*bb898558SAl Viro } 497*bb898558SAl Viro } 498*bb898558SAl Viro 499*bb898558SAl Viro /* 500*bb898558SAl Viro * Set IOPL bits in EFLAGS from given mask 501*bb898558SAl Viro */ 502*bb898558SAl Viro static inline void native_set_iopl_mask(unsigned mask) 503*bb898558SAl Viro { 504*bb898558SAl Viro #ifdef CONFIG_X86_32 505*bb898558SAl Viro unsigned int reg; 506*bb898558SAl Viro 507*bb898558SAl Viro asm volatile ("pushfl;" 508*bb898558SAl Viro "popl %0;" 509*bb898558SAl Viro "andl %1, %0;" 510*bb898558SAl Viro "orl %2, %0;" 511*bb898558SAl Viro "pushl %0;" 512*bb898558SAl Viro "popfl" 513*bb898558SAl Viro : "=&r" (reg) 514*bb898558SAl Viro : "i" (~X86_EFLAGS_IOPL), "r" (mask)); 515*bb898558SAl Viro #endif 516*bb898558SAl Viro } 517*bb898558SAl Viro 518*bb898558SAl Viro static inline void 519*bb898558SAl Viro native_load_sp0(struct tss_struct *tss, struct thread_struct *thread) 520*bb898558SAl Viro { 521*bb898558SAl Viro tss->x86_tss.sp0 = thread->sp0; 522*bb898558SAl Viro #ifdef CONFIG_X86_32 523*bb898558SAl Viro /* Only happens when SEP is enabled, no need to test "SEP"arately: */ 524*bb898558SAl Viro if (unlikely(tss->x86_tss.ss1 != thread->sysenter_cs)) { 525*bb898558SAl Viro tss->x86_tss.ss1 = thread->sysenter_cs; 526*bb898558SAl Viro wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0); 527*bb898558SAl Viro } 528*bb898558SAl Viro #endif 529*bb898558SAl Viro } 530*bb898558SAl Viro 531*bb898558SAl Viro static inline void native_swapgs(void) 532*bb898558SAl Viro { 533*bb898558SAl Viro #ifdef CONFIG_X86_64 534*bb898558SAl Viro asm volatile("swapgs" ::: "memory"); 535*bb898558SAl Viro #endif 536*bb898558SAl Viro } 537*bb898558SAl Viro 538*bb898558SAl Viro #ifdef CONFIG_PARAVIRT 539*bb898558SAl Viro #include <asm/paravirt.h> 540*bb898558SAl Viro #else 541*bb898558SAl Viro #define __cpuid native_cpuid 542*bb898558SAl Viro #define paravirt_enabled() 0 543*bb898558SAl Viro 544*bb898558SAl Viro /* 545*bb898558SAl Viro * These special macros can be used to get or set a debugging register 546*bb898558SAl Viro */ 547*bb898558SAl Viro #define get_debugreg(var, register) \ 548*bb898558SAl Viro (var) = native_get_debugreg(register) 549*bb898558SAl Viro #define set_debugreg(value, register) \ 550*bb898558SAl Viro native_set_debugreg(register, value) 551*bb898558SAl Viro 552*bb898558SAl Viro static inline void load_sp0(struct tss_struct *tss, 553*bb898558SAl Viro struct thread_struct *thread) 554*bb898558SAl Viro { 555*bb898558SAl Viro native_load_sp0(tss, thread); 556*bb898558SAl Viro } 557*bb898558SAl Viro 558*bb898558SAl Viro #define set_iopl_mask native_set_iopl_mask 559*bb898558SAl Viro #endif /* CONFIG_PARAVIRT */ 560*bb898558SAl Viro 561*bb898558SAl Viro /* 562*bb898558SAl Viro * Save the cr4 feature set we're using (ie 563*bb898558SAl Viro * Pentium 4MB enable and PPro Global page 564*bb898558SAl Viro * enable), so that any CPU's that boot up 565*bb898558SAl Viro * after us can get the correct flags. 566*bb898558SAl Viro */ 567*bb898558SAl Viro extern unsigned long mmu_cr4_features; 568*bb898558SAl Viro 569*bb898558SAl Viro static inline void set_in_cr4(unsigned long mask) 570*bb898558SAl Viro { 571*bb898558SAl Viro unsigned cr4; 572*bb898558SAl Viro 573*bb898558SAl Viro mmu_cr4_features |= mask; 574*bb898558SAl Viro cr4 = read_cr4(); 575*bb898558SAl Viro cr4 |= mask; 576*bb898558SAl Viro write_cr4(cr4); 577*bb898558SAl Viro } 578*bb898558SAl Viro 579*bb898558SAl Viro static inline void clear_in_cr4(unsigned long mask) 580*bb898558SAl Viro { 581*bb898558SAl Viro unsigned cr4; 582*bb898558SAl Viro 583*bb898558SAl Viro mmu_cr4_features &= ~mask; 584*bb898558SAl Viro cr4 = read_cr4(); 585*bb898558SAl Viro cr4 &= ~mask; 586*bb898558SAl Viro write_cr4(cr4); 587*bb898558SAl Viro } 588*bb898558SAl Viro 589*bb898558SAl Viro typedef struct { 590*bb898558SAl Viro unsigned long seg; 591*bb898558SAl Viro } mm_segment_t; 592*bb898558SAl Viro 593*bb898558SAl Viro 594*bb898558SAl Viro /* 595*bb898558SAl Viro * create a kernel thread without removing it from tasklists 596*bb898558SAl Viro */ 597*bb898558SAl Viro extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); 598*bb898558SAl Viro 599*bb898558SAl Viro /* Free all resources held by a thread. */ 600*bb898558SAl Viro extern void release_thread(struct task_struct *); 601*bb898558SAl Viro 602*bb898558SAl Viro /* Prepare to copy thread state - unlazy all lazy state */ 603*bb898558SAl Viro extern void prepare_to_copy(struct task_struct *tsk); 604*bb898558SAl Viro 605*bb898558SAl Viro unsigned long get_wchan(struct task_struct *p); 606*bb898558SAl Viro 607*bb898558SAl Viro /* 608*bb898558SAl Viro * Generic CPUID function 609*bb898558SAl Viro * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx 610*bb898558SAl Viro * resulting in stale register contents being returned. 611*bb898558SAl Viro */ 612*bb898558SAl Viro static inline void cpuid(unsigned int op, 613*bb898558SAl Viro unsigned int *eax, unsigned int *ebx, 614*bb898558SAl Viro unsigned int *ecx, unsigned int *edx) 615*bb898558SAl Viro { 616*bb898558SAl Viro *eax = op; 617*bb898558SAl Viro *ecx = 0; 618*bb898558SAl Viro __cpuid(eax, ebx, ecx, edx); 619*bb898558SAl Viro } 620*bb898558SAl Viro 621*bb898558SAl Viro /* Some CPUID calls want 'count' to be placed in ecx */ 622*bb898558SAl Viro static inline void cpuid_count(unsigned int op, int count, 623*bb898558SAl Viro unsigned int *eax, unsigned int *ebx, 624*bb898558SAl Viro unsigned int *ecx, unsigned int *edx) 625*bb898558SAl Viro { 626*bb898558SAl Viro *eax = op; 627*bb898558SAl Viro *ecx = count; 628*bb898558SAl Viro __cpuid(eax, ebx, ecx, edx); 629*bb898558SAl Viro } 630*bb898558SAl Viro 631*bb898558SAl Viro /* 632*bb898558SAl Viro * CPUID functions returning a single datum 633*bb898558SAl Viro */ 634*bb898558SAl Viro static inline unsigned int cpuid_eax(unsigned int op) 635*bb898558SAl Viro { 636*bb898558SAl Viro unsigned int eax, ebx, ecx, edx; 637*bb898558SAl Viro 638*bb898558SAl Viro cpuid(op, &eax, &ebx, &ecx, &edx); 639*bb898558SAl Viro 640*bb898558SAl Viro return eax; 641*bb898558SAl Viro } 642*bb898558SAl Viro 643*bb898558SAl Viro static inline unsigned int cpuid_ebx(unsigned int op) 644*bb898558SAl Viro { 645*bb898558SAl Viro unsigned int eax, ebx, ecx, edx; 646*bb898558SAl Viro 647*bb898558SAl Viro cpuid(op, &eax, &ebx, &ecx, &edx); 648*bb898558SAl Viro 649*bb898558SAl Viro return ebx; 650*bb898558SAl Viro } 651*bb898558SAl Viro 652*bb898558SAl Viro static inline unsigned int cpuid_ecx(unsigned int op) 653*bb898558SAl Viro { 654*bb898558SAl Viro unsigned int eax, ebx, ecx, edx; 655*bb898558SAl Viro 656*bb898558SAl Viro cpuid(op, &eax, &ebx, &ecx, &edx); 657*bb898558SAl Viro 658*bb898558SAl Viro return ecx; 659*bb898558SAl Viro } 660*bb898558SAl Viro 661*bb898558SAl Viro static inline unsigned int cpuid_edx(unsigned int op) 662*bb898558SAl Viro { 663*bb898558SAl Viro unsigned int eax, ebx, ecx, edx; 664*bb898558SAl Viro 665*bb898558SAl Viro cpuid(op, &eax, &ebx, &ecx, &edx); 666*bb898558SAl Viro 667*bb898558SAl Viro return edx; 668*bb898558SAl Viro } 669*bb898558SAl Viro 670*bb898558SAl Viro /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ 671*bb898558SAl Viro static inline void rep_nop(void) 672*bb898558SAl Viro { 673*bb898558SAl Viro asm volatile("rep; nop" ::: "memory"); 674*bb898558SAl Viro } 675*bb898558SAl Viro 676*bb898558SAl Viro static inline void cpu_relax(void) 677*bb898558SAl Viro { 678*bb898558SAl Viro rep_nop(); 679*bb898558SAl Viro } 680*bb898558SAl Viro 681*bb898558SAl Viro /* Stop speculative execution: */ 682*bb898558SAl Viro static inline void sync_core(void) 683*bb898558SAl Viro { 684*bb898558SAl Viro int tmp; 685*bb898558SAl Viro 686*bb898558SAl Viro asm volatile("cpuid" : "=a" (tmp) : "0" (1) 687*bb898558SAl Viro : "ebx", "ecx", "edx", "memory"); 688*bb898558SAl Viro } 689*bb898558SAl Viro 690*bb898558SAl Viro static inline void __monitor(const void *eax, unsigned long ecx, 691*bb898558SAl Viro unsigned long edx) 692*bb898558SAl Viro { 693*bb898558SAl Viro /* "monitor %eax, %ecx, %edx;" */ 694*bb898558SAl Viro asm volatile(".byte 0x0f, 0x01, 0xc8;" 695*bb898558SAl Viro :: "a" (eax), "c" (ecx), "d"(edx)); 696*bb898558SAl Viro } 697*bb898558SAl Viro 698*bb898558SAl Viro static inline void __mwait(unsigned long eax, unsigned long ecx) 699*bb898558SAl Viro { 700*bb898558SAl Viro /* "mwait %eax, %ecx;" */ 701*bb898558SAl Viro asm volatile(".byte 0x0f, 0x01, 0xc9;" 702*bb898558SAl Viro :: "a" (eax), "c" (ecx)); 703*bb898558SAl Viro } 704*bb898558SAl Viro 705*bb898558SAl Viro static inline void __sti_mwait(unsigned long eax, unsigned long ecx) 706*bb898558SAl Viro { 707*bb898558SAl Viro trace_hardirqs_on(); 708*bb898558SAl Viro /* "mwait %eax, %ecx;" */ 709*bb898558SAl Viro asm volatile("sti; .byte 0x0f, 0x01, 0xc9;" 710*bb898558SAl Viro :: "a" (eax), "c" (ecx)); 711*bb898558SAl Viro } 712*bb898558SAl Viro 713*bb898558SAl Viro extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); 714*bb898558SAl Viro 715*bb898558SAl Viro extern void select_idle_routine(const struct cpuinfo_x86 *c); 716*bb898558SAl Viro 717*bb898558SAl Viro extern unsigned long boot_option_idle_override; 718*bb898558SAl Viro extern unsigned long idle_halt; 719*bb898558SAl Viro extern unsigned long idle_nomwait; 720*bb898558SAl Viro 721*bb898558SAl Viro /* 722*bb898558SAl Viro * on systems with caches, caches must be flashed as the absolute 723*bb898558SAl Viro * last instruction before going into a suspended halt. Otherwise, 724*bb898558SAl Viro * dirty data can linger in the cache and become stale on resume, 725*bb898558SAl Viro * leading to strange errors. 726*bb898558SAl Viro * 727*bb898558SAl Viro * perform a variety of operations to guarantee that the compiler 728*bb898558SAl Viro * will not reorder instructions. wbinvd itself is serializing 729*bb898558SAl Viro * so the processor will not reorder. 730*bb898558SAl Viro * 731*bb898558SAl Viro * Systems without cache can just go into halt. 732*bb898558SAl Viro */ 733*bb898558SAl Viro static inline void wbinvd_halt(void) 734*bb898558SAl Viro { 735*bb898558SAl Viro mb(); 736*bb898558SAl Viro /* check for clflush to determine if wbinvd is legal */ 737*bb898558SAl Viro if (cpu_has_clflush) 738*bb898558SAl Viro asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory"); 739*bb898558SAl Viro else 740*bb898558SAl Viro while (1) 741*bb898558SAl Viro halt(); 742*bb898558SAl Viro } 743*bb898558SAl Viro 744*bb898558SAl Viro extern void enable_sep_cpu(void); 745*bb898558SAl Viro extern int sysenter_setup(void); 746*bb898558SAl Viro 747*bb898558SAl Viro /* Defined in head.S */ 748*bb898558SAl Viro extern struct desc_ptr early_gdt_descr; 749*bb898558SAl Viro 750*bb898558SAl Viro extern void cpu_set_gdt(int); 751*bb898558SAl Viro extern void switch_to_new_gdt(void); 752*bb898558SAl Viro extern void cpu_init(void); 753*bb898558SAl Viro extern void init_gdt(int cpu); 754*bb898558SAl Viro 755*bb898558SAl Viro static inline void update_debugctlmsr(unsigned long debugctlmsr) 756*bb898558SAl Viro { 757*bb898558SAl Viro #ifndef CONFIG_X86_DEBUGCTLMSR 758*bb898558SAl Viro if (boot_cpu_data.x86 < 6) 759*bb898558SAl Viro return; 760*bb898558SAl Viro #endif 761*bb898558SAl Viro wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr); 762*bb898558SAl Viro } 763*bb898558SAl Viro 764*bb898558SAl Viro /* 765*bb898558SAl Viro * from system description table in BIOS. Mostly for MCA use, but 766*bb898558SAl Viro * others may find it useful: 767*bb898558SAl Viro */ 768*bb898558SAl Viro extern unsigned int machine_id; 769*bb898558SAl Viro extern unsigned int machine_submodel_id; 770*bb898558SAl Viro extern unsigned int BIOS_revision; 771*bb898558SAl Viro 772*bb898558SAl Viro /* Boot loader type from the setup header: */ 773*bb898558SAl Viro extern int bootloader_type; 774*bb898558SAl Viro 775*bb898558SAl Viro extern char ignore_fpu_irq; 776*bb898558SAl Viro 777*bb898558SAl Viro #define HAVE_ARCH_PICK_MMAP_LAYOUT 1 778*bb898558SAl Viro #define ARCH_HAS_PREFETCHW 779*bb898558SAl Viro #define ARCH_HAS_SPINLOCK_PREFETCH 780*bb898558SAl Viro 781*bb898558SAl Viro #ifdef CONFIG_X86_32 782*bb898558SAl Viro # define BASE_PREFETCH ASM_NOP4 783*bb898558SAl Viro # define ARCH_HAS_PREFETCH 784*bb898558SAl Viro #else 785*bb898558SAl Viro # define BASE_PREFETCH "prefetcht0 (%1)" 786*bb898558SAl Viro #endif 787*bb898558SAl Viro 788*bb898558SAl Viro /* 789*bb898558SAl Viro * Prefetch instructions for Pentium III (+) and AMD Athlon (+) 790*bb898558SAl Viro * 791*bb898558SAl Viro * It's not worth to care about 3dnow prefetches for the K6 792*bb898558SAl Viro * because they are microcoded there and very slow. 793*bb898558SAl Viro */ 794*bb898558SAl Viro static inline void prefetch(const void *x) 795*bb898558SAl Viro { 796*bb898558SAl Viro alternative_input(BASE_PREFETCH, 797*bb898558SAl Viro "prefetchnta (%1)", 798*bb898558SAl Viro X86_FEATURE_XMM, 799*bb898558SAl Viro "r" (x)); 800*bb898558SAl Viro } 801*bb898558SAl Viro 802*bb898558SAl Viro /* 803*bb898558SAl Viro * 3dnow prefetch to get an exclusive cache line. 804*bb898558SAl Viro * Useful for spinlocks to avoid one state transition in the 805*bb898558SAl Viro * cache coherency protocol: 806*bb898558SAl Viro */ 807*bb898558SAl Viro static inline void prefetchw(const void *x) 808*bb898558SAl Viro { 809*bb898558SAl Viro alternative_input(BASE_PREFETCH, 810*bb898558SAl Viro "prefetchw (%1)", 811*bb898558SAl Viro X86_FEATURE_3DNOW, 812*bb898558SAl Viro "r" (x)); 813*bb898558SAl Viro } 814*bb898558SAl Viro 815*bb898558SAl Viro static inline void spin_lock_prefetch(const void *x) 816*bb898558SAl Viro { 817*bb898558SAl Viro prefetchw(x); 818*bb898558SAl Viro } 819*bb898558SAl Viro 820*bb898558SAl Viro #ifdef CONFIG_X86_32 821*bb898558SAl Viro /* 822*bb898558SAl Viro * User space process size: 3GB (default). 823*bb898558SAl Viro */ 824*bb898558SAl Viro #define TASK_SIZE PAGE_OFFSET 825*bb898558SAl Viro #define STACK_TOP TASK_SIZE 826*bb898558SAl Viro #define STACK_TOP_MAX STACK_TOP 827*bb898558SAl Viro 828*bb898558SAl Viro #define INIT_THREAD { \ 829*bb898558SAl Viro .sp0 = sizeof(init_stack) + (long)&init_stack, \ 830*bb898558SAl Viro .vm86_info = NULL, \ 831*bb898558SAl Viro .sysenter_cs = __KERNEL_CS, \ 832*bb898558SAl Viro .io_bitmap_ptr = NULL, \ 833*bb898558SAl Viro .fs = __KERNEL_PERCPU, \ 834*bb898558SAl Viro } 835*bb898558SAl Viro 836*bb898558SAl Viro /* 837*bb898558SAl Viro * Note that the .io_bitmap member must be extra-big. This is because 838*bb898558SAl Viro * the CPU will access an additional byte beyond the end of the IO 839*bb898558SAl Viro * permission bitmap. The extra byte must be all 1 bits, and must 840*bb898558SAl Viro * be within the limit. 841*bb898558SAl Viro */ 842*bb898558SAl Viro #define INIT_TSS { \ 843*bb898558SAl Viro .x86_tss = { \ 844*bb898558SAl Viro .sp0 = sizeof(init_stack) + (long)&init_stack, \ 845*bb898558SAl Viro .ss0 = __KERNEL_DS, \ 846*bb898558SAl Viro .ss1 = __KERNEL_CS, \ 847*bb898558SAl Viro .io_bitmap_base = INVALID_IO_BITMAP_OFFSET, \ 848*bb898558SAl Viro }, \ 849*bb898558SAl Viro .io_bitmap = { [0 ... IO_BITMAP_LONGS] = ~0 }, \ 850*bb898558SAl Viro } 851*bb898558SAl Viro 852*bb898558SAl Viro extern unsigned long thread_saved_pc(struct task_struct *tsk); 853*bb898558SAl Viro 854*bb898558SAl Viro #define THREAD_SIZE_LONGS (THREAD_SIZE/sizeof(unsigned long)) 855*bb898558SAl Viro #define KSTK_TOP(info) \ 856*bb898558SAl Viro ({ \ 857*bb898558SAl Viro unsigned long *__ptr = (unsigned long *)(info); \ 858*bb898558SAl Viro (unsigned long)(&__ptr[THREAD_SIZE_LONGS]); \ 859*bb898558SAl Viro }) 860*bb898558SAl Viro 861*bb898558SAl Viro /* 862*bb898558SAl Viro * The below -8 is to reserve 8 bytes on top of the ring0 stack. 863*bb898558SAl Viro * This is necessary to guarantee that the entire "struct pt_regs" 864*bb898558SAl Viro * is accessable even if the CPU haven't stored the SS/ESP registers 865*bb898558SAl Viro * on the stack (interrupt gate does not save these registers 866*bb898558SAl Viro * when switching to the same priv ring). 867*bb898558SAl Viro * Therefore beware: accessing the ss/esp fields of the 868*bb898558SAl Viro * "struct pt_regs" is possible, but they may contain the 869*bb898558SAl Viro * completely wrong values. 870*bb898558SAl Viro */ 871*bb898558SAl Viro #define task_pt_regs(task) \ 872*bb898558SAl Viro ({ \ 873*bb898558SAl Viro struct pt_regs *__regs__; \ 874*bb898558SAl Viro __regs__ = (struct pt_regs *)(KSTK_TOP(task_stack_page(task))-8); \ 875*bb898558SAl Viro __regs__ - 1; \ 876*bb898558SAl Viro }) 877*bb898558SAl Viro 878*bb898558SAl Viro #define KSTK_ESP(task) (task_pt_regs(task)->sp) 879*bb898558SAl Viro 880*bb898558SAl Viro #else 881*bb898558SAl Viro /* 882*bb898558SAl Viro * User space process size. 47bits minus one guard page. 883*bb898558SAl Viro */ 884*bb898558SAl Viro #define TASK_SIZE64 ((1UL << 47) - PAGE_SIZE) 885*bb898558SAl Viro 886*bb898558SAl Viro /* This decides where the kernel will search for a free chunk of vm 887*bb898558SAl Viro * space during mmap's. 888*bb898558SAl Viro */ 889*bb898558SAl Viro #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ 890*bb898558SAl Viro 0xc0000000 : 0xFFFFe000) 891*bb898558SAl Viro 892*bb898558SAl Viro #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ 893*bb898558SAl Viro IA32_PAGE_OFFSET : TASK_SIZE64) 894*bb898558SAl Viro #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? \ 895*bb898558SAl Viro IA32_PAGE_OFFSET : TASK_SIZE64) 896*bb898558SAl Viro 897*bb898558SAl Viro #define STACK_TOP TASK_SIZE 898*bb898558SAl Viro #define STACK_TOP_MAX TASK_SIZE64 899*bb898558SAl Viro 900*bb898558SAl Viro #define INIT_THREAD { \ 901*bb898558SAl Viro .sp0 = (unsigned long)&init_stack + sizeof(init_stack) \ 902*bb898558SAl Viro } 903*bb898558SAl Viro 904*bb898558SAl Viro #define INIT_TSS { \ 905*bb898558SAl Viro .x86_tss.sp0 = (unsigned long)&init_stack + sizeof(init_stack) \ 906*bb898558SAl Viro } 907*bb898558SAl Viro 908*bb898558SAl Viro /* 909*bb898558SAl Viro * Return saved PC of a blocked thread. 910*bb898558SAl Viro * What is this good for? it will be always the scheduler or ret_from_fork. 911*bb898558SAl Viro */ 912*bb898558SAl Viro #define thread_saved_pc(t) (*(unsigned long *)((t)->thread.sp - 8)) 913*bb898558SAl Viro 914*bb898558SAl Viro #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) 915*bb898558SAl Viro #define KSTK_ESP(tsk) -1 /* sorry. doesn't work for syscall. */ 916*bb898558SAl Viro #endif /* CONFIG_X86_64 */ 917*bb898558SAl Viro 918*bb898558SAl Viro extern void start_thread(struct pt_regs *regs, unsigned long new_ip, 919*bb898558SAl Viro unsigned long new_sp); 920*bb898558SAl Viro 921*bb898558SAl Viro /* 922*bb898558SAl Viro * This decides where the kernel will search for a free chunk of vm 923*bb898558SAl Viro * space during mmap's. 924*bb898558SAl Viro */ 925*bb898558SAl Viro #define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) 926*bb898558SAl Viro 927*bb898558SAl Viro #define KSTK_EIP(task) (task_pt_regs(task)->ip) 928*bb898558SAl Viro 929*bb898558SAl Viro /* Get/set a process' ability to use the timestamp counter instruction */ 930*bb898558SAl Viro #define GET_TSC_CTL(adr) get_tsc_mode((adr)) 931*bb898558SAl Viro #define SET_TSC_CTL(val) set_tsc_mode((val)) 932*bb898558SAl Viro 933*bb898558SAl Viro extern int get_tsc_mode(unsigned long adr); 934*bb898558SAl Viro extern int set_tsc_mode(unsigned int val); 935*bb898558SAl Viro 936*bb898558SAl Viro #endif /* ASM_X86__PROCESSOR_H */ 937