diff options
Diffstat (limited to 'arch')
35 files changed, 131 insertions, 94 deletions
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index d63f3de0cd5b..0c14d8a52683 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <asm/pgalloc.h> | 17 | #include <asm/pgalloc.h> |
18 | #include <asm/mmu.h> | 18 | #include <asm/mmu.h> |
19 | 19 | ||
20 | static int handle_vmalloc_fault(struct mm_struct *mm, unsigned long address) | 20 | static int handle_vmalloc_fault(unsigned long address) |
21 | { | 21 | { |
22 | /* | 22 | /* |
23 | * Synchronize this task's top level page-table | 23 | * Synchronize this task's top level page-table |
@@ -27,7 +27,7 @@ static int handle_vmalloc_fault(struct mm_struct *mm, unsigned long address) | |||
27 | pud_t *pud, *pud_k; | 27 | pud_t *pud, *pud_k; |
28 | pmd_t *pmd, *pmd_k; | 28 | pmd_t *pmd, *pmd_k; |
29 | 29 | ||
30 | pgd = pgd_offset_fast(mm, address); | 30 | pgd = pgd_offset_fast(current->active_mm, address); |
31 | pgd_k = pgd_offset_k(address); | 31 | pgd_k = pgd_offset_k(address); |
32 | 32 | ||
33 | if (!pgd_present(*pgd_k)) | 33 | if (!pgd_present(*pgd_k)) |
@@ -72,7 +72,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address) | |||
72 | * nothing more. | 72 | * nothing more. |
73 | */ | 73 | */ |
74 | if (address >= VMALLOC_START && address <= VMALLOC_END) { | 74 | if (address >= VMALLOC_START && address <= VMALLOC_END) { |
75 | ret = handle_vmalloc_fault(mm, address); | 75 | ret = handle_vmalloc_fault(address); |
76 | if (unlikely(ret)) | 76 | if (unlikely(ret)) |
77 | goto bad_area_nosemaphore; | 77 | goto bad_area_nosemaphore; |
78 | else | 78 | else |
diff --git a/arch/arm/boot/dts/integratorcp.dts b/arch/arm/boot/dts/integratorcp.dts index ff1aea0ee043..72693a69f830 100644 --- a/arch/arm/boot/dts/integratorcp.dts +++ b/arch/arm/boot/dts/integratorcp.dts | |||
@@ -9,11 +9,6 @@ | |||
9 | model = "ARM Integrator/CP"; | 9 | model = "ARM Integrator/CP"; |
10 | compatible = "arm,integrator-cp"; | 10 | compatible = "arm,integrator-cp"; |
11 | 11 | ||
12 | aliases { | ||
13 | arm,timer-primary = &timer2; | ||
14 | arm,timer-secondary = &timer1; | ||
15 | }; | ||
16 | |||
17 | chosen { | 12 | chosen { |
18 | bootargs = "root=/dev/ram0 console=ttyAMA0,38400n8 earlyprintk"; | 13 | bootargs = "root=/dev/ram0 console=ttyAMA0,38400n8 earlyprintk"; |
19 | }; | 14 | }; |
@@ -24,14 +19,18 @@ | |||
24 | }; | 19 | }; |
25 | 20 | ||
26 | timer0: timer@13000000 { | 21 | timer0: timer@13000000 { |
22 | /* TIMER0 runs @ 25MHz */ | ||
27 | compatible = "arm,integrator-cp-timer"; | 23 | compatible = "arm,integrator-cp-timer"; |
24 | status = "disabled"; | ||
28 | }; | 25 | }; |
29 | 26 | ||
30 | timer1: timer@13000100 { | 27 | timer1: timer@13000100 { |
28 | /* TIMER1 runs @ 1MHz */ | ||
31 | compatible = "arm,integrator-cp-timer"; | 29 | compatible = "arm,integrator-cp-timer"; |
32 | }; | 30 | }; |
33 | 31 | ||
34 | timer2: timer@13000200 { | 32 | timer2: timer@13000200 { |
33 | /* TIMER2 runs @ 1MHz */ | ||
35 | compatible = "arm,integrator-cp-timer"; | 34 | compatible = "arm,integrator-cp-timer"; |
36 | }; | 35 | }; |
37 | 36 | ||
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index f50d223a0bd3..99b44e0e8d86 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c | |||
@@ -930,4 +930,5 @@ void bpf_jit_free(struct sk_filter *fp) | |||
930 | { | 930 | { |
931 | if (fp->bpf_func != sk_run_filter) | 931 | if (fp->bpf_func != sk_run_filter) |
932 | module_free(NULL, fp->bpf_func); | 932 | module_free(NULL, fp->bpf_func); |
933 | kfree(fp); | ||
933 | } | 934 | } |
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index 45f1ffcf1a4b..24cdf64789c3 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -971,11 +971,11 @@ static const struct mips_perf_event mipsxx74Kcore_cache_map | |||
971 | [C(LL)] = { | 971 | [C(LL)] = { |
972 | [C(OP_READ)] = { | 972 | [C(OP_READ)] = { |
973 | [C(RESULT_ACCESS)] = { 0x1c, CNTR_ODD, P }, | 973 | [C(RESULT_ACCESS)] = { 0x1c, CNTR_ODD, P }, |
974 | [C(RESULT_MISS)] = { 0x1d, CNTR_EVEN | CNTR_ODD, P }, | 974 | [C(RESULT_MISS)] = { 0x1d, CNTR_EVEN, P }, |
975 | }, | 975 | }, |
976 | [C(OP_WRITE)] = { | 976 | [C(OP_WRITE)] = { |
977 | [C(RESULT_ACCESS)] = { 0x1c, CNTR_ODD, P }, | 977 | [C(RESULT_ACCESS)] = { 0x1c, CNTR_ODD, P }, |
978 | [C(RESULT_MISS)] = { 0x1d, CNTR_EVEN | CNTR_ODD, P }, | 978 | [C(RESULT_MISS)] = { 0x1d, CNTR_EVEN, P }, |
979 | }, | 979 | }, |
980 | }, | 980 | }, |
981 | [C(ITLB)] = { | 981 | [C(ITLB)] = { |
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c index c69da3734699..5b28e81d94a0 100644 --- a/arch/mips/mti-malta/malta-int.c +++ b/arch/mips/mti-malta/malta-int.c | |||
@@ -473,7 +473,7 @@ static void __init fill_ipi_map(void) | |||
473 | { | 473 | { |
474 | int cpu; | 474 | int cpu; |
475 | 475 | ||
476 | for (cpu = 0; cpu < NR_CPUS; cpu++) { | 476 | for (cpu = 0; cpu < nr_cpu_ids; cpu++) { |
477 | fill_ipi_map1(gic_resched_int_base, cpu, GIC_CPU_INT1); | 477 | fill_ipi_map1(gic_resched_int_base, cpu, GIC_CPU_INT1); |
478 | fill_ipi_map1(gic_call_int_base, cpu, GIC_CPU_INT2); | 478 | fill_ipi_map1(gic_call_int_base, cpu, GIC_CPU_INT2); |
479 | } | 479 | } |
@@ -574,8 +574,9 @@ void __init arch_init_irq(void) | |||
574 | /* FIXME */ | 574 | /* FIXME */ |
575 | int i; | 575 | int i; |
576 | #if defined(CONFIG_MIPS_MT_SMP) | 576 | #if defined(CONFIG_MIPS_MT_SMP) |
577 | gic_call_int_base = GIC_NUM_INTRS - NR_CPUS; | 577 | gic_call_int_base = GIC_NUM_INTRS - |
578 | gic_resched_int_base = gic_call_int_base - NR_CPUS; | 578 | (NR_CPUS - nr_cpu_ids) * 2 - nr_cpu_ids; |
579 | gic_resched_int_base = gic_call_int_base - nr_cpu_ids; | ||
579 | fill_ipi_map(); | 580 | fill_ipi_map(); |
580 | #endif | 581 | #endif |
581 | gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map, | 582 | gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map, |
@@ -599,7 +600,7 @@ void __init arch_init_irq(void) | |||
599 | printk("CPU%d: status register now %08x\n", smp_processor_id(), read_c0_status()); | 600 | printk("CPU%d: status register now %08x\n", smp_processor_id(), read_c0_status()); |
600 | write_c0_status(0x1100dc00); | 601 | write_c0_status(0x1100dc00); |
601 | printk("CPU%d: status register frc %08x\n", smp_processor_id(), read_c0_status()); | 602 | printk("CPU%d: status register frc %08x\n", smp_processor_id(), read_c0_status()); |
602 | for (i = 0; i < NR_CPUS; i++) { | 603 | for (i = 0; i < nr_cpu_ids; i++) { |
603 | arch_init_ipiirq(MIPS_GIC_IRQ_BASE + | 604 | arch_init_ipiirq(MIPS_GIC_IRQ_BASE + |
604 | GIC_RESCHED_INT(i), &irq_resched); | 605 | GIC_RESCHED_INT(i), &irq_resched); |
605 | arch_init_ipiirq(MIPS_GIC_IRQ_BASE + | 606 | arch_init_ipiirq(MIPS_GIC_IRQ_BASE + |
diff --git a/arch/mips/ralink/timer.c b/arch/mips/ralink/timer.c index e49241a2c39a..202785709441 100644 --- a/arch/mips/ralink/timer.c +++ b/arch/mips/ralink/timer.c | |||
@@ -126,7 +126,7 @@ static int rt_timer_probe(struct platform_device *pdev) | |||
126 | return -ENOENT; | 126 | return -ENOENT; |
127 | } | 127 | } |
128 | 128 | ||
129 | rt->membase = devm_request_and_ioremap(&pdev->dev, res); | 129 | rt->membase = devm_ioremap_resource(&pdev->dev, res); |
130 | if (IS_ERR(rt->membase)) | 130 | if (IS_ERR(rt->membase)) |
131 | return PTR_ERR(rt->membase); | 131 | return PTR_ERR(rt->membase); |
132 | 132 | ||
diff --git a/arch/parisc/configs/712_defconfig b/arch/parisc/configs/712_defconfig index 0f90569b9d85..9387cc2693f6 100644 --- a/arch/parisc/configs/712_defconfig +++ b/arch/parisc/configs/712_defconfig | |||
@@ -40,6 +40,8 @@ CONFIG_IP_NF_QUEUE=m | |||
40 | CONFIG_LLC2=m | 40 | CONFIG_LLC2=m |
41 | CONFIG_NET_PKTGEN=m | 41 | CONFIG_NET_PKTGEN=m |
42 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 42 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
43 | CONFIG_DEVTMPFS=y | ||
44 | CONFIG_DEVTMPFS_MOUNT=y | ||
43 | # CONFIG_STANDALONE is not set | 45 | # CONFIG_STANDALONE is not set |
44 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 46 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
45 | CONFIG_PARPORT=y | 47 | CONFIG_PARPORT=y |
diff --git a/arch/parisc/configs/a500_defconfig b/arch/parisc/configs/a500_defconfig index b647b182dacc..90025322b75e 100644 --- a/arch/parisc/configs/a500_defconfig +++ b/arch/parisc/configs/a500_defconfig | |||
@@ -79,6 +79,8 @@ CONFIG_IP_DCCP=m | |||
79 | CONFIG_LLC2=m | 79 | CONFIG_LLC2=m |
80 | CONFIG_NET_PKTGEN=m | 80 | CONFIG_NET_PKTGEN=m |
81 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 81 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
82 | CONFIG_DEVTMPFS=y | ||
83 | CONFIG_DEVTMPFS_MOUNT=y | ||
82 | # CONFIG_STANDALONE is not set | 84 | # CONFIG_STANDALONE is not set |
83 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 85 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
84 | CONFIG_BLK_DEV_UMEM=m | 86 | CONFIG_BLK_DEV_UMEM=m |
diff --git a/arch/parisc/configs/b180_defconfig b/arch/parisc/configs/b180_defconfig index e289f5bf3148..f1a0c25bef8d 100644 --- a/arch/parisc/configs/b180_defconfig +++ b/arch/parisc/configs/b180_defconfig | |||
@@ -4,6 +4,7 @@ CONFIG_IKCONFIG=y | |||
4 | CONFIG_IKCONFIG_PROC=y | 4 | CONFIG_IKCONFIG_PROC=y |
5 | CONFIG_LOG_BUF_SHIFT=16 | 5 | CONFIG_LOG_BUF_SHIFT=16 |
6 | CONFIG_SYSFS_DEPRECATED_V2=y | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
7 | CONFIG_BLK_DEV_INITRD=y | ||
7 | CONFIG_SLAB=y | 8 | CONFIG_SLAB=y |
8 | CONFIG_MODULES=y | 9 | CONFIG_MODULES=y |
9 | CONFIG_MODVERSIONS=y | 10 | CONFIG_MODVERSIONS=y |
@@ -27,6 +28,8 @@ CONFIG_IP_PNP_BOOTP=y | |||
27 | # CONFIG_INET_LRO is not set | 28 | # CONFIG_INET_LRO is not set |
28 | CONFIG_IPV6=y | 29 | CONFIG_IPV6=y |
29 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 30 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
31 | CONFIG_DEVTMPFS=y | ||
32 | CONFIG_DEVTMPFS_MOUNT=y | ||
30 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 33 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
31 | CONFIG_PARPORT=y | 34 | CONFIG_PARPORT=y |
32 | CONFIG_PARPORT_PC=y | 35 | CONFIG_PARPORT_PC=y |
diff --git a/arch/parisc/configs/c3000_defconfig b/arch/parisc/configs/c3000_defconfig index 311ca367b622..ec1b014952b6 100644 --- a/arch/parisc/configs/c3000_defconfig +++ b/arch/parisc/configs/c3000_defconfig | |||
@@ -5,6 +5,7 @@ CONFIG_IKCONFIG=y | |||
5 | CONFIG_IKCONFIG_PROC=y | 5 | CONFIG_IKCONFIG_PROC=y |
6 | CONFIG_LOG_BUF_SHIFT=16 | 6 | CONFIG_LOG_BUF_SHIFT=16 |
7 | CONFIG_SYSFS_DEPRECATED_V2=y | 7 | CONFIG_SYSFS_DEPRECATED_V2=y |
8 | CONFIG_BLK_DEV_INITRD=y | ||
8 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 9 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
9 | CONFIG_EXPERT=y | 10 | CONFIG_EXPERT=y |
10 | CONFIG_KALLSYMS_ALL=y | 11 | CONFIG_KALLSYMS_ALL=y |
@@ -39,6 +40,8 @@ CONFIG_NETFILTER_DEBUG=y | |||
39 | CONFIG_IP_NF_QUEUE=m | 40 | CONFIG_IP_NF_QUEUE=m |
40 | CONFIG_NET_PKTGEN=m | 41 | CONFIG_NET_PKTGEN=m |
41 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 42 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
43 | CONFIG_DEVTMPFS=y | ||
44 | CONFIG_DEVTMPFS_MOUNT=y | ||
42 | # CONFIG_STANDALONE is not set | 45 | # CONFIG_STANDALONE is not set |
43 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 46 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
44 | CONFIG_BLK_DEV_UMEM=m | 47 | CONFIG_BLK_DEV_UMEM=m |
diff --git a/arch/parisc/configs/c8000_defconfig b/arch/parisc/configs/c8000_defconfig index f11006361297..e1c8d2015c89 100644 --- a/arch/parisc/configs/c8000_defconfig +++ b/arch/parisc/configs/c8000_defconfig | |||
@@ -62,6 +62,8 @@ CONFIG_TIPC=m | |||
62 | CONFIG_LLC2=m | 62 | CONFIG_LLC2=m |
63 | CONFIG_DNS_RESOLVER=y | 63 | CONFIG_DNS_RESOLVER=y |
64 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 64 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
65 | CONFIG_DEVTMPFS=y | ||
66 | CONFIG_DEVTMPFS_MOUNT=y | ||
65 | # CONFIG_STANDALONE is not set | 67 | # CONFIG_STANDALONE is not set |
66 | CONFIG_PARPORT=y | 68 | CONFIG_PARPORT=y |
67 | CONFIG_PARPORT_PC=y | 69 | CONFIG_PARPORT_PC=y |
diff --git a/arch/parisc/configs/default_defconfig b/arch/parisc/configs/default_defconfig index dfe88f6c95c4..ba61495e1fa4 100644 --- a/arch/parisc/configs/default_defconfig +++ b/arch/parisc/configs/default_defconfig | |||
@@ -49,6 +49,8 @@ CONFIG_INET6_ESP=y | |||
49 | CONFIG_INET6_IPCOMP=y | 49 | CONFIG_INET6_IPCOMP=y |
50 | CONFIG_LLC2=m | 50 | CONFIG_LLC2=m |
51 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 51 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
52 | CONFIG_DEVTMPFS=y | ||
53 | CONFIG_DEVTMPFS_MOUNT=y | ||
52 | # CONFIG_STANDALONE is not set | 54 | # CONFIG_STANDALONE is not set |
53 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 55 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
54 | CONFIG_PARPORT=y | 56 | CONFIG_PARPORT=y |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index b521c0adf4ec..c035673209f7 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
@@ -602,7 +602,6 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long | |||
602 | __flush_cache_page(vma, vmaddr, PFN_PHYS(pfn)); | 602 | __flush_cache_page(vma, vmaddr, PFN_PHYS(pfn)); |
603 | } | 603 | } |
604 | } | 604 | } |
605 | EXPORT_SYMBOL_GPL(flush_cache_page); | ||
606 | 605 | ||
607 | #ifdef CONFIG_PARISC_TMPALIAS | 606 | #ifdef CONFIG_PARISC_TMPALIAS |
608 | 607 | ||
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index 37aabd772fbb..d2d58258aea6 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -195,6 +195,8 @@ common_stext: | |||
195 | ldw MEM_PDC_HI(%r0),%r6 | 195 | ldw MEM_PDC_HI(%r0),%r6 |
196 | depd %r6, 31, 32, %r3 /* move to upper word */ | 196 | depd %r6, 31, 32, %r3 /* move to upper word */ |
197 | 197 | ||
198 | mfctl %cr30,%r6 /* PCX-W2 firmware bug */ | ||
199 | |||
198 | ldo PDC_PSW(%r0),%arg0 /* 21 */ | 200 | ldo PDC_PSW(%r0),%arg0 /* 21 */ |
199 | ldo PDC_PSW_SET_DEFAULTS(%r0),%arg1 /* 2 */ | 201 | ldo PDC_PSW_SET_DEFAULTS(%r0),%arg1 /* 2 */ |
200 | ldo PDC_PSW_WIDE_BIT(%r0),%arg2 /* 2 */ | 202 | ldo PDC_PSW_WIDE_BIT(%r0),%arg2 /* 2 */ |
@@ -203,6 +205,8 @@ common_stext: | |||
203 | copy %r0,%arg3 | 205 | copy %r0,%arg3 |
204 | 206 | ||
205 | stext_pdc_ret: | 207 | stext_pdc_ret: |
208 | mtctl %r6,%cr30 /* restore task thread info */ | ||
209 | |||
206 | /* restore rfi target address*/ | 210 | /* restore rfi target address*/ |
207 | ldd TI_TASK-THREAD_SZ_ALGN(%sp), %r10 | 211 | ldd TI_TASK-THREAD_SZ_ALGN(%sp), %r10 |
208 | tophys_r1 %r10 | 212 | tophys_r1 %r10 |
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index bf56e33f8257..2345bdb4d917 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c | |||
@@ -691,4 +691,5 @@ void bpf_jit_free(struct sk_filter *fp) | |||
691 | { | 691 | { |
692 | if (fp->bpf_func != sk_run_filter) | 692 | if (fp->bpf_func != sk_run_filter) |
693 | module_free(NULL, fp->bpf_func); | 693 | module_free(NULL, fp->bpf_func); |
694 | kfree(fp); | ||
694 | } | 695 | } |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 9b60a36c348d..2204400d0bd5 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -748,7 +748,9 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry) | |||
748 | 748 | ||
749 | static inline void pgste_set_pte(pte_t *ptep, pte_t entry) | 749 | static inline void pgste_set_pte(pte_t *ptep, pte_t entry) |
750 | { | 750 | { |
751 | if (!MACHINE_HAS_ESOP && (pte_val(entry) & _PAGE_WRITE)) { | 751 | if (!MACHINE_HAS_ESOP && |
752 | (pte_val(entry) & _PAGE_PRESENT) && | ||
753 | (pte_val(entry) & _PAGE_WRITE)) { | ||
752 | /* | 754 | /* |
753 | * Without enhanced suppression-on-protection force | 755 | * Without enhanced suppression-on-protection force |
754 | * the dirty bit on for all writable ptes. | 756 | * the dirty bit on for all writable ptes. |
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index 8ad8af915032..819b94d22720 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h | |||
@@ -71,30 +71,30 @@ static inline void local_tick_enable(unsigned long long comp) | |||
71 | 71 | ||
72 | typedef unsigned long long cycles_t; | 72 | typedef unsigned long long cycles_t; |
73 | 73 | ||
74 | static inline unsigned long long get_tod_clock(void) | ||
75 | { | ||
76 | unsigned long long clk; | ||
77 | |||
78 | #ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES | ||
79 | asm volatile(".insn s,0xb27c0000,%0" : "=Q" (clk) : : "cc"); | ||
80 | #else | ||
81 | asm volatile("stck %0" : "=Q" (clk) : : "cc"); | ||
82 | #endif | ||
83 | return clk; | ||
84 | } | ||
85 | |||
86 | static inline void get_tod_clock_ext(char *clk) | 74 | static inline void get_tod_clock_ext(char *clk) |
87 | { | 75 | { |
88 | asm volatile("stcke %0" : "=Q" (*clk) : : "cc"); | 76 | asm volatile("stcke %0" : "=Q" (*clk) : : "cc"); |
89 | } | 77 | } |
90 | 78 | ||
91 | static inline unsigned long long get_tod_clock_xt(void) | 79 | static inline unsigned long long get_tod_clock(void) |
92 | { | 80 | { |
93 | unsigned char clk[16]; | 81 | unsigned char clk[16]; |
94 | get_tod_clock_ext(clk); | 82 | get_tod_clock_ext(clk); |
95 | return *((unsigned long long *)&clk[1]); | 83 | return *((unsigned long long *)&clk[1]); |
96 | } | 84 | } |
97 | 85 | ||
86 | static inline unsigned long long get_tod_clock_fast(void) | ||
87 | { | ||
88 | #ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES | ||
89 | unsigned long long clk; | ||
90 | |||
91 | asm volatile("stckf %0" : "=Q" (clk) : : "cc"); | ||
92 | return clk; | ||
93 | #else | ||
94 | return get_tod_clock(); | ||
95 | #endif | ||
96 | } | ||
97 | |||
98 | static inline cycles_t get_cycles(void) | 98 | static inline cycles_t get_cycles(void) |
99 | { | 99 | { |
100 | return (cycles_t) get_tod_clock() >> 2; | 100 | return (cycles_t) get_tod_clock() >> 2; |
@@ -125,7 +125,7 @@ extern u64 sched_clock_base_cc; | |||
125 | */ | 125 | */ |
126 | static inline unsigned long long get_tod_clock_monotonic(void) | 126 | static inline unsigned long long get_tod_clock_monotonic(void) |
127 | { | 127 | { |
128 | return get_tod_clock_xt() - sched_clock_base_cc; | 128 | return get_tod_clock() - sched_clock_base_cc; |
129 | } | 129 | } |
130 | 130 | ||
131 | /** | 131 | /** |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index 1389b637dae5..adaa9e9478d8 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -99,7 +99,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | |||
99 | break; | 99 | break; |
100 | } | 100 | } |
101 | } | 101 | } |
102 | return err; | 102 | return err ? -EFAULT : 0; |
103 | } | 103 | } |
104 | 104 | ||
105 | int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | 105 | int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) |
@@ -148,7 +148,7 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | |||
148 | break; | 148 | break; |
149 | } | 149 | } |
150 | } | 150 | } |
151 | return err; | 151 | return err ? -EFAULT : 0; |
152 | } | 152 | } |
153 | 153 | ||
154 | static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) | 154 | static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index f1279dc2e1bc..17d62fe5d7b7 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
@@ -867,7 +867,7 @@ static inline void | |||
867 | debug_finish_entry(debug_info_t * id, debug_entry_t* active, int level, | 867 | debug_finish_entry(debug_info_t * id, debug_entry_t* active, int level, |
868 | int exception) | 868 | int exception) |
869 | { | 869 | { |
870 | active->id.stck = get_tod_clock(); | 870 | active->id.stck = get_tod_clock_fast(); |
871 | active->id.fields.cpuid = smp_processor_id(); | 871 | active->id.fields.cpuid = smp_processor_id(); |
872 | active->caller = __builtin_return_address(0); | 872 | active->caller = __builtin_return_address(0); |
873 | active->id.fields.exception = exception; | 873 | active->id.fields.exception = exception; |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index 7f35cb33e510..7f1f7ac5cf7f 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -385,7 +385,7 @@ static int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu) | |||
385 | } | 385 | } |
386 | 386 | ||
387 | if ((!rc) && (vcpu->arch.sie_block->ckc < | 387 | if ((!rc) && (vcpu->arch.sie_block->ckc < |
388 | get_tod_clock() + vcpu->arch.sie_block->epoch)) { | 388 | get_tod_clock_fast() + vcpu->arch.sie_block->epoch)) { |
389 | if ((!psw_extint_disabled(vcpu)) && | 389 | if ((!psw_extint_disabled(vcpu)) && |
390 | (vcpu->arch.sie_block->gcr[0] & 0x800ul)) | 390 | (vcpu->arch.sie_block->gcr[0] & 0x800ul)) |
391 | rc = 1; | 391 | rc = 1; |
@@ -425,7 +425,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu) | |||
425 | goto no_timer; | 425 | goto no_timer; |
426 | } | 426 | } |
427 | 427 | ||
428 | now = get_tod_clock() + vcpu->arch.sie_block->epoch; | 428 | now = get_tod_clock_fast() + vcpu->arch.sie_block->epoch; |
429 | if (vcpu->arch.sie_block->ckc < now) { | 429 | if (vcpu->arch.sie_block->ckc < now) { |
430 | __unset_cpu_idle(vcpu); | 430 | __unset_cpu_idle(vcpu); |
431 | return 0; | 431 | return 0; |
@@ -515,7 +515,7 @@ void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) | |||
515 | } | 515 | } |
516 | 516 | ||
517 | if ((vcpu->arch.sie_block->ckc < | 517 | if ((vcpu->arch.sie_block->ckc < |
518 | get_tod_clock() + vcpu->arch.sie_block->epoch)) | 518 | get_tod_clock_fast() + vcpu->arch.sie_block->epoch)) |
519 | __try_deliver_ckc_interrupt(vcpu); | 519 | __try_deliver_ckc_interrupt(vcpu); |
520 | 520 | ||
521 | if (atomic_read(&fi->active)) { | 521 | if (atomic_read(&fi->active)) { |
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index 57c87d7d7ede..a9f3d0042d58 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
@@ -44,7 +44,7 @@ static void __udelay_disabled(unsigned long long usecs) | |||
44 | do { | 44 | do { |
45 | set_clock_comparator(end); | 45 | set_clock_comparator(end); |
46 | vtime_stop_cpu(); | 46 | vtime_stop_cpu(); |
47 | } while (get_tod_clock() < end); | 47 | } while (get_tod_clock_fast() < end); |
48 | lockdep_on(); | 48 | lockdep_on(); |
49 | __ctl_load(cr0, 0, 0); | 49 | __ctl_load(cr0, 0, 0); |
50 | __ctl_load(cr6, 6, 6); | 50 | __ctl_load(cr6, 6, 6); |
@@ -55,7 +55,7 @@ static void __udelay_enabled(unsigned long long usecs) | |||
55 | { | 55 | { |
56 | u64 clock_saved, end; | 56 | u64 clock_saved, end; |
57 | 57 | ||
58 | end = get_tod_clock() + (usecs << 12); | 58 | end = get_tod_clock_fast() + (usecs << 12); |
59 | do { | 59 | do { |
60 | clock_saved = 0; | 60 | clock_saved = 0; |
61 | if (end < S390_lowcore.clock_comparator) { | 61 | if (end < S390_lowcore.clock_comparator) { |
@@ -65,7 +65,7 @@ static void __udelay_enabled(unsigned long long usecs) | |||
65 | vtime_stop_cpu(); | 65 | vtime_stop_cpu(); |
66 | if (clock_saved) | 66 | if (clock_saved) |
67 | local_tick_enable(clock_saved); | 67 | local_tick_enable(clock_saved); |
68 | } while (get_tod_clock() < end); | 68 | } while (get_tod_clock_fast() < end); |
69 | } | 69 | } |
70 | 70 | ||
71 | /* | 71 | /* |
@@ -109,8 +109,8 @@ void udelay_simple(unsigned long long usecs) | |||
109 | { | 109 | { |
110 | u64 end; | 110 | u64 end; |
111 | 111 | ||
112 | end = get_tod_clock() + (usecs << 12); | 112 | end = get_tod_clock_fast() + (usecs << 12); |
113 | while (get_tod_clock() < end) | 113 | while (get_tod_clock_fast() < end) |
114 | cpu_relax(); | 114 | cpu_relax(); |
115 | } | 115 | } |
116 | 116 | ||
@@ -120,10 +120,10 @@ void __ndelay(unsigned long long nsecs) | |||
120 | 120 | ||
121 | nsecs <<= 9; | 121 | nsecs <<= 9; |
122 | do_div(nsecs, 125); | 122 | do_div(nsecs, 125); |
123 | end = get_tod_clock() + nsecs; | 123 | end = get_tod_clock_fast() + nsecs; |
124 | if (nsecs & ~0xfffUL) | 124 | if (nsecs & ~0xfffUL) |
125 | __udelay(nsecs >> 12); | 125 | __udelay(nsecs >> 12); |
126 | while (get_tod_clock() < end) | 126 | while (get_tod_clock_fast() < end) |
127 | barrier(); | 127 | barrier(); |
128 | } | 128 | } |
129 | EXPORT_SYMBOL(__ndelay); | 129 | EXPORT_SYMBOL(__ndelay); |
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 709239285869..a5df511e27a2 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
@@ -881,7 +881,9 @@ void bpf_jit_free(struct sk_filter *fp) | |||
881 | struct bpf_binary_header *header = (void *)addr; | 881 | struct bpf_binary_header *header = (void *)addr; |
882 | 882 | ||
883 | if (fp->bpf_func == sk_run_filter) | 883 | if (fp->bpf_func == sk_run_filter) |
884 | return; | 884 | goto free_filter; |
885 | set_memory_rw(addr, header->pages); | 885 | set_memory_rw(addr, header->pages); |
886 | module_free(NULL, header); | 886 | module_free(NULL, header); |
887 | free_filter: | ||
888 | kfree(fp); | ||
887 | } | 889 | } |
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index 9c7be59e6f5a..218b6b23c378 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c | |||
@@ -808,4 +808,5 @@ void bpf_jit_free(struct sk_filter *fp) | |||
808 | { | 808 | { |
809 | if (fp->bpf_func != sk_run_filter) | 809 | if (fp->bpf_func != sk_run_filter) |
810 | module_free(NULL, fp->bpf_func); | 810 | module_free(NULL, fp->bpf_func); |
811 | kfree(fp); | ||
811 | } | 812 | } |
diff --git a/arch/um/kernel/exitcode.c b/arch/um/kernel/exitcode.c index 829df49dee99..41ebbfebb333 100644 --- a/arch/um/kernel/exitcode.c +++ b/arch/um/kernel/exitcode.c | |||
@@ -40,9 +40,11 @@ static ssize_t exitcode_proc_write(struct file *file, | |||
40 | const char __user *buffer, size_t count, loff_t *pos) | 40 | const char __user *buffer, size_t count, loff_t *pos) |
41 | { | 41 | { |
42 | char *end, buf[sizeof("nnnnn\0")]; | 42 | char *end, buf[sizeof("nnnnn\0")]; |
43 | size_t size; | ||
43 | int tmp; | 44 | int tmp; |
44 | 45 | ||
45 | if (copy_from_user(buf, buffer, count)) | 46 | size = min(count, sizeof(buf)); |
47 | if (copy_from_user(buf, buffer, size)) | ||
46 | return -EFAULT; | 48 | return -EFAULT; |
47 | 49 | ||
48 | tmp = simple_strtol(buf, &end, 0); | 50 | tmp = simple_strtol(buf, &end, 0); |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 145d703227bf..e22d7f5f9837 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -638,10 +638,10 @@ config PARAVIRT_SPINLOCKS | |||
638 | spinlock implementation with something virtualization-friendly | 638 | spinlock implementation with something virtualization-friendly |
639 | (for example, block the virtual CPU rather than spinning). | 639 | (for example, block the virtual CPU rather than spinning). |
640 | 640 | ||
641 | Unfortunately the downside is an up to 5% performance hit on | 641 | It has a minimal impact on native kernels and gives a nice performance |
642 | native kernels, with various workloads. | 642 | benefit on paravirtualized KVM / Xen kernels. |
643 | 643 | ||
644 | If you are unsure how to answer this question, answer N. | 644 | If you are unsure how to answer this question, answer Y. |
645 | 645 | ||
646 | source "arch/x86/xen/Kconfig" | 646 | source "arch/x86/xen/Kconfig" |
647 | 647 | ||
@@ -1033,6 +1033,7 @@ config X86_REBOOTFIXUPS | |||
1033 | 1033 | ||
1034 | config MICROCODE | 1034 | config MICROCODE |
1035 | tristate "CPU microcode loading support" | 1035 | tristate "CPU microcode loading support" |
1036 | depends on CPU_SUP_AMD || CPU_SUP_INTEL | ||
1036 | select FW_LOADER | 1037 | select FW_LOADER |
1037 | ---help--- | 1038 | ---help--- |
1038 | 1039 | ||
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 0da5200ee79d..b3e18f800302 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
@@ -128,7 +128,8 @@ do { \ | |||
128 | do { \ | 128 | do { \ |
129 | typedef typeof(var) pao_T__; \ | 129 | typedef typeof(var) pao_T__; \ |
130 | const int pao_ID__ = (__builtin_constant_p(val) && \ | 130 | const int pao_ID__ = (__builtin_constant_p(val) && \ |
131 | ((val) == 1 || (val) == -1)) ? (val) : 0; \ | 131 | ((val) == 1 || (val) == -1)) ? \ |
132 | (int)(val) : 0; \ | ||
132 | if (0) { \ | 133 | if (0) { \ |
133 | pao_T__ pao_tmp__; \ | 134 | pao_T__ pao_tmp__; \ |
134 | pao_tmp__ = (val); \ | 135 | pao_tmp__ = (val); \ |
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 15e8563e5c24..df94598ad05a 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
@@ -402,17 +402,6 @@ void alternatives_enable_smp(void) | |||
402 | { | 402 | { |
403 | struct smp_alt_module *mod; | 403 | struct smp_alt_module *mod; |
404 | 404 | ||
405 | #ifdef CONFIG_LOCKDEP | ||
406 | /* | ||
407 | * Older binutils section handling bug prevented | ||
408 | * alternatives-replacement from working reliably. | ||
409 | * | ||
410 | * If this still occurs then you should see a hang | ||
411 | * or crash shortly after this line: | ||
412 | */ | ||
413 | pr_info("lockdep: fixing up alternatives\n"); | ||
414 | #endif | ||
415 | |||
416 | /* Why bother if there are no other CPUs? */ | 405 | /* Why bother if there are no other CPUs? */ |
417 | BUG_ON(num_possible_cpus() == 1); | 406 | BUG_ON(num_possible_cpus() == 1); |
418 | 407 | ||
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 1191ac1c9d25..a419814cea57 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -113,7 +113,7 @@ static int __init early_get_pnodeid(void) | |||
113 | break; | 113 | break; |
114 | case UV3_HUB_PART_NUMBER: | 114 | case UV3_HUB_PART_NUMBER: |
115 | case UV3_HUB_PART_NUMBER_X: | 115 | case UV3_HUB_PART_NUMBER_X: |
116 | uv_min_hub_revision_id += UV3_HUB_REVISION_BASE - 1; | 116 | uv_min_hub_revision_id += UV3_HUB_REVISION_BASE; |
117 | break; | 117 | break; |
118 | } | 118 | } |
119 | 119 | ||
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 9d8449158cf9..8a87a3224121 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -1276,16 +1276,16 @@ void perf_events_lapic_init(void) | |||
1276 | static int __kprobes | 1276 | static int __kprobes |
1277 | perf_event_nmi_handler(unsigned int cmd, struct pt_regs *regs) | 1277 | perf_event_nmi_handler(unsigned int cmd, struct pt_regs *regs) |
1278 | { | 1278 | { |
1279 | int ret; | ||
1280 | u64 start_clock; | 1279 | u64 start_clock; |
1281 | u64 finish_clock; | 1280 | u64 finish_clock; |
1281 | int ret; | ||
1282 | 1282 | ||
1283 | if (!atomic_read(&active_events)) | 1283 | if (!atomic_read(&active_events)) |
1284 | return NMI_DONE; | 1284 | return NMI_DONE; |
1285 | 1285 | ||
1286 | start_clock = local_clock(); | 1286 | start_clock = sched_clock(); |
1287 | ret = x86_pmu.handle_irq(regs); | 1287 | ret = x86_pmu.handle_irq(regs); |
1288 | finish_clock = local_clock(); | 1288 | finish_clock = sched_clock(); |
1289 | 1289 | ||
1290 | perf_sample_event_took(finish_clock - start_clock); | 1290 | perf_sample_event_took(finish_clock - start_clock); |
1291 | 1291 | ||
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index a0e2a8a80c94..b2046e4d0b59 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c | |||
@@ -609,7 +609,7 @@ static struct dentry *d_kvm_debug; | |||
609 | 609 | ||
610 | struct dentry *kvm_init_debugfs(void) | 610 | struct dentry *kvm_init_debugfs(void) |
611 | { | 611 | { |
612 | d_kvm_debug = debugfs_create_dir("kvm", NULL); | 612 | d_kvm_debug = debugfs_create_dir("kvm-guest", NULL); |
613 | if (!d_kvm_debug) | 613 | if (!d_kvm_debug) |
614 | printk(KERN_WARNING "Could not create 'kvm' debugfs directory\n"); | 614 | printk(KERN_WARNING "Could not create 'kvm' debugfs directory\n"); |
615 | 615 | ||
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index ba77ebc2c353..6fcb49ce50a1 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
@@ -113,10 +113,10 @@ static int __kprobes nmi_handle(unsigned int type, struct pt_regs *regs, bool b2 | |||
113 | u64 before, delta, whole_msecs; | 113 | u64 before, delta, whole_msecs; |
114 | int remainder_ns, decimal_msecs, thishandled; | 114 | int remainder_ns, decimal_msecs, thishandled; |
115 | 115 | ||
116 | before = local_clock(); | 116 | before = sched_clock(); |
117 | thishandled = a->handler(type, regs); | 117 | thishandled = a->handler(type, regs); |
118 | handled += thishandled; | 118 | handled += thishandled; |
119 | delta = local_clock() - before; | 119 | delta = sched_clock() - before; |
120 | trace_nmi_handler(a->handler, (int)delta, thishandled); | 120 | trace_nmi_handler(a->handler, (int)delta, thishandled); |
121 | 121 | ||
122 | if (delta < nmi_longest_ns) | 122 | if (delta < nmi_longest_ns) |
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 79c216aa0e2b..516593e1ce33 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
@@ -772,13 +772,21 @@ out: | |||
772 | return; | 772 | return; |
773 | } | 773 | } |
774 | 774 | ||
775 | static void bpf_jit_free_deferred(struct work_struct *work) | ||
776 | { | ||
777 | struct sk_filter *fp = container_of(work, struct sk_filter, work); | ||
778 | unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK; | ||
779 | struct bpf_binary_header *header = (void *)addr; | ||
780 | |||
781 | set_memory_rw(addr, header->pages); | ||
782 | module_free(NULL, header); | ||
783 | kfree(fp); | ||
784 | } | ||
785 | |||
775 | void bpf_jit_free(struct sk_filter *fp) | 786 | void bpf_jit_free(struct sk_filter *fp) |
776 | { | 787 | { |
777 | if (fp->bpf_func != sk_run_filter) { | 788 | if (fp->bpf_func != sk_run_filter) { |
778 | unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK; | 789 | INIT_WORK(&fp->work, bpf_jit_free_deferred); |
779 | struct bpf_binary_header *header = (void *)addr; | 790 | schedule_work(&fp->work); |
780 | |||
781 | set_memory_rw(addr, header->pages); | ||
782 | module_free(NULL, header); | ||
783 | } | 791 | } |
784 | } | 792 | } |
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index de1dfa18d0a1..21dbe6bdb8ed 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S | |||
@@ -1122,7 +1122,7 @@ ENDPROC(fast_syscall_spill_registers) | |||
1122 | * a3: exctable, original value in excsave1 | 1122 | * a3: exctable, original value in excsave1 |
1123 | */ | 1123 | */ |
1124 | 1124 | ||
1125 | fast_syscall_spill_registers_fixup: | 1125 | ENTRY(fast_syscall_spill_registers_fixup) |
1126 | 1126 | ||
1127 | rsr a2, windowbase # get current windowbase (a2 is saved) | 1127 | rsr a2, windowbase # get current windowbase (a2 is saved) |
1128 | xsr a0, depc # restore depc and a0 | 1128 | xsr a0, depc # restore depc and a0 |
@@ -1134,22 +1134,26 @@ fast_syscall_spill_registers_fixup: | |||
1134 | */ | 1134 | */ |
1135 | 1135 | ||
1136 | xsr a3, excsave1 # get spill-mask | 1136 | xsr a3, excsave1 # get spill-mask |
1137 | slli a2, a3, 1 # shift left by one | 1137 | slli a3, a3, 1 # shift left by one |
1138 | 1138 | ||
1139 | slli a3, a2, 32-WSBITS | 1139 | slli a2, a3, 32-WSBITS |
1140 | src a2, a2, a3 # a1 = xxwww1yyxxxwww1yy...... | 1140 | src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy...... |
1141 | wsr a2, windowstart # set corrected windowstart | 1141 | wsr a2, windowstart # set corrected windowstart |
1142 | 1142 | ||
1143 | rsr a3, excsave1 | 1143 | srli a3, a3, 1 |
1144 | l32i a2, a3, EXC_TABLE_DOUBLE_SAVE # restore a2 | 1144 | rsr a2, excsave1 |
1145 | l32i a3, a3, EXC_TABLE_PARAM # original WB (in user task) | 1145 | l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2 |
1146 | xsr a2, excsave1 | ||
1147 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3 | ||
1148 | l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task) | ||
1149 | xsr a2, excsave1 | ||
1146 | 1150 | ||
1147 | /* Return to the original (user task) WINDOWBASE. | 1151 | /* Return to the original (user task) WINDOWBASE. |
1148 | * We leave the following frame behind: | 1152 | * We leave the following frame behind: |
1149 | * a0, a1, a2 same | 1153 | * a0, a1, a2 same |
1150 | * a3: trashed (saved in excsave_1) | 1154 | * a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE) |
1151 | * depc: depc (we have to return to that address) | 1155 | * depc: depc (we have to return to that address) |
1152 | * excsave_1: a3 | 1156 | * excsave_1: exctable |
1153 | */ | 1157 | */ |
1154 | 1158 | ||
1155 | wsr a3, windowbase | 1159 | wsr a3, windowbase |
@@ -1159,9 +1163,9 @@ fast_syscall_spill_registers_fixup: | |||
1159 | * a0: return address | 1163 | * a0: return address |
1160 | * a1: used, stack pointer | 1164 | * a1: used, stack pointer |
1161 | * a2: kernel stack pointer | 1165 | * a2: kernel stack pointer |
1162 | * a3: available, saved in EXCSAVE_1 | 1166 | * a3: available |
1163 | * depc: exception address | 1167 | * depc: exception address |
1164 | * excsave: a3 | 1168 | * excsave: exctable |
1165 | * Note: This frame might be the same as above. | 1169 | * Note: This frame might be the same as above. |
1166 | */ | 1170 | */ |
1167 | 1171 | ||
@@ -1181,9 +1185,12 @@ fast_syscall_spill_registers_fixup: | |||
1181 | rsr a0, exccause | 1185 | rsr a0, exccause |
1182 | addx4 a0, a0, a3 # find entry in table | 1186 | addx4 a0, a0, a3 # find entry in table |
1183 | l32i a0, a0, EXC_TABLE_FAST_USER # load handler | 1187 | l32i a0, a0, EXC_TABLE_FAST_USER # load handler |
1188 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
1184 | jx a0 | 1189 | jx a0 |
1185 | 1190 | ||
1186 | fast_syscall_spill_registers_fixup_return: | 1191 | ENDPROC(fast_syscall_spill_registers_fixup) |
1192 | |||
1193 | ENTRY(fast_syscall_spill_registers_fixup_return) | ||
1187 | 1194 | ||
1188 | /* When we return here, all registers have been restored (a2: DEPC) */ | 1195 | /* When we return here, all registers have been restored (a2: DEPC) */ |
1189 | 1196 | ||
@@ -1191,13 +1198,13 @@ fast_syscall_spill_registers_fixup_return: | |||
1191 | 1198 | ||
1192 | /* Restore fixup handler. */ | 1199 | /* Restore fixup handler. */ |
1193 | 1200 | ||
1194 | xsr a3, excsave1 | 1201 | rsr a2, excsave1 |
1195 | movi a2, fast_syscall_spill_registers_fixup | 1202 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE |
1196 | s32i a2, a3, EXC_TABLE_FIXUP | 1203 | movi a3, fast_syscall_spill_registers_fixup |
1197 | s32i a0, a3, EXC_TABLE_DOUBLE_SAVE | 1204 | s32i a3, a2, EXC_TABLE_FIXUP |
1198 | rsr a2, windowbase | 1205 | rsr a3, windowbase |
1199 | s32i a2, a3, EXC_TABLE_PARAM | 1206 | s32i a3, a2, EXC_TABLE_PARAM |
1200 | l32i a2, a3, EXC_TABLE_KSTK | 1207 | l32i a2, a2, EXC_TABLE_KSTK |
1201 | 1208 | ||
1202 | /* Load WB at the time the exception occurred. */ | 1209 | /* Load WB at the time the exception occurred. */ |
1203 | 1210 | ||
@@ -1206,8 +1213,12 @@ fast_syscall_spill_registers_fixup_return: | |||
1206 | wsr a3, windowbase | 1213 | wsr a3, windowbase |
1207 | rsync | 1214 | rsync |
1208 | 1215 | ||
1216 | rsr a3, excsave1 | ||
1217 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
1218 | |||
1209 | rfde | 1219 | rfde |
1210 | 1220 | ||
1221 | ENDPROC(fast_syscall_spill_registers_fixup_return) | ||
1211 | 1222 | ||
1212 | /* | 1223 | /* |
1213 | * spill all registers. | 1224 | * spill all registers. |
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index 718eca1850bd..98b67d5f1514 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c | |||
@@ -341,7 +341,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
341 | 341 | ||
342 | sp = regs->areg[1]; | 342 | sp = regs->areg[1]; |
343 | 343 | ||
344 | if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) { | 344 | if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) { |
345 | sp = current->sas_ss_sp + current->sas_ss_size; | 345 | sp = current->sas_ss_sp + current->sas_ss_size; |
346 | } | 346 | } |
347 | 347 | ||
diff --git a/arch/xtensa/platforms/iss/network.c b/arch/xtensa/platforms/iss/network.c index 56f88b7afe2f..e9e1aad8c271 100644 --- a/arch/xtensa/platforms/iss/network.c +++ b/arch/xtensa/platforms/iss/network.c | |||
@@ -737,7 +737,8 @@ static int __init iss_net_setup(char *str) | |||
737 | return 1; | 737 | return 1; |
738 | } | 738 | } |
739 | 739 | ||
740 | if ((new = alloc_bootmem(sizeof new)) == NULL) { | 740 | new = alloc_bootmem(sizeof(*new)); |
741 | if (new == NULL) { | ||
741 | printk("Alloc_bootmem failed\n"); | 742 | printk("Alloc_bootmem failed\n"); |
742 | return 1; | 743 | return 1; |
743 | } | 744 | } |