sparc: Unbreak the build
authorBart Van Assche <bvanassche@acm.org>
Tue, 30 Aug 2022 20:58:42 +0000 (13:58 -0700)
committerKees Cook <keescook@chromium.org>
Fri, 30 Sep 2022 02:21:10 +0000 (19:21 -0700)
Fix the following build errors:

arch/sparc/mm/srmmu.c: In function ‘smp_flush_page_for_dma’:
arch/sparc/mm/srmmu.c:1639:13: error: cast between incompatible function types from ‘void (*)(long unsigned int)’ to ‘void (*)(long unsigned int,  long unsigned int,  long unsigned int,  long unsigned int,  long unsigned int)’ [-Werror=cast-function-type]
 1639 |         xc1((smpfunc_t) local_ops->page_for_dma, page);
      |             ^
arch/sparc/mm/srmmu.c: In function ‘smp_flush_cache_mm’:
arch/sparc/mm/srmmu.c:1662:29: error: cast between incompatible function types from ‘void (*)(struct mm_struct *)’ to ‘void (*)(long unsigned int,  long unsigned int,  long unsigned int,  long unsigned int,  long unsigned int)’ [-Werror=cast-function-type]
 1662 |                         xc1((smpfunc_t) local_ops->cache_mm, (unsigned long) mm);
      |
[ ... ]

Compile-tested only.

Fixes: 552a23a0e5d0 ("Makefile: Enable -Wcast-function-type")
Cc: stable@vger.kernel.org
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Tested-by: Andreas Larsson <andreas@gaisler.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20220830205854.1918026-1-bvanassche@acm.org
arch/sparc/include/asm/smp_32.h
arch/sparc/kernel/leon_smp.c
arch/sparc/kernel/sun4d_smp.c
arch/sparc/kernel/sun4m_smp.c
arch/sparc/mm/srmmu.c

index 8560817..2cf7971 100644 (file)
@@ -33,9 +33,6 @@ extern volatile unsigned long cpu_callin_map[NR_CPUS];
 extern cpumask_t smp_commenced_mask;
 extern struct linux_prom_registers smp_penguin_ctable;
 
-typedef void (*smpfunc_t)(unsigned long, unsigned long, unsigned long,
-                      unsigned long, unsigned long);
-
 void cpu_panic(void);
 
 /*
@@ -57,7 +54,7 @@ void smp_bogo(struct seq_file *);
 void smp_info(struct seq_file *);
 
 struct sparc32_ipi_ops {
-       void (*cross_call)(smpfunc_t func, cpumask_t mask, unsigned long arg1,
+       void (*cross_call)(void *func, cpumask_t mask, unsigned long arg1,
                           unsigned long arg2, unsigned long arg3,
                           unsigned long arg4);
        void (*resched)(int cpu);
@@ -66,28 +63,28 @@ struct sparc32_ipi_ops {
 };
 extern const struct sparc32_ipi_ops *sparc32_ipi_ops;
 
-static inline void xc0(smpfunc_t func)
+static inline void xc0(void *func)
 {
        sparc32_ipi_ops->cross_call(func, *cpu_online_mask, 0, 0, 0, 0);
 }
 
-static inline void xc1(smpfunc_t func, unsigned long arg1)
+static inline void xc1(void *func, unsigned long arg1)
 {
        sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, 0, 0, 0);
 }
-static inline void xc2(smpfunc_t func, unsigned long arg1, unsigned long arg2)
+static inline void xc2(void *func, unsigned long arg1, unsigned long arg2)
 {
        sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, arg2, 0, 0);
 }
 
-static inline void xc3(smpfunc_t func, unsigned long arg1, unsigned long arg2,
+static inline void xc3(void *func, unsigned long arg1, unsigned long arg2,
                       unsigned long arg3)
 {
        sparc32_ipi_ops->cross_call(func, *cpu_online_mask,
                                    arg1, arg2, arg3, 0);
 }
 
-static inline void xc4(smpfunc_t func, unsigned long arg1, unsigned long arg2,
+static inline void xc4(void *func, unsigned long arg1, unsigned long arg2,
                       unsigned long arg3, unsigned long arg4)
 {
        sparc32_ipi_ops->cross_call(func, *cpu_online_mask,
index 1eed26d..991e9ad 100644 (file)
@@ -359,7 +359,7 @@ void leonsmp_ipi_interrupt(void)
 }
 
 static struct smp_funcall {
-       smpfunc_t func;
+       void *func;
        unsigned long arg1;
        unsigned long arg2;
        unsigned long arg3;
@@ -372,7 +372,7 @@ static struct smp_funcall {
 static DEFINE_SPINLOCK(cross_call_lock);
 
 /* Cross calls must be serialized, at least currently. */
