sparc: Unbreak the build
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:
Родитель
8c86f29bfb
Коммит
17006e86a7
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче