1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * include/asm-i386/processor.h 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 1994 Linus Torvalds 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ASM_I386_PROCESSOR_H 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __ASM_I386_PROCESSOR_H 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/vm86.h> 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/math_emu.h> 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/segment.h> 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/page.h> 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/types.h> 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/sigcontext.h> 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/cpufeature.h> 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/msr.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/system.h> 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/cache.h> 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/threads.h> 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/percpu.h> 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/cpumask.h> 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/init.h> 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/processor-flags.h> 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* flag for disabling the tsc */ 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int tsc_disable; 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct desc_struct { 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long a,b; 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define desc_empty(desc) \ 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (!((desc)->a | (desc)->b)) 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define desc_equal(desc1, desc2) \ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b)) 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Default implementation of macro that returns current 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * instruction pointer ("program counter"). 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define current_text_addr() ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; }) 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * CPU type and hardware bug flags. Kept separately for each CPU. 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Members of this structure are referenced in head.S, so think twice 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * before touching them. [mj] 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct cpuinfo_x86 { 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 x86; /* CPU family */ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 x86_vendor; /* CPU vendor */ 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 x86_model; 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 x86_mask; 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char wp_works_ok; /* It doesn't on 386's */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char hlt_works_ok; /* Problems on some 486Dx4's and old 386's */ 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char hard_math; 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char rfu; 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int cpuid_level; /* Maximum supported CPUID level, -1=no CPUID */ 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long x86_capability[NCAPINTS]; 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char x86_vendor_id[16]; 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char x86_model_id[64]; 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int x86_cache_size; /* in KB - valid for CPUS which support this 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru call */ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int x86_cache_alignment; /* In bytes */ 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char fdiv_bug; 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char f00f_bug; 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char coma_bug; 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char pad0; 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int x86_power; 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long loops_per_jiffy; 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpumask_t llc_shared_map; /* cpus sharing the last level cache */ 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char x86_max_cores; /* cpuid returned max cores value */ 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char apicid; 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short x86_clflush_size; 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char booted_cores; /* number of cores as seen by OS */ 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 phys_proc_id; /* Physical processor id. */ 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 cpu_core_id; /* Core id */ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 cpu_index; /* index into per_cpu list */ 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__((__aligned__(SMP_CACHE_BYTES))); 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_INTEL 0 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_CYRIX 1 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_AMD 2 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_UMC 3 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_NEXGEN 4 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_CENTAUR 5 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_TRANSMETA 7 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_NSC 8 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_NUM 9 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define X86_VENDOR_UNKNOWN 0xff 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * capabilities of CPUs 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct cpuinfo_x86 boot_cpu_data; 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct cpuinfo_x86 new_cpu_data; 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct tss_struct doublefault_tss; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruDECLARE_PER_CPU(struct tss_struct, init_tss); 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruDECLARE_PER_CPU(struct cpuinfo_x86, cpu_info); 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define cpu_data(cpu) per_cpu(cpu_info, cpu) 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define current_cpu_data cpu_data(smp_processor_id()) 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define cpu_data(cpu) boot_cpu_data 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define current_cpu_data boot_cpu_data 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the following now lives in the per cpu area: 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * extern int cpu_llc_id[NR_CPUS]; 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruDECLARE_PER_CPU(u8, cpu_llc_id); 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char ignore_fpu_irq; 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid __init cpu_detect(struct cpuinfo_x86 *c); 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void identify_boot_cpu(void); 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void identify_secondary_cpu(struct cpuinfo_x86 *); 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void print_cpu_info(struct cpuinfo_x86 *); 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void init_scattered_cpuid_features(struct cpuinfo_x86 *c); 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned short num_cache_leaves; 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_X86_HT 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void detect_ht(struct cpuinfo_x86 *c); 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void detect_ht(struct cpuinfo_x86 *c) {} 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void native_cpuid(unsigned int *eax, unsigned int *ebx, 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int *ecx, unsigned int *edx) 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* ecx is often an input as well as an output. */ 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__("cpuid" 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=a" (*eax), 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "=b" (*ebx), 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "=c" (*ecx), 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "=d" (*edx) 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "0" (*eax), "2" (*ecx)); 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define load_cr3(pgdir) write_cr3(__pa(pgdir)) 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Save the cr4 feature set we're using (ie 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Pentium 4MB enable and PPro Global page 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * enable), so that any CPU's that boot up 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * after us can get the correct flags. 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long mmu_cr4_features; 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_in_cr4 (unsigned long mask) 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned cr4; 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru mmu_cr4_features |= mask; 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cr4 = read_cr4(); 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cr4 |= mask; 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru write_cr4(cr4); 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void clear_in_cr4 (unsigned long mask) 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned cr4; 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru mmu_cr4_features &= ~mask; 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cr4 = read_cr4(); 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cr4 &= ~mask; 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru write_cr4(cr4); 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Stop speculative execution */ 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void sync_core(void) 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int tmp; 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory"); 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __monitor(const void *eax, unsigned long ecx, 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long edx) 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* "monitor %eax,%ecx,%edx;" */ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm volatile( 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".byte 0x0f,0x01,0xc8;" 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : :"a" (eax), "c" (ecx), "d"(edx)); 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __mwait(unsigned long eax, unsigned long ecx) 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* "mwait %eax,%ecx;" */ 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm volatile( 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".byte 0x0f,0x01,0xc9;" 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : :"a" (eax), "c" (ecx)); 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* from system description table in BIOS. Mostly for MCA use, but 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruothers may find it useful. */ 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int machine_id; 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int machine_submodel_id; 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int BIOS_revision; 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int mca_pentium_flag; 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Boot loader type from the setup header */ 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bootloader_type; 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * User space process size: 3GB (default). 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TASK_SIZE (PAGE_OFFSET) 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* This decides where the kernel will search for a free chunk of vm 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * space during mmap's. 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_ARCH_PICK_MMAP_LAYOUT 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void hard_disable_TSC(void); 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void disable_TSC(void); 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void hard_enable_TSC(void); 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Size of io_bitmap. 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IO_BITMAP_BITS 65536 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define INVALID_IO_BITMAP_OFFSET 0x8000 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct i387_fsave_struct { 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long cwd; 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long swd; 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long twd; 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fip; 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fcs; 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long foo; 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fos; 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */ 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long status; /* software status information */ 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct i387_fxsave_struct { 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short cwd; 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short swd; 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short twd; 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short fop; 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fip; 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fcs; 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long foo; 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fos; 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long mxcsr; 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long mxcsr_mask; 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */ 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long padding[56]; 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((aligned (16))); 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct i387_soft_struct { 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long cwd; 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long swd; 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long twd; 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fip; 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fcs; 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long foo; 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long fos; 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */ 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char ftop, changed, lookahead, no_update, rm, alimit; 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct info *info; 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long entry_eip; 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunion i387_union { 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct i387_fsave_struct fsave; 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct i387_fxsave_struct fxsave; 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct i387_soft_struct soft; 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct { 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long seg; 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} mm_segment_t; 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct thread_struct; 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* This is the TSS defined by the hardware. */ 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct i386_hw_tss { 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short back_link,__blh; 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esp0; 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ss0,__ss0h; 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esp1; 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ss1,__ss1h; /* ss1 is used to cache MSR_IA32_SYSENTER_CS */ 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esp2; 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ss2,__ss2h; 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long __cr3; 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long eip; 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long eflags; 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long eax,ecx,edx,ebx; 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esp; 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long ebp; 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esi; 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long edi; 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short es, __esh; 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short cs, __csh; 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ss, __ssh; 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ds, __dsh; 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short fs, __fsh; 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short gs, __gsh; 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ldt, __ldth; 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short trace, io_bitmap_base; 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__((packed)); 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct tss_struct { 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct i386_hw_tss x86_tss; 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The extra 1 is there because the CPU will access an 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * additional byte beyond the end of the IO permission 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap. The extra byte must be all 1 bits, and must 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * be within the limit. 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Cache the current maximum and the last task that used the bitmap: 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long io_bitmap_max; 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct thread_struct *io_bitmap_owner; 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * pads the TSS to be cacheline-aligned (size is 0x100) 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long __cacheline_filler[35]; 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * .. and then another 0x100 bytes for emergency kernel stack 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long stack[64]; 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__((packed)); 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ARCH_MIN_TASKALIGN 16 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct thread_struct { 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* cached TLS descriptors. */ 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES]; 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esp0; 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long sysenter_cs; 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long eip; 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long esp; 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long fs; 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long gs; 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Hardware debugging registers */ 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long debugreg[8]; /* %%db0-7 debug registers */ 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* fault info */ 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long cr2, trap_no, error_code; 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* floating point info */ 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru union i387_union i387; 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* virtual 86 mode info */ 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm86_struct __user * vm86_info; 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long screen_bitmap; 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long v86flags, v86mask, saved_esp0; 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int saved_fs, saved_gs; 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* IO permissions */ 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long *io_bitmap_ptr; 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long iopl; 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* max allowed port in the bitmap, in bytes: */ 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long io_bitmap_max; 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define INIT_THREAD { \ 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .esp0 = sizeof(init_stack) + (long)&init_stack, \ 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .vm86_info = NULL, \ 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .sysenter_cs = __KERNEL_CS, \ 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .io_bitmap_ptr = NULL, \ 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .fs = __KERNEL_PERCPU, \ 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Note that the .io_bitmap member must be extra-big. This is because 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the CPU will access an additional byte beyond the end of the IO 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * permission bitmap. The extra byte must be all 1 bits, and must 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * be within the limit. 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define INIT_TSS { \ 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .x86_tss = { \ 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .esp0 = sizeof(init_stack) + (long)&init_stack, \ 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .ss0 = __KERNEL_DS, \ 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .ss1 = __KERNEL_CS, \ 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .io_bitmap_base = INVALID_IO_BITMAP_OFFSET, \ 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }, \ 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .io_bitmap = { [ 0 ... IO_BITMAP_LONGS] = ~0 }, \ 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define start_thread(regs, new_eip, new_esp) do { \ 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__("movl %0,%%gs": :"r" (0)); \ 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->xfs = 0; \ 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_fs(USER_DS); \ 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->xds = __USER_DS; \ 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->xes = __USER_DS; \ 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->xss = __USER_DS; \ 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->xcs = __USER_CS; \ 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->eip = new_eip; \ 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru regs->esp = new_esp; \ 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Forward declaration, a strange C thing */ 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct task_struct; 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mm_struct; 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Free all resources held by a thread. */ 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void release_thread(struct task_struct *); 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Prepare to copy thread state - unlazy all lazy status */ 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void prepare_to_copy(struct task_struct *tsk); 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * create a kernel thread without removing it from tasklists 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long thread_saved_pc(struct task_struct *tsk); 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack); 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long get_wchan(struct task_struct *p); 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define THREAD_SIZE_LONGS (THREAD_SIZE/sizeof(unsigned long)) 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KSTK_TOP(info) \ 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long *__ptr = (unsigned long *)(info); \ 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (unsigned long)(&__ptr[THREAD_SIZE_LONGS]); \ 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The below -8 is to reserve 8 bytes on top of the ring0 stack. 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is necessary to guarantee that the entire "struct pt_regs" 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is accessable even if the CPU haven't stored the SS/ESP registers 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * on the stack (interrupt gate does not save these registers 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * when switching to the same priv ring). 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Therefore beware: accessing the xss/esp fields of the 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * "struct pt_regs" is possible, but they may contain the 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * completely wrong values. 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define task_pt_regs(task) \ 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *__regs__; \ 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __regs__ = (struct pt_regs *)(KSTK_TOP(task_stack_page(task))-8); \ 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __regs__ - 1; \ 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KSTK_EIP(task) (task_pt_regs(task)->eip) 455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KSTK_ESP(task) (task_pt_regs(task)->esp) 456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct microcode_header { 459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int hdrver; 460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int rev; 461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int date; 462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int sig; 463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int cksum; 464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int ldrver; 465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int pf; 466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int datasize; 467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int totalsize; 468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int reserved[3]; 469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct microcode { 472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct microcode_header hdr; 473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int bits[0]; 474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct microcode microcode_t; 477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct microcode_header microcode_header_t; 478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* microcode format is extended from prescott processors */ 480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct extended_signature { 481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int sig; 482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int pf; 483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int cksum; 484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct extended_sigtable { 487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int count; 488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int cksum; 489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int reserved[3]; 490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct extended_signature sigs[0]; 491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ 494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void rep_nop(void) 495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("rep;nop": : :"memory"); 497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define cpu_relax() rep_nop() 500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void native_load_esp0(struct tss_struct *tss, struct thread_struct *thread) 502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tss->x86_tss.esp0 = thread->esp0; 504c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* This can only happen when SEP is enabled, no need to test "SEP"arately */ 505c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(tss->x86_tss.ss1 != thread->sysenter_cs)) { 506c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru tss->x86_tss.ss1 = thread->sysenter_cs; 507c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0); 508c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 509c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 510c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 511c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 512c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long native_get_debugreg(int regno) 513c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 514c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long val = 0; /* Damn you, gcc! */ 515c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 516c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (regno) { 517c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 0: 518c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %%db0, %0" :"=r" (val)); break; 519c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 520c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %%db1, %0" :"=r" (val)); break; 521c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 522c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %%db2, %0" :"=r" (val)); break; 523c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 3: 524c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %%db3, %0" :"=r" (val)); break; 525c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 6: 526c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %%db6, %0" :"=r" (val)); break; 527c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 7: 528c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %%db7, %0" :"=r" (val)); break; 529c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: 530c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG(); 531c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 532c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return val; 533c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 534c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 535c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void native_set_debugreg(int regno, unsigned long value) 536c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 537c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (regno) { 538c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 0: 539c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %0,%%db0" : /* no output */ :"r" (value)); 540c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; 541c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 542c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %0,%%db1" : /* no output */ :"r" (value)); 543c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; 544c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 545c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %0,%%db2" : /* no output */ :"r" (value)); 546c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; 547c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 3: 548c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %0,%%db3" : /* no output */ :"r" (value)); 549c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; 550c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 6: 551c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %0,%%db6" : /* no output */ :"r" (value)); 552c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; 553c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 7: 554c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("movl %0,%%db7" : /* no output */ :"r" (value)); 555c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru break; 556c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: 557c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG(); 558c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 559c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 560c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 561c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 562c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Set IOPL bits in EFLAGS from given mask 563c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 564c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void native_set_iopl_mask(unsigned mask) 565c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 566c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int reg; 567c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__ ("pushfl;" 568c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "popl %0;" 569c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "andl %1, %0;" 570c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "orl %2, %0;" 571c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "pushl %0;" 572c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "popfl" 573c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (reg) 574c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "i" (~X86_EFLAGS_IOPL), "r" (mask)); 575c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 576c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 577c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_PARAVIRT 578c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/paravirt.h> 579c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 580c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define paravirt_enabled() 0 581c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __cpuid native_cpuid 582c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 583c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread) 584c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 585c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru native_load_esp0(tss, thread); 586c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 587c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 588c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 589c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These special macros can be used to get or set a debugging register 590c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 591c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_debugreg(var, register) \ 592c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (var) = native_get_debugreg(register) 593c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_debugreg(value, register) \ 594c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru native_set_debugreg(register, value) 595c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 596c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_iopl_mask native_set_iopl_mask 597c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_PARAVIRT */ 598c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 599c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 600c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Generic CPUID function 601c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx 602c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * resulting in stale register contents being returned. 603c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 604c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void cpuid(unsigned int op, 605c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int *eax, unsigned int *ebx, 606c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int *ecx, unsigned int *edx) 607c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 608c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *eax = op; 609c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *ecx = 0; 610c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __cpuid(eax, ebx, ecx, edx); 611c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 612c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 613c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Some CPUID calls want 'count' to be placed in ecx */ 614c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void cpuid_count(unsigned int op, int count, 615c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int *eax, unsigned int *ebx, 616c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int *ecx, unsigned int *edx) 617c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 618c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *eax = op; 619c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *ecx = count; 620c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __cpuid(eax, ebx, ecx, edx); 621c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 622c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 623c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 624c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * CPUID functions returning a single datum 625c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 626c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int cpuid_eax(unsigned int op) 627c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 628c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int eax, ebx, ecx, edx; 629c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 630c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpuid(op, &eax, &ebx, &ecx, &edx); 631c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return eax; 632c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 633c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int cpuid_ebx(unsigned int op) 634c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 635c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int eax, ebx, ecx, edx; 636c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 637c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpuid(op, &eax, &ebx, &ecx, &edx); 638c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ebx; 639c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 640c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int cpuid_ecx(unsigned int op) 641c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 642c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int eax, ebx, ecx, edx; 643c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 644c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpuid(op, &eax, &ebx, &ecx, &edx); 645c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ecx; 646c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 647c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int cpuid_edx(unsigned int op) 648c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 649c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int eax, ebx, ecx, edx; 650c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 651c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpuid(op, &eax, &ebx, &ecx, &edx); 652c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return edx; 653c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 654c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 655c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* generic versions from gas */ 656c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP1 ".byte 0x90\n" 657c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP2 ".byte 0x89,0xf6\n" 658c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP3 ".byte 0x8d,0x76,0x00\n" 659c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP4 ".byte 0x8d,0x74,0x26,0x00\n" 660c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP5 GENERIC_NOP1 GENERIC_NOP4 661c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP6 ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n" 662c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP7 ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n" 663c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define GENERIC_NOP8 GENERIC_NOP1 GENERIC_NOP7 664c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 665c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Opteron nops */ 666c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP1 GENERIC_NOP1 667c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP2 ".byte 0x66,0x90\n" 668c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP3 ".byte 0x66,0x66,0x90\n" 669c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP4 ".byte 0x66,0x66,0x66,0x90\n" 670c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP5 K8_NOP3 K8_NOP2 671c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP6 K8_NOP3 K8_NOP3 672c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP7 K8_NOP4 K8_NOP3 673c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K8_NOP8 K8_NOP4 K8_NOP4 674c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 675c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* K7 nops */ 676c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* uses eax dependencies (arbitary choice) */ 677c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP1 GENERIC_NOP1 678c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP2 ".byte 0x8b,0xc0\n" 679c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP3 ".byte 0x8d,0x04,0x20\n" 680c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP4 ".byte 0x8d,0x44,0x20,0x00\n" 681c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP5 K7_NOP4 ASM_NOP1 682c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP6 ".byte 0x8d,0x80,0,0,0,0\n" 683c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP7 ".byte 0x8D,0x04,0x05,0,0,0,0\n" 684c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define K7_NOP8 K7_NOP7 ASM_NOP1 685c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 686c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* P6 nops */ 687c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* uses eax dependencies (Intel-recommended choice) */ 688c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP1 GENERIC_NOP1 689c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP2 ".byte 0x66,0x90\n" 690c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP3 ".byte 0x0f,0x1f,0x00\n" 691c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP4 ".byte 0x0f,0x1f,0x40,0\n" 692c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP5 ".byte 0x0f,0x1f,0x44,0x00,0\n" 693c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP6 ".byte 0x66,0x0f,0x1f,0x44,0x00,0\n" 694c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP7 ".byte 0x0f,0x1f,0x80,0,0,0,0\n" 695c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define P6_NOP8 ".byte 0x0f,0x1f,0x84,0x00,0,0,0,0\n" 696c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 697c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_MK8 698c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP1 K8_NOP1 699c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP2 K8_NOP2 700c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP3 K8_NOP3 701c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP4 K8_NOP4 702c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP5 K8_NOP5 703c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP6 K8_NOP6 704c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP7 K8_NOP7 705c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP8 K8_NOP8 706c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#elif defined(CONFIG_MK7) 707c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP1 K7_NOP1 708c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP2 K7_NOP2 709c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP3 K7_NOP3 710c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP4 K7_NOP4 711c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP5 K7_NOP5 712c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP6 K7_NOP6 713c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP7 K7_NOP7 714c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP8 K7_NOP8 715c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#elif defined(CONFIG_M686) || defined(CONFIG_MPENTIUMII) || \ 716c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru defined(CONFIG_MPENTIUMIII) || defined(CONFIG_MPENTIUMM) || \ 717c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru defined(CONFIG_MCORE2) || defined(CONFIG_PENTIUM4) 718c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP1 P6_NOP1 719c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP2 P6_NOP2 720c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP3 P6_NOP3 721c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP4 P6_NOP4 722c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP5 P6_NOP5 723c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP6 P6_NOP6 724c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP7 P6_NOP7 725c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP8 P6_NOP8 726c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 727c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP1 GENERIC_NOP1 728c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP2 GENERIC_NOP2 729c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP3 GENERIC_NOP3 730c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP4 GENERIC_NOP4 731c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP5 GENERIC_NOP5 732c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP6 GENERIC_NOP6 733c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP7 GENERIC_NOP7 734c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP8 GENERIC_NOP8 735c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 736c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 737c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASM_NOP_MAX 8 738c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 739c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Prefetch instructions for Pentium III and AMD Athlon */ 740c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* It's not worth to care about 3dnow! prefetches for the K6 741c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru because they are microcoded there and very slow. 742c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru However we don't do prefetches for pre XP Athlons currently 743c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru That should be fixed. */ 744c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ARCH_HAS_PREFETCH 745c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void prefetch(const void *x) 746c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 747c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru alternative_input(ASM_NOP4, 748c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "prefetchnta (%1)", 749c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru X86_FEATURE_XMM, 750c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "r" (x)); 751c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 752c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 753c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ARCH_HAS_PREFETCH 754c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ARCH_HAS_PREFETCHW 755c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ARCH_HAS_SPINLOCK_PREFETCH 756c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 757c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 3dnow! prefetch to get an exclusive cache line. Useful for 758c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlocks to avoid one state transition in the cache coherency protocol. */ 759c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void prefetchw(const void *x) 760c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 761c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru alternative_input(ASM_NOP4, 762c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "prefetchw (%1)", 763c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru X86_FEATURE_3DNOW, 764c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "r" (x)); 765c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 766c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define spin_lock_prefetch(x) prefetchw(x) 767c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 768c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void select_idle_routine(const struct cpuinfo_x86 *c); 769c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 770c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define cache_line_size() (boot_cpu_data.x86_cache_alignment) 771c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 772c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long boot_option_idle_override; 773c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void enable_sep_cpu(void); 774c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sysenter_setup(void); 775c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 776c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Defined in head.S */ 777c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct Xgt_desc_struct early_gdt_descr; 778c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 779c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void cpu_set_gdt(int); 780c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void switch_to_new_gdt(void); 781c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void cpu_init(void); 782c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void init_gdt(int cpu); 783c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 784c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int force_mwait; 785c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 786c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __ASM_I386_PROCESSOR_H */ 787