-static void leon_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
+static void leon_cross_call(void *func, cpumask_t mask, unsigned long arg1,
                            unsigned long arg2, unsigned long arg3,
                            unsigned long arg4)
 {
@@ -384,7 +384,7 @@ static void leon_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
 
                {
                        /* If you make changes here, make sure gcc generates proper code... */
-                       register smpfunc_t f asm("i0") = func;
+                       register void *f asm("i0") = func;
                        register unsigned long a1 asm("i1") = arg1;
                        register unsigned long a2 asm("i2") = arg2;
                        register unsigned long a3 asm("i3") = arg3;
@@ -444,11 +444,13 @@ static void leon_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
 /* Running cross calls. */
 void leon_cross_call_irq(void)
 {
+       void (*func)(unsigned long, unsigned long, unsigned long, unsigned long,
+                    unsigned long) = ccall_info.func;
        int i = smp_processor_id();
 
        ccall_info.processors_in[i] = 1;
-       ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3,
-                       ccall_info.arg4, ccall_info.arg5);
+       func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4,
+            ccall_info.arg5);
        ccall_info.processors_out[i] = 1;
 }
 
index ff30f03..9a62a5c 100644 (file)
@@ -268,7 +268,7 @@ static void sun4d_ipi_resched(int cpu)
 }
 
 static struct smp_funcall {
-       smpfunc_t func;
+       void *func;
        unsigned long arg1;
        unsigned long arg2;
        unsigned long arg3;
@@ -281,7 +281,7 @@ static struct smp_funcall {
 static DEFINE_SPINLOCK(cross_call_lock);
 
 /* Cross calls must be serialized, at least currently. */
-static void sun4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
+static void sun4d_cross_call(void *func, cpumask_t mask, unsigned long arg1,
                             unsigned long arg2, unsigned long arg3,
                             unsigned long arg4)
 {
@@ -296,7 +296,7 @@ static void sun4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
                         * If you make changes here, make sure
                         * gcc generates proper code...
                         */
-                       register smpfunc_t f asm("i0") = func;
+                       register void *f asm("i0") = func;
                        register unsigned long a1 asm("i1") = arg1;
                        register unsigned long a2 asm("i2") = arg2;
                        register unsigned long a3 asm("i3") = arg3;
@@ -353,11 +353,13 @@ static void sun4d_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
 /* Running cross calls. */
 void smp4d_cross_call_irq(void)
 {
+       void (*func)(unsigned long, unsigned long, unsigned long, unsigned long,
+                    unsigned long) = ccall_info.func;
        int i = hard_smp_processor_id();
 
        ccall_info.processors_in[i] = 1;
-       ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3,
-                       ccall_info.arg4, ccall_info.arg5);
+       func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4,
+            ccall_info.arg5);
        ccall_info.processors_out[i] = 1;
 }
 
index 228a652..056df03 100644 (file)
@@ -157,7 +157,7 @@ static void sun4m_ipi_mask_one(int cpu)
 }
 
 static struct smp_funcall {
-       smpfunc_t func;
+       void *func;
        unsigned long arg1;
        unsigned long arg2;
        unsigned long arg3;
@@ -170,7 +170,7 @@ static struct smp_funcall {
 static DEFINE_SPINLOCK(cross_call_lock);
 
 /* Cross calls must be serialized, at least currently. */
-static void sun4m_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
+static void sun4m_cross_call(void *func, cpumask_t mask, unsigned long arg1,
                             unsigned long arg2, unsigned long arg3,
                             unsigned long arg4)
 {
@@ -230,11 +230,13 @@ static void sun4m_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
 /* Running cross calls. */
 void smp4m_cross_call_irq(void)
 {
+       void (*func)(unsigned long, unsigned long, unsigned long, unsigned long,
+                    unsigned long) = ccall_info.func;
        int i = smp_processor_id();
 
        ccall_info.processors_in[i] = 1;
-       ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3,
-                       ccall_info.arg4, ccall_info.arg5);
+       func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4,
+            ccall_info.arg5);
        ccall_info.processors_out[i] = 1;
 }
 
index a9aa6a9..13f027a 100644 (file)
@@ -1636,19 +1636,19 @@ static void __init get_srmmu_type(void)
 /* Local cross-calls. */
 static void smp_flush_page_for_dma(unsigned long page)
 {
-       xc1((smpfunc_t) local_ops->page_for_dma, page);
+       xc1(local_ops->page_for_dma, page);
        local_ops->page_for_dma(page);
 }
 
 static void smp_flush_cache_all(void)
 {
-       xc0((smpfunc_t) local_ops->cache_all);
+       xc0(local_ops->cache_all);
        local_ops->cache_all();
 }
 
 static void smp_flush_tlb_all(void)
 {
-       xc0((smpfunc_t) local_ops->tlb_all);
+       xc0(local_ops->tlb_all);
        local_ops->tlb_all();
 }
 
@@ -1659,7 +1659,7 @@ static void smp_flush_cache_mm(struct mm_struct *mm)
                cpumask_copy(&cpu_mask, mm_cpumask(mm));
                cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
                if (!cpumask_empty(&cpu_mask))
-                       xc1((smpfunc_t) local_ops->cache_mm, (unsigned long) mm);
+                       xc1(local_ops->cache_mm, (unsigned long)mm);
                local_ops->cache_mm(mm);
        }
 }
