Skip to contentSkip to conversation

arc: Re-enable MMU upon die()

PATCH New Jose Abreu 3 participants 5 messages Sep 1, 2017 Synopsys ARC architecture

lore
Share & tools
lore

Jose Abreu

author
#0 lore raw

PATCH 1/1 arc: Re-enable MMU upon die()

I recently came upon a scenario where I would get a double fault after a machine check error. It turns out that for Ksymbol lookup to work with modules we need to have MMU enabled because module address is mapped in the cached space.

This patch re-enables the MMU before start printing the stacktrace making stacktracing of modules work upon a fatal exception.

Signed-off-by Jose Abreu <joabreu at synopsys.com>
Cc Vineet Gupta <vgupta at synopsys.com>
Cc Alexey Brodkin <abrodkin at synopsys.com>
---
 arch/arc/kernel/traps.c | 5 +++++
 1 file changed, 5 insertions(+)
arch/arc/kernel/traps.c +5 -0
index ff83e78..9533e06 100644
@@ -19,6 +19,8 @@
 #include <linux/ptrace.h>
 #include <linux/kprobes.h>
 #include <linux/kgdb.h>
+#include <asm/arcregs.h>
+#include <asm/mmu.h>
 #include <asm/setup.h>
 #include <asm/unaligned.h>
 #include <asm/kprobes.h>
@@ -30,6 +32,9 @@ void __init trap_init(void)
 
 void die(const char *str, struct pt_regs *regs, unsigned long address)
 {
+	/* MMU must be enabled for Ksymbol lookup in modules */
+	write_aux_reg(ARC_REG_PID, MMU_ENABLE | read_aux_reg(ARC_REG_PID));
+
 	show_kernel_fault_diag(str, regs, address);
 
 	/* DEAD END */
Signature · 1 line
1.9.1
#1 lore raw

PATCH 1/1 arc: Re-enable MMU upon die()

Hi Jose,

Quoted 7 lines · Jose Abreu

I recently came upon a scenario where I would get a double fault after a machine check error. It turns out that for Ksymbol lookup to work with modules we need to have MMU enabled because module address is mapped in the cached space.

This patch re-enables the MMU before start printing the stacktrace making stacktracing of modules work upon a fatal exception.

I'm wondering how do we end up with MMU disabled?

author
#2 lore raw

PATCH 1/1 arc: Re-enable MMU upon die()

Hi Alexey,

Quoted 8 lines · Alexey Brodkin

Hi Jose,

Quoted 5 lines · Jose Abreu

I recently came upon a scenario where I would get a double fault after a machine check error. It turns out that for Ksymbol lookup to work with modules we need to have MMU enabled because module address is mapped in the cached space.

Quoted 6 lines
Quoted 2 lines

This patch re-enables the MMU before start printing the stacktrace making stacktracing of modules work upon a fatal exception.

I'm wondering how do we end up with MMU disabled?
From ARC700 databook I cannot find any condition on which MMU could be silently disabled by hardware and IIRC there's no code in Linux kernel that disables MMU.

According to ARC 700 databook a machine check exception causes Global TLB enable to be cleared. (See ARC 700 databook, page 687).

Best regards,
Jose Miguel Abreu

Quoted 2 lines

-Alexey

#3 lore raw

PATCH 1/1 arc: Re-enable MMU upon die()

Hi Jose,

Quoted 15 lines · Jose Abreu

Hi Alexey,

Quoted 12 lines · Alexey Brodkin

Hi Jose,

Quoted 8 lines · Jose Abreu

I recently came upon a scenario where I would get a double fault after a machine check error. It turns out that for Ksymbol lookup to work with modules we need to have MMU enabled because module address is mapped in the cached space.

This patch re-enables the MMU before start printing the stacktrace making stacktracing of modules work upon a fatal exception.

Quoted 7 lines
Quoted 4 lines

I'm wondering how do we end up with MMU disabled?
From ARC700 databook I cannot find any condition on which MMU could be silently disabled by hardware and IIRC there's no code in Linux kernel that disables MMU.

According to ARC 700 databook a machine check exception causes Global TLB enable to be cleared. (See ARC 700 databook, page 687).

Thanks for pointing to that.
I didn't expect to see that note far below "Global TLB enable" bit description.

So then your change makes perfect sense.

Reviwed-by: Alexey Brodkin <abrodkin at synopsys.com>

#4 lore raw

PATCH 1/1 arc: Re-enable MMU upon die()

In reply to Jose Abreu
Quoted 29 lines · Jose Abreu

I recently came upon a scenario where I would get a double fault after a machine check error. It turns out that for Ksymbol lookup to work with modules we need to have MMU enabled because module address is mapped in the cached space.

This patch re-enables the MMU before start printing the stacktrace making stacktracing of modules work upon a fatal exception.

Signed-off-by Jose Abreu <joabreu at synopsys.com>
Cc Vineet Gupta <vgupta at synopsys.com>
Cc Alexey Brodkin <abrodkin at synopsys.com>
---
  arch/arc/kernel/traps.c | 5 +++++
  1 file changed, 5 insertions(+)
arch/arc/kernel/traps.c +2 -0
index ff83e78..9533e06 100644
@@ -19,6 +19,8 @@
  #include <linux/ptrace.h>
  #include <linux/kprobes.h>
  #include <linux/kgdb.h>
+#include <asm/arcregs.h>
+#include <asm/mmu.h>
  #include <asm/setup.h>
  #include <asm/unaligned.h>
  #include <asm/kprobes.h>

arch/arc/kernel/traps.c void __init trap_init(void) · line 36

Quoted 5 lines
arch/arc/kernel/traps.c +2 -0
@@ -30,6 +32,9 @@ void __init trap_init(void)
 
  void die(const char *str, struct pt_regs *regs, unsigned long address)
  {
+	/* MMU must be enabled for Ksymbol lookup in modules */
+	write_aux_reg(ARC_REG_PID, MMU_ENABLE | read_aux_reg(ARC_REG_PID));

die() is a *generic* API and can even be called from other places not necessarily coming from machine check.
The problem with mmu disabling is specific to machine check for dup TLB exception and needs to be fixed there not in common code.

-Vineet