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: 552a23a0e5 ("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
This commit is contained in:
Bart Van Assche 2022-08-30 13:58:42 -07:00 коммит произвёл Kees Cook
Родитель 8c86f29bfb
Коммит 17006e86a7
5 изменённых файлов: 39 добавлений и 39 удалений

Просмотреть файл

@ -33,9 +33,6 @@ extern volatile unsigned long cpu_callin_map[NR_CPUS];
extern cpumask_t smp_commenced_mask; extern cpumask_t smp_commenced_mask;
extern struct linux_prom_registers smp_penguin_ctable; 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); void cpu_panic(void);
/* /*
@ -57,7 +54,7 @@ void smp_bogo(struct seq_file *);
void smp_info(struct seq_file *); void smp_info(struct seq_file *);
struct sparc32_ipi_ops { 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 arg2, unsigned long arg3,
unsigned long arg4); unsigned long arg4);
void (*resched)(int cpu); void (*resched)(int cpu);
@ -66,28 +63,28 @@ struct sparc32_ipi_ops {
}; };
extern const struct sparc32_ipi_ops *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); 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); 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); 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) unsigned long arg3)
{ {
sparc32_ipi_ops->cross_call(func, *cpu_online_mask, sparc32_ipi_ops->cross_call(func, *cpu_online_mask,
arg1, arg2, arg3, 0); 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) unsigned long arg3, unsigned long arg4)
{ {
sparc32_ipi_ops->cross_call(func, *cpu_online_mask, sparc32_ipi_ops->cross_call(func, *cpu_online_mask,

Просмотреть файл

@ -359,7 +359,7 @@ void leonsmp_ipi_interrupt(void)
} }
static struct smp_funcall { static struct smp_funcall {
smpfunc_t func; void *func;
unsigned long arg1; unsigned long arg1;
unsigned long arg2; unsigned long arg2;
unsigned long arg3; unsigned long arg3;
@ -372,7 +372,7 @@ static struct smp_funcall {
static DEFINE_SPINLOCK(cross_call_lock); static DEFINE_SPINLOCK(cross_call_lock);
/* Cross calls must be serialized, at least currently. */ /* 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 arg2, unsigned long arg3,
unsigned long arg4) 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... */ /* 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 a1 asm("i1") = arg1;
register unsigned long a2 asm("i2") = arg2; register unsigned long a2 asm("i2") = arg2;
register unsigned long a3 asm("i3") = arg3; 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. */ /* Running cross calls. */
void leon_cross_call_irq(void) 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(); int i = smp_processor_id();
ccall_info.processors_in[i] = 1; ccall_info.processors_in[i] = 1;
ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4,
ccall_info.arg4, ccall_info.arg5); ccall_info.arg5);
ccall_info.processors_out[i] = 1; ccall_info.processors_out[i] = 1;
} }

Просмотреть файл

@ -268,7 +268,7 @@ static void sun4d_ipi_resched(int cpu)
} }
static struct smp_funcall { static struct smp_funcall {
smpfunc_t func; void *func;
unsigned long arg1; unsigned long arg1;
unsigned long arg2; unsigned long arg2;
unsigned long arg3; unsigned long arg3;
@ -281,7 +281,7 @@ static struct smp_funcall {
static DEFINE_SPINLOCK(cross_call_lock); static DEFINE_SPINLOCK(cross_call_lock);
/* Cross calls must be serialized, at least currently. */ /* 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 arg2, unsigned long arg3,
unsigned long arg4) 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 * If you make changes here, make sure
* gcc generates proper code... * 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 a1 asm("i1") = arg1;
register unsigned long a2 asm("i2") = arg2; register unsigned long a2 asm("i2") = arg2;
register unsigned long a3 asm("i3") = arg3; 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. */ /* Running cross calls. */
void smp4d_cross_call_irq(void) 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(); int i = hard_smp_processor_id();
ccall_info.processors_in[i] = 1; ccall_info.processors_in[i] = 1;
ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4,
ccall_info.arg4, ccall_info.arg5); ccall_info.arg5);
ccall_info.processors_out[i] = 1; ccall_info.processors_out[i] = 1;
} }

Просмотреть файл

