diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-13 14:32:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-13 14:32:09 -0400 |
commit | b8256b45d1245ad16221e8f965241267bd26c79d (patch) | |
tree | 88a72ca74e658322496f398fa579d51d10c69055 /arch/x86 | |
parent | 8255309b887fcac11f791913a2d1d0b966a40d32 (diff) | |
parent | a30469e7921a6dd2067e9e836d7787cfa0105627 (diff) |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86: add linux kernel support for YMM state
x86: fix wrong section of pat_disable & make it static
x86: Fix section mismatches in mpparse
x86: fix set_fixmap to use phys_addr_t
x86: Document get_user_pages_fast()
x86, intr-remap: fix eoi for interrupt remapping without x2apic
Diffstat (limited to 'arch/x86')
-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); |