diff options
Diffstat (limited to 'arch/x86/include/asm/processor.h')
| -rw-r--r-- | arch/x86/include/asm/processor.h | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 3bfd5235a9e..9874dd98a29 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -16,6 +16,7 @@ struct mm_struct; | |||
| 16 | #include <asm/cpufeature.h> | 16 | #include <asm/cpufeature.h> |
| 17 | #include <asm/system.h> | 17 | #include <asm/system.h> |
| 18 | #include <asm/page.h> | 18 | #include <asm/page.h> |
| 19 | #include <asm/pgtable_types.h> | ||
| 19 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
| 20 | #include <asm/msr.h> | 21 | #include <asm/msr.h> |
| 21 | #include <asm/desc_defs.h> | 22 | #include <asm/desc_defs.h> |
| @@ -73,7 +74,7 @@ struct cpuinfo_x86 { | |||
| 73 | char pad0; | 74 | char pad0; |
| 74 | #else | 75 | #else |
| 75 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ | 76 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ |
| 76 | int x86_tlbsize; | 77 | int x86_tlbsize; |
| 77 | __u8 x86_virt_bits; | 78 | __u8 x86_virt_bits; |
| 78 | __u8 x86_phys_bits; | 79 | __u8 x86_phys_bits; |
| 79 | #endif | 80 | #endif |
| @@ -93,7 +94,7 @@ struct cpuinfo_x86 { | |||
| 93 | unsigned long loops_per_jiffy; | 94 | unsigned long loops_per_jiffy; |
| 94 | #ifdef CONFIG_SMP | 95 | #ifdef CONFIG_SMP |
| 95 | /* cpus sharing the last level cache: */ | 96 | /* cpus sharing the last level cache: */ |
| 96 | cpumask_t llc_shared_map; | 97 | cpumask_var_t llc_shared_map; |
| 97 | #endif | 98 | #endif |
| 98 | /* cpuid returned max cores value: */ | 99 | /* cpuid returned max cores value: */ |
| 99 | u16 x86_max_cores; | 100 | u16 x86_max_cores; |
| @@ -247,7 +248,6 @@ struct x86_hw_tss { | |||
| 247 | #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) | 248 | #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) |
| 248 | #define IO_BITMAP_OFFSET offsetof(struct tss_struct, io_bitmap) | 249 | #define IO_BITMAP_OFFSET offsetof(struct tss_struct, io_bitmap) |
| 249 | #define INVALID_IO_BITMAP_OFFSET 0x8000 | 250 | #define INVALID_IO_BITMAP_OFFSET 0x8000 |
| 250 | #define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000 | ||
| 251 | 251 | ||
| 252 | struct tss_struct { | 252 | struct tss_struct { |
| 253 | /* | 253 | /* |
| @@ -262,11 +262,6 @@ struct tss_struct { | |||
| 262 | * be within the limit. | 262 | * be within the limit. |
| 263 | */ | 263 | */ |
| 264 | unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; | 264 | unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; |
| 265 | /* | ||
| 266 | * Cache the current maximum and the last task that used the bitmap: | ||
| 267 | */ | ||
| 268 | unsigned long io_bitmap_max; | ||
| 269 | struct thread_struct *io_bitmap_owner; | ||
| 270 | 265 | ||
| 271 | /* | 266 | /* |
| 272 | * .. and then another 0x100 bytes for the emergency kernel stack: | 267 | * .. and then another 0x100 bytes for the emergency kernel stack: |
| @@ -378,9 +373,30 @@ union thread_xstate { | |||
| 378 | 373 | ||
| 379 | #ifdef CONFIG_X86_64 | 374 | #ifdef CONFIG_X86_64 |
| 380 | DECLARE_PER_CPU(struct orig_ist, orig_ist); | 375 | DECLARE_PER_CPU(struct orig_ist, orig_ist); |
| 376 | |||
| 377 | union irq_stack_union { | ||
| 378 | char irq_stack[IRQ_STACK_SIZE]; | ||
| 379 | /* | ||
| 380 | * GCC hardcodes the stack canary as %gs:40. Since the | ||
| 381 | * irq_stack is the object at %gs:0, we reserve the bottom | ||
| 382 | * 48 bytes of the irq stack for the canary. | ||
| 383 | */ | ||
| 384 | struct { | ||
| 385 | char gs_base[40]; | ||
| 386 | unsigned long stack_canary; | ||
| 387 | }; | ||
| 388 | }; | ||
| 389 | |||
| 390 | DECLARE_PER_CPU(union irq_stack_union, irq_stack_union); | ||
| 391 | DECLARE_INIT_PER_CPU(irq_stack_union); | ||
| 392 | |||
| 393 | DECLARE_PER_CPU(char *, irq_stack_ptr); | ||
| 394 | #else /* X86_64 */ | ||
| 395 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 396 | DECLARE_PER_CPU(unsigned long, stack_canary); | ||
| 381 | #endif | 397 | #endif |
| 398 | #endif /* X86_64 */ | ||
| 382 | 399 | ||
| 383 | extern void print_cpu_info(struct cpuinfo_x86 *); | ||
| 384 | extern unsigned int xstate_size; | 400 | extern unsigned int xstate_size; |
| 385 | extern void free_thread_xstate(struct task_struct *); | 401 | extern void free_thread_xstate(struct task_struct *); |
| 386 | extern struct kmem_cache *task_xstate_cachep; | 402 | extern struct kmem_cache *task_xstate_cachep; |
| @@ -717,6 +733,7 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx) | |||
| 717 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); | 733 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); |
| 718 | 734 | ||
| 719 | extern void select_idle_routine(const struct cpuinfo_x86 *c); | 735 | extern void select_idle_routine(const struct cpuinfo_x86 *c); |
| 736 | extern void init_c1e_mask(void); | ||
| 720 | 737 | ||
| 721 | extern unsigned long boot_option_idle_override; | 738 | extern unsigned long boot_option_idle_override; |
| 722 | extern unsigned long idle_halt; | 739 | extern unsigned long idle_halt; |
| @@ -752,9 +769,9 @@ extern int sysenter_setup(void); | |||
| 752 | extern struct desc_ptr early_gdt_descr; | 769 | extern struct desc_ptr early_gdt_descr; |
| 753 | 770 | ||
| 754 | extern void cpu_set_gdt(int); | 771 | extern void cpu_set_gdt(int); |
| 755 | extern void switch_to_new_gdt(void); | 772 | extern void switch_to_new_gdt(int); |
| 773 | extern void load_percpu_segment(int); | ||
| 756 | extern void cpu_init(void); | 774 | extern void cpu_init(void); |
| 757 | extern void init_gdt(int cpu); | ||
| 758 | 775 | ||
| 759 | static inline unsigned long get_debugctlmsr(void) | 776 | static inline unsigned long get_debugctlmsr(void) |
| 760 | { | 777 | { |
| @@ -839,6 +856,7 @@ static inline void spin_lock_prefetch(const void *x) | |||
| 839 | * User space process size: 3GB (default). | 856 | * User space process size: 3GB (default). |
| 840 | */ | 857 | */ |
| 841 | #define TASK_SIZE PAGE_OFFSET | 858 | #define TASK_SIZE PAGE_OFFSET |
| 859 | #define TASK_SIZE_MAX TASK_SIZE | ||
| 842 | #define STACK_TOP TASK_SIZE | 860 | #define STACK_TOP TASK_SIZE |
| 843 | #define STACK_TOP_MAX STACK_TOP | 861 | #define STACK_TOP_MAX STACK_TOP |
| 844 | 862 | ||
| @@ -898,7 +916,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
| 898 | /* | 916 | /* |
| 899 | * User space process size. 47bits minus one guard page. | 917 | * User space process size. 47bits minus one guard page. |
| 900 | */ | 918 | */ |
| 901 | #define TASK_SIZE64 ((1UL << 47) - PAGE_SIZE) | 919 | #define TASK_SIZE_MAX ((1UL << 47) - PAGE_SIZE) |
| 902 | 920 | ||
| 903 | /* This decides where the kernel will search for a free chunk of vm | 921 | /* This decides where the kernel will search for a free chunk of vm |
| 904 | * space during mmap's. | 922 | * space during mmap's. |
| @@ -907,12 +925,12 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
| 907 | 0xc0000000 : 0xFFFFe000) | 925 | 0xc0000000 : 0xFFFFe000) |
| 908 | 926 | ||
| 909 | #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ | 927 | #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ |
| 910 | IA32_PAGE_OFFSET : TASK_SIZE64) | 928 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
| 911 | #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? \ | 929 | #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? \ |
| 912 | IA32_PAGE_OFFSET : TASK_SIZE64) | 930 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
| 913 | 931 | ||
| 914 | #define STACK_TOP TASK_SIZE | 932 | #define STACK_TOP TASK_SIZE |
| 915 | #define STACK_TOP_MAX TASK_SIZE64 | 933 | #define STACK_TOP_MAX TASK_SIZE_MAX |
| 916 | 934 | ||
| 917 | #define INIT_THREAD { \ | 935 | #define INIT_THREAD { \ |
| 918 | .sp0 = (unsigned long)&init_stack + sizeof(init_stack) \ | 936 | .sp0 = (unsigned long)&init_stack + sizeof(init_stack) \ |
