aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm/processor.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/include/asm/processor.h')
-rw-r--r--arch/x86/include/asm/processor.h45
1 files changed, 10 insertions, 35 deletions
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index ebaa04a8d3af..b844edc69fe9 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -94,10 +94,6 @@ struct cpuinfo_x86 {
94 int x86_cache_alignment; /* In bytes */ 94 int x86_cache_alignment; /* In bytes */
95 int x86_power; 95 int x86_power;
96 unsigned long loops_per_jiffy; 96 unsigned long loops_per_jiffy;
97#ifdef CONFIG_SMP
98 /* cpus sharing the last level cache: */
99 cpumask_var_t llc_shared_map;
100#endif
101 /* cpuid returned max cores value: */ 97 /* cpuid returned max cores value: */
102 u16 x86_max_cores; 98 u16 x86_max_cores;
103 u16 apicid; 99 u16 apicid;
@@ -110,6 +106,8 @@ struct cpuinfo_x86 {
110 u16 phys_proc_id; 106 u16 phys_proc_id;
111 /* Core id: */ 107 /* Core id: */
112 u16 cpu_core_id; 108 u16 cpu_core_id;
109 /* Compute unit id */
110 u8 compute_unit_id;
113 /* Index into per_cpu list: */ 111 /* Index into per_cpu list: */
114 u16 cpu_index; 112 u16 cpu_index;
115#endif 113#endif
@@ -139,10 +137,9 @@ extern __u32 cpu_caps_set[NCAPINTS];
139#ifdef CONFIG_SMP 137#ifdef CONFIG_SMP
140DECLARE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); 138DECLARE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);
141#define cpu_data(cpu) per_cpu(cpu_info, cpu) 139#define cpu_data(cpu) per_cpu(cpu_info, cpu)
142#define current_cpu_data __get_cpu_var(cpu_info)
143#else 140#else
141#define cpu_info boot_cpu_data
144#define cpu_data(cpu) boot_cpu_data 142#define cpu_data(cpu) boot_cpu_data
145#define current_cpu_data boot_cpu_data
146#endif 143#endif
147 144
148extern const struct seq_operations cpuinfo_op; 145extern const struct seq_operations cpuinfo_op;
@@ -606,7 +603,7 @@ extern unsigned long mmu_cr4_features;
606 603
607static inline void set_in_cr4(unsigned long mask) 604static inline void set_in_cr4(unsigned long mask)
608{ 605{
609 unsigned cr4; 606 unsigned long cr4;
610 607
611 mmu_cr4_features |= mask; 608 mmu_cr4_features |= mask;
612 cr4 = read_cr4(); 609 cr4 = read_cr4();
@@ -616,7 +613,7 @@ static inline void set_in_cr4(unsigned long mask)
616 613
617static inline void clear_in_cr4(unsigned long mask) 614static inline void clear_in_cr4(unsigned long mask)
618{ 615{
619 unsigned cr4; 616 unsigned long cr4;
620 617
621 mmu_cr4_features &= ~mask; 618 mmu_cr4_features &= ~mask;
622 cr4 = read_cr4(); 619 cr4 = read_cr4();
@@ -761,35 +758,13 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
761extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); 758extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx);
762 759
763extern void select_idle_routine(const struct cpuinfo_x86 *c); 760extern void select_idle_routine(const struct cpuinfo_x86 *c);
764extern void init_c1e_mask(void); 761extern void init_amd_e400_c1e_mask(void);
765 762
766extern unsigned long boot_option_idle_override; 763extern unsigned long boot_option_idle_override;
767extern unsigned long idle_halt; 764extern bool amd_e400_c1e_detected;
768extern unsigned long idle_nomwait;
769extern bool c1e_detected;
770 765
771/* 766enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT,
772 * on systems with caches, caches must be flashed as the absolute 767 IDLE_POLL, IDLE_FORCE_MWAIT};
773 * last instruction before going into a suspended halt. Otherwise,
774 * dirty data can linger in the cache and become stale on resume,
775 * leading to strange errors.
776 *
777 * perform a variety of operations to guarantee that the compiler
778 * will not reorder instructions. wbinvd itself is serializing
779 * so the processor will not reorder.
780 *
781 * Systems without cache can just go into halt.
782 */
783static inline void wbinvd_halt(void)
784{
785 mb();
786 /* check for clflush to determine if wbinvd is legal */
787 if (cpu_has_clflush)
788 asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory");
789 else
790 while (1)
791 halt();
792}
793 768
794extern void enable_sep_cpu(void); 769extern void enable_sep_cpu(void);
795extern int sysenter_setup(void); 770extern int sysenter_setup(void);
@@ -927,7 +902,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
927/* 902/*
928 * The below -8 is to reserve 8 bytes on top of the ring0 stack. 903 * The below -8 is to reserve 8 bytes on top of the ring0 stack.
929 * This is necessary to guarantee that the entire "struct pt_regs" 904 * This is necessary to guarantee that the entire "struct pt_regs"
930 * is accessable even if the CPU haven't stored the SS/ESP registers 905 * is accessible even if the CPU haven't stored the SS/ESP registers
931 * on the stack (interrupt gate does not save these registers 906 * on the stack (interrupt gate does not save these registers
932 * when switching to the same priv ring). 907 * when switching to the same priv ring).
933 * Therefore beware: accessing the ss/esp fields of the 908 * Therefore beware: accessing the ss/esp fields of the