@ -157,7 +157,7 @@ static void sun4m_ipi_mask_one(int cpu)
} }
static struct smp_funcall { static struct smp_funcall {
smpfunc_t func; void *func;
unsigned long arg1; unsigned long arg1;
unsigned long arg2; unsigned long arg2;
unsigned long arg3; unsigned long arg3;
@ -170,7 +170,7 @@ static struct smp_funcall {
static DEFINE_SPINLOCK(cross_call_lock); static DEFINE_SPINLOCK(cross_call_lock);
/* Cross calls must be serialized, at least currently. */ /* 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 arg2, unsigned long arg3,
unsigned long arg4) unsigned long arg4)
{ {
@ -230,11 +230,13 @@ static void sun4m_cross_call(smpfunc_t func, cpumask_t mask, unsigned long arg1,
/* Running cross calls. */ /* Running cross calls. */
void smp4m_cross_call_irq(void) 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(); int i = smp_processor_id();
ccall_info.processors_in[i] = 1; ccall_info.processors_in[i] = 1;
ccall_info.func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, func(ccall_info.arg1, ccall_info.arg2, ccall_info.arg3, ccall_info.arg4,
ccall_info.arg4, ccall_info.arg5); ccall_info.arg5);
ccall_info.processors_out[i] = 1; ccall_info.processors_out[i] = 1;
} }

Просмотреть файл

@ -1636,19 +1636,19 @@ static void __init get_srmmu_type(void)
/* Local cross-calls. */ /* Local cross-calls. */
static void smp_flush_page_for_dma(unsigned long page) 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); local_ops->page_for_dma(page);
} }
static void smp_flush_cache_all(void) static void smp_flush_cache_all(void)
{ {
xc0((smpfunc_t) local_ops->cache_all); xc0(local_ops->cache_all);
local_ops->cache_all(); local_ops->cache_all();
} }
static void smp_flush_tlb_all(void) static void smp_flush_tlb_all(void)
{ {
xc0((smpfunc_t) local_ops->tlb_all); xc0(local_ops->tlb_all);
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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&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); 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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&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) if (atomic_read(&mm->mm_users) == 1 && current->active_mm == mm)
cpumask_copy(mm_cpumask(mm), cpumask_copy(mm_cpumask(mm),
cpumask_of(smp_processor_id())); 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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&cpu_mask)) if (!cpumask_empty(&cpu_mask))
xc3((smpfunc_t) local_ops->cache_range, xc3(local_ops->cache_range, (unsigned long)vma, start,
(unsigned long) vma, start, end); end);
local_ops->cache_range(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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&cpu_mask)) if (!cpumask_empty(&cpu_mask))
xc3((smpfunc_t) local_ops->tlb_range, xc3(local_ops->tlb_range, (unsigned long)vma, start,
(unsigned long) vma, start, end); end);
local_ops->tlb_range(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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&cpu_mask)) if (!cpumask_empty(&cpu_mask))
xc2((smpfunc_t) local_ops->cache_page, xc2(local_ops->cache_page, (unsigned long)vma, page);
(unsigned long) vma, page);
local_ops->cache_page(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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&cpu_mask)) if (!cpumask_empty(&cpu_mask))
xc2((smpfunc_t) local_ops->tlb_page, xc2(local_ops->tlb_page, (unsigned long)vma, page);
(unsigned long) vma, page);
local_ops->tlb_page(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 * XXX This experiment failed, research further... -DaveM
*/ */
#if 1 #if 1
xc1((smpfunc_t) local_ops->page_to_ram, page); xc1(local_ops->page_to_ram, page);
#endif #endif
local_ops->page_to_ram(page); 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_copy(&cpu_mask, mm_cpumask(mm));
cpumask_clear_cpu(smp_processor_id(), &cpu_mask); cpumask_clear_cpu(smp_processor_id(), &cpu_mask);
if (!cpumask_empty(&cpu_mask)) if (!cpumask_empty(&cpu_mask))
xc2((smpfunc_t) local_ops->sig_insns, xc2(local_ops->sig_insns, (unsigned long)mm, insn_addr);
(unsigned long) mm, insn_addr);
local_ops->sig_insns(mm, insn_addr); local_ops->sig_insns(mm, insn_addr);
} }