Skip to content

Commit

Permalink
MIPS: Malta: Fix crash in SMP kernel on non-CMP systems.
Browse files Browse the repository at this point in the history
Since 6be63bb (lmo) rsp.
af3a1f6 (kernel.org) the Malta code does
no longer probe for presence of GCMP if CMP is not configured.  This means
that the variable gcmp_present well be left at its default value of -1
which normally is meant to indicate that GCMP has not yet been mmapped.
This non-zero value is now interpreted as GCMP being present resulting
in a write attempt to a GCMP register resulting in a crash.

Reported and a build fix on top of my fix by Rob Landley <rob@landley.net>.

Reported-by: Rob Landley <rob@landley.net>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/2413/
  • Loading branch information
Ralf Baechle committed Jul 20, 2011
1 parent b12acf1 commit 852fe31
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 24 deletions.
41 changes: 38 additions & 3 deletions arch/mips/include/asm/smp-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,43 @@ static inline void register_smp_ops(struct plat_smp_ops *ops)

#endif /* !CONFIG_SMP */

extern struct plat_smp_ops up_smp_ops;
extern struct plat_smp_ops cmp_smp_ops;
extern struct plat_smp_ops vsmp_smp_ops;
static inline int register_up_smp_ops(void)
{
#ifdef CONFIG_SMP_UP
extern struct plat_smp_ops up_smp_ops;

register_smp_ops(&up_smp_ops);

return 0;
#else
return -ENODEV;
#endif
}

static inline int register_cmp_smp_ops(void)
{
#ifdef CONFIG_MIPS_CMP
extern struct plat_smp_ops cmp_smp_ops;

register_smp_ops(&cmp_smp_ops);

return 0;
#else
return -ENODEV;
#endif
}

static inline int register_vsmp_smp_ops(void)
{
#ifdef CONFIG_MIPS_MT_SMP
extern struct plat_smp_ops vsmp_smp_ops;

register_smp_ops(&vsmp_smp_ops);

return 0;
#else
return -ENODEV;
#endif
}

#endif /* __ASM_SMP_OPS_H */
17 changes: 8 additions & 9 deletions arch/mips/mipssim/sim_setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,17 @@ void __init prom_init(void)

prom_meminit();

#ifdef CONFIG_MIPS_MT_SMP
if (cpu_has_mipsmt)
register_smp_ops(&vsmp_smp_ops);
else
register_smp_ops(&up_smp_ops);
#endif
if (cpu_has_mipsmt) {
if (!register_vsmp_smp_ops())
return;

#ifdef CONFIG_MIPS_MT_SMTC
if (cpu_has_mipsmt)
register_smp_ops(&ssmtc_smp_ops);
else
register_smp_ops(&up_smp_ops);
return;
#endif
}

register_up_smp_ops();
}

static void __init serial_init(void)
Expand Down
14 changes: 7 additions & 7 deletions arch/mips/mti-malta/malta-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <asm/io.h>
#include <asm/system.h>
#include <asm/cacheflush.h>
#include <asm/smp-ops.h>
#include <asm/traps.h>

#include <asm/gcmpregs.h>
Expand Down Expand Up @@ -358,15 +359,14 @@ void __init prom_init(void)
#ifdef CONFIG_SERIAL_8250_CONSOLE
console_config();
#endif
#ifdef CONFIG_MIPS_CMP
/* Early detection of CMP support */
if (gcmp_probe(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ))
register_smp_ops(&cmp_smp_ops);
else
#endif
#ifdef CONFIG_MIPS_MT_SMP
register_smp_ops(&vsmp_smp_ops);
#endif
if (!register_cmp_smp_ops())
return;

if (!register_vsmp_smp_ops())
return;

#ifdef CONFIG_MIPS_MT_SMTC
register_smp_ops(&msmtc_smp_ops);
#endif
Expand Down
8 changes: 3 additions & 5 deletions arch/mips/pmc-sierra/msp71xx/msp_setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,13 +228,11 @@ void __init prom_init(void)
*/
msp_serial_setup();

#ifdef CONFIG_MIPS_MT_SMP
register_smp_ops(&vsmp_smp_ops);
#endif

if (register_vsmp_smp_ops()) {
#ifdef CONFIG_MIPS_MT_SMTC
register_smp_ops(&msp_smtc_smp_ops);
register_smp_ops(&msp_smtc_smp_ops);
#endif
}

#ifdef CONFIG_PMCTWILED
/*
Expand Down

0 comments on commit 852fe31

Please sign in to comment.