diff options
| -rw-r--r-- | arch/x86/include/asm/io.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/processor.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/sigcontext.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/xsave.h | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/mpparse.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/xsave.c | 2 | ||||
| -rw-r--r-- | arch/x86/mm/gup.c | 16 | ||||
| -rw-r--r-- | arch/x86/mm/ioremap.c | 23 | ||||
| -rw-r--r-- | arch/x86/mm/pat.c | 2 |
10 files changed, 57 insertions, 19 deletions
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index e5383e3d2f8c..73739322b6d0 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
| @@ -193,8 +193,10 @@ extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size); | |||
| 193 | */ | 193 | */ |
| 194 | extern void early_ioremap_init(void); | 194 | extern void early_ioremap_init(void); |
| 195 | extern void early_ioremap_reset(void); | 195 | extern void early_ioremap_reset(void); |
| 196 | extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); | 196 | extern void __iomem *early_ioremap(resource_size_t phys_addr, |
| 197 | extern void __iomem *early_memremap(unsigned long offset, unsigned long size); | 197 | unsigned long size); |
| 198 | extern void __iomem *early_memremap(resource_size_t phys_addr, | ||
| 199 | unsigned long size); | ||
| 198 | extern void early_iounmap(void __iomem *addr, unsigned long size); | 200 | extern void early_iounmap(void __iomem *addr, unsigned long size); |
| 199 | 201 | ||
| 200 | #define IO_SPACE_LIMIT 0xffff | 202 | #define IO_SPACE_LIMIT 0xffff |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 34c52370f2fe..fcf4d92e7e04 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -352,6 +352,11 @@ struct i387_soft_struct { | |||
| 352 | u32 entry_eip; | 352 | u32 entry_eip; |
| 353 | }; | 353 | }; |
| 354 | 354 | ||
| 355 | struct ymmh_struct { | ||
| 356 | /* 16 * 16 bytes for each YMMH-reg = 256 bytes */ | ||
| 357 | u32 ymmh_space[64]; | ||
| 358 | }; | ||
| 359 | |||
| 355 | struct xsave_hdr_struct { | 360 | struct xsave_hdr_struct { |
| 356 | u64 xstate_bv; | 361 | u64 xstate_bv; |
| 357 | u64 reserved1[2]; | 362 | u64 reserved1[2]; |
| @@ -361,6 +366,7 @@ struct xsave_hdr_struct { | |||
| 361 | struct xsave_struct { | 366 | struct xsave_struct { |
| 362 | struct i387_fxsave_struct i387; | 367 | struct i387_fxsave_struct i387; |
| 363 | struct xsave_hdr_struct xsave_hdr; | 368 | struct xsave_hdr_struct xsave_hdr; |
| 369 | struct ymmh_struct ymmh; | ||
| 364 | /* new processor state extensions will go here */ | 370 | /* new processor state extensions will go here */ |
| 365 | } __attribute__ ((packed, aligned (64))); | 371 | } __attribute__ ((packed, aligned (64))); |
| 366 | 372 | ||
diff --git a/arch/x86/include/asm/sigcontext.h b/arch/x86/include/asm/sigcontext.h index ec666491aaa4..72e5a4491661 100644 --- a/arch/x86/include/asm/sigcontext.h +++ b/arch/x86/include/asm/sigcontext.h | |||
| @@ -269,6 +269,11 @@ struct _xsave_hdr { | |||
| 269 | __u64 reserved2[5]; | 269 | __u64 reserved2[5]; |
| 270 | }; | 270 | }; |
| 271 | 271 | ||
| 272 | struct _ymmh_state { | ||
| 273 | /* 16 * 16 bytes for each YMMH-reg */ | ||
| 274 | __u32 ymmh_space[64]; | ||
| 275 | }; | ||
| 276 | |||
| 272 | /* | 277 | /* |
| 273 | * Extended state pointed by the fpstate pointer in the sigcontext. | 278 | * Extended state pointed by the fpstate pointer in the sigcontext. |
| 274 | * In addition to the fpstate, information encoded in the xstate_hdr | 279 | * In addition to the fpstate, information encoded in the xstate_hdr |
| @@ -278,6 +283,7 @@ struct _xsave_hdr { | |||
| 278 | struct _xstate { | 283 | struct _xstate { |
| 279 | struct _fpstate fpstate; | 284 | struct _fpstate fpstate; |
| 280 | struct _xsave_hdr xstate_hdr; | 285 | struct _xsave_hdr xstate_hdr; |
| 286 | struct _ymmh_state ymmh; | ||
| 281 | /* new processor state extensions go here */ | 287 | /* new processor state extensions go here */ |
| 282 | }; | 288 | }; |
| 283 | 289 | ||
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 08e9a1ac07a9..727acc152344 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #define XSTATE_FP 0x1 | 8 | #define XSTATE_FP 0x1 |
| 9 | #define XSTATE_SSE 0x2 | 9 | #define XSTATE_SSE 0x2 |
| 10 | #define XSTATE_YMM 0x4 | ||
| 10 | 11 | ||
| 11 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) | 12 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) |
| 12 | 13 | ||
| @@ -15,7 +16,7 @@ | |||
| 15 | /* | 16 | /* |
| 16 | * These are the features that the OS can handle currently. | 17 | * These are the features that the OS can handle currently. |
| 17 | */ | 18 | */ |
| 18 | #define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE) | 19 | #define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) |
| 19 | 20 | ||
| 20 | #ifdef CONFIG_X86_64 | 21 | #ifdef CONFIG_X86_64 |
| 21 | #define REX_PREFIX "0x48, " | 22 | #define REX_PREFIX "0x48, " |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 767fe7e46d68..a2789e42e162 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -2524,7 +2524,6 @@ static void irq_complete_move(struct irq_desc **descp) | |||
| 2524 | static inline void irq_complete_move(struct irq_desc **descp) {} | 2524 | static inline void irq_complete_move(struct irq_desc **descp) {} |
| 2525 | #endif | 2525 | #endif |
| 2526 | 2526 | ||
| 2527 | #ifdef CONFIG_X86_X2APIC | ||
| 2528 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | 2527 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) |
| 2529 | { | 2528 | { |
| 2530 | int apic, pin; | 2529 | int apic, pin; |
| @@ -2558,6 +2557,7 @@ eoi_ioapic_irq(struct irq_desc *desc) | |||
| 2558 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2557 | spin_unlock_irqrestore(&ioapic_lock, flags); |
| 2559 | } | 2558 | } |
| 2560 | 2559 | ||
| 2560 | #ifdef CONFIG_X86_X2APIC | ||
| 2561 | static void ack_x2apic_level(unsigned int irq) | 2561 | static void ack_x2apic_level(unsigned int irq) |
| 2562 | { | 2562 | { |
| 2563 | struct irq_desc *desc = irq_to_desc(irq); | 2563 | struct irq_desc *desc = irq_to_desc(irq); |
| @@ -2634,6 +2634,9 @@ static void ack_apic_level(unsigned int irq) | |||
| 2634 | */ | 2634 | */ |
| 2635 | ack_APIC_irq(); | 2635 | ack_APIC_irq(); |
| 2636 | 2636 | ||
| 2637 | if (irq_remapped(irq)) | ||
| 2638 | eoi_ioapic_irq(desc); | ||
| 2639 | |||
| 2637 | /* Now we can move and renable the irq */ | 2640 | /* Now we can move and renable the irq */ |
| 2638 | if (unlikely(do_unmask_irq)) { | 2641 | if (unlikely(do_unmask_irq)) { |
| 2639 | /* Only migrate the irq if the ack has been received. | 2642 | /* Only migrate the irq if the ack has been received. |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index dce99dca6cf8..70fd7e414c15 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -679,7 +679,7 @@ void __init get_smp_config(void) | |||
| 679 | __get_smp_config(0); | 679 | __get_smp_config(0); |
| 680 | } | 680 | } |
| 681 | 681 | ||
| 682 | static void smp_reserve_bootmem(struct mpf_intel *mpf) | 682 | static void __init smp_reserve_bootmem(struct mpf_intel *mpf) |
| 683 | { | 683 | { |
| 684 | unsigned long size = get_mpc_size(mpf->physptr); | 684 | unsigned long size = get_mpc_size(mpf->physptr); |
| 685 | #ifdef CONFIG_X86_32 | 685 | #ifdef CONFIG_X86_32 |
| @@ -838,7 +838,7 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) | |||
| 838 | 838 | ||
| 839 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; | 839 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; |
| 840 | 840 | ||
| 841 | static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) | 841 | static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) |
| 842 | { | 842 | { |
| 843 | int i; | 843 | int i; |
| 844 | 844 | ||
| @@ -866,7 +866,8 @@ static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) | |||
| 866 | } | 866 | } |
| 867 | } | 867 | } |
| 868 | #else /* CONFIG_X86_IO_APIC */ | 868 | #else /* CONFIG_X86_IO_APIC */ |
| 869 | static inline void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} | 869 | static |
| 870 | inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} | ||
| 870 | #endif /* CONFIG_X86_IO_APIC */ | 871 | #endif /* CONFIG_X86_IO_APIC */ |
| 871 | 872 | ||
| 872 | static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, | 873 | static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, |
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index 2b54fe002e94..0a5b04aa98f1 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
| @@ -324,7 +324,7 @@ void __ref xsave_cntxt_init(void) | |||
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | /* | 326 | /* |
| 327 | * for now OS knows only about FP/SSE | 327 | * Support only the state known to OS. |
| 328 | */ | 328 | */ |
| 329 | pcntxt_mask = pcntxt_mask & XCNTXT_MASK; | 329 | pcntxt_mask = pcntxt_mask & XCNTXT_MASK; |
| 330 | xsave_init(); | 330 | xsave_init(); |
diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c index be54176e9eb2..6340cef6798a 100644 --- a/arch/x86/mm/gup.c +++ b/arch/x86/mm/gup.c | |||
| @@ -219,6 +219,22 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end, | |||
| 219 | return 1; | 219 | return 1; |
| 220 | } | 220 | } |
| 221 | 221 | ||
| 222 | /** | ||
| 223 | * get_user_pages_fast() - pin user pages in memory | ||
| 224 | * @start: starting user address | ||
| 225 | * @nr_pages: number of pages from start to pin | ||
| 226 | * @write: whether pages will be written to | ||
| 227 | * @pages: array that receives pointers to the pages pinned. | ||
| 228 | * Should be at least nr_pages long. | ||
| 229 | * | ||
| 230 | * Attempt to pin user pages in memory without taking mm->mmap_sem. | ||
| 231 | * If not successful, it will fall back to taking the lock and | ||
| 232 | * calling get_user_pages(). | ||
| 233 | * | ||
| 234 | * Returns number of pages pinned. This may be fewer than the number | ||
| 235 | * requested. If nr_pages is 0 or negative, returns 0. If no pages | ||
| 236 | * were pinned, returns -errno. | ||
| 237 | */ | ||
| 222 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 238 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
| 223 | struct page **pages) | 239 | struct page **pages) |
| 224 | { | 240 | { |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 0dfa09d69e80..09daebfdb11c 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -547,7 +547,7 @@ void __init early_ioremap_reset(void) | |||
| 547 | } | 547 | } |
| 548 | 548 | ||
| 549 | static void __init __early_set_fixmap(enum fixed_addresses idx, | 549 | static void __init __early_set_fixmap(enum fixed_addresses idx, |
| 550 | unsigned long phys, pgprot_t flags) | 550 | phys_addr_t phys, pgprot_t flags) |
| 551 | { | 551 | { |
| 552 | unsigned long addr = __fix_to_virt(idx); | 552 | unsigned long addr = __fix_to_virt(idx); |
| 553 | pte_t *pte; | 553 | pte_t *pte; |
| @@ -566,7 +566,7 @@ static void __init __early_set_fixmap(enum fixed_addresses idx, | |||
| 566 | } | 566 | } |
| 567 | 567 | ||
| 568 | static inline void __init early_set_fixmap(enum fixed_addresses idx, | 568 | static inline void __init early_set_fixmap(enum fixed_addresses idx, |
| 569 | unsigned long phys, pgprot_t prot) | 569 | phys_addr_t phys, pgprot_t prot) |
| 570 | { | 570 | { |
| 571 | if (after_paging_init) | 571 | if (after_paging_init) |
| 572 | __set_fixmap(idx, phys, prot); | 572 | __set_fixmap(idx, phys, prot); |
| @@ -607,9 +607,10 @@ static int __init check_early_ioremap_leak(void) | |||
| 607 | late_initcall(check_early_ioremap_leak); | 607 | late_initcall(check_early_ioremap_leak); |
| 608 | 608 | ||
| 609 | static void __init __iomem * | 609 | static void __init __iomem * |
| 610 | __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) | 610 | __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot) |
| 611 | { | 611 | { |
| 612 | unsigned long offset, last_addr; | 612 | unsigned long offset; |
| 613 | resource_size_t last_addr; | ||
| 613 | unsigned int nrpages; | 614 | unsigned int nrpages; |
| 614 | enum fixed_addresses idx0, idx; | 615 | enum fixed_addresses idx0, idx; |
| 615 | int i, slot; | 616 | int i, slot; |
| @@ -625,15 +626,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) | |||
| 625 | } | 626 | } |
| 626 | 627 | ||
| 627 | if (slot < 0) { | 628 | if (slot < 0) { |
| 628 | printk(KERN_INFO "early_iomap(%08lx, %08lx) not found slot\n", | 629 | printk(KERN_INFO "early_iomap(%08llx, %08lx) not found slot\n", |
| 629 | phys_addr, size); | 630 | (u64)phys_addr, size); |
| 630 | WARN_ON(1); | 631 | WARN_ON(1); |
| 631 | return NULL; | 632 | return NULL; |
| 632 | } | 633 | } |
| 633 | 634 | ||
| 634 | if (early_ioremap_debug) { | 635 | if (early_ioremap_debug) { |
| 635 | printk(KERN_INFO "early_ioremap(%08lx, %08lx) [%d] => ", | 636 | printk(KERN_INFO "early_ioremap(%08llx, %08lx) [%d] => ", |
| 636 | phys_addr, size, slot); | 637 | (u64)phys_addr, size, slot); |
| 637 | dump_stack(); | 638 | dump_stack(); |
| 638 | } | 639 | } |
| 639 | 640 | ||
| @@ -680,13 +681,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) | |||
| 680 | } | 681 | } |
| 681 | 682 | ||
| 682 | /* Remap an IO device */ | 683 | /* Remap an IO device */ |
| 683 | void __init __iomem *early_ioremap(unsigned long phys_addr, unsigned long size) | 684 | void __init __iomem * |
| 685 | early_ioremap(resource_size_t phys_addr, unsigned long size) | ||
| 684 | { | 686 | { |
| 685 | return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO); | 687 | return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO); |
| 686 | } | 688 | } |
| 687 | 689 | ||
| 688 | /* Remap memory */ | 690 | /* Remap memory */ |
| 689 | void __init __iomem *early_memremap(unsigned long phys_addr, unsigned long size) | 691 | void __init __iomem * |
| 692 | early_memremap(resource_size_t phys_addr, unsigned long size) | ||
| 690 | { | 693 | { |
| 691 | return __early_ioremap(phys_addr, size, PAGE_KERNEL); | 694 | return __early_ioremap(phys_addr, size, PAGE_KERNEL); |
| 692 | } | 695 | } |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 640339ee4fb2..c009a241d562 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #ifdef CONFIG_X86_PAT | 31 | #ifdef CONFIG_X86_PAT |
| 32 | int __read_mostly pat_enabled = 1; | 32 | int __read_mostly pat_enabled = 1; |
| 33 | 33 | ||
| 34 | void __cpuinit pat_disable(const char *reason) | 34 | static inline void pat_disable(const char *reason) |
| 35 | { | 35 | { |
| 36 | pat_enabled = 0; | 36 | pat_enabled = 0; |
| 37 | printk(KERN_INFO "%s\n", reason); | 37 | printk(KERN_INFO "%s\n", reason); |