@@ -1671,7 +1671,7 @@ static void smp_flush_tlb_mm(struct mm_struct *mm)
                cpumask_copy(&cpu_mask, mm_cpumask(mm));
                cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
                if (!cpumask_empty(&cpu_mask)) {
-                       xc1((smpfunc_t) local_ops->tlb_mm, (unsigned long) mm);
+                       xc1(local_ops->tlb_mm, (unsigned long)mm);
                        if (atomic_read(&mm->mm_users) == 1 && current->active_mm == mm)
                                cpumask_copy(mm_cpumask(mm),
                                             cpumask_of(smp_processor_id()));
@@ -1691,8 +1691,8 @@ static void smp_flush_cache_range(struct vm_area_struct *vma,
                cpumask_copy(&cpu_mask, mm_cpumask(mm));
                cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
                if (!cpumask_empty(&cpu_mask))
-                       xc3((smpfunc_t) local_ops->cache_range,
-                           (unsigned long) vma, start, end);
+                       xc3(local_ops->cache_range, (unsigned long)vma, start,
+                           end);
                local_ops->cache_range(vma, start, end);
        }
 }
@@ -1708,8 +1708,8 @@ static void smp_flush_tlb_range(struct vm_area_struct *vma,
                cpumask_copy(&cpu_mask, mm_cpumask(mm));
                cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
                if (!cpumask_empty(&cpu_mask))
-                       xc3((smpfunc_t) local_ops->tlb_range,
-                           (unsigned long) vma, start, end);
+                       xc3(local_ops->tlb_range, (unsigned long)vma, start,
+                           end);
                local_ops->tlb_range(vma, start, end);
        }
 }
@@ -1723,8 +1723,7 @@ static void smp_flush_cache_page(struct vm_area_struct *vma, unsigned long page)
                cpumask_copy(&cpu_mask, mm_cpumask(mm));
                cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
                if (!cpumask_empty(&cpu_mask))
-                       xc2((smpfunc_t) local_ops->cache_page,
-                           (unsigned long) vma, page);
+                       xc2(local_ops->cache_page, (unsigned long)vma, page);
                local_ops->cache_page(vma, page);
        }
 }
@@ -1738,8 +1737,7 @@ static void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
                cpumask_copy(&cpu_mask, mm_cpumask(mm));
                cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
                if (!cpumask_empty(&cpu_mask))
-                       xc2((smpfunc_t) local_ops->tlb_page,
-                           (unsigned long) vma, page);
+                       xc2(local_ops->tlb_page, (unsigned long)vma, page);
                local_ops->tlb_page(vma, page);
        }
 }
@@ -1753,7 +1751,7 @@ static void smp_flush_page_to_ram(unsigned long page)
         * XXX This experiment failed, research further... -DaveM
         */
 #if 1
-       xc1((smpfunc_t) local_ops->page_to_ram, page);
+       xc1(local_ops->page_to_ram, page);
 #endif
        local_ops->page_to_ram(page);
 }
@@ -1764,8 +1762,7 @@ static void smp_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr)
        cpumask_copy(&cpu_mask, mm_cpumask(mm));
        cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
        if (!cpumask_empty(&cpu_mask))
-               xc2((smpfunc_t) local_ops->sig_insns,
-                   (unsigned long) mm, insn_addr);
+               xc2(local_ops->sig_insns, (unsigned long)mm, insn_addr);
        local_ops->sig_insns(mm, insn_addr);
 }