ARM: tegra: power: Add stack frame debug checks
Scott Williams [Thu, 4 Aug 2011 05:18:31 +0000 (22:18 -0700)]
Tag the stack frame created by the CPU register context push
macro with a magic number and validate that magic number in
the register context pop macro to ensure that the stack
remains balanced and uncorrupted.

Change-Id: I6aa876496e30e6e70c0c60800c1b35d217595153
Signed-off-by: Scott Williams <scwilliams@nvidia.com>

Rebase-Id: R78eba17c256f03bdd6457ca3ebb1ecdba5632e60

arch/arm/mach-tegra/sleep-t20.S
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.h

index 532bd47..aa4be11 100644 (file)
@@ -215,7 +215,7 @@ ENTRY(tegra2_sleep_wfi)
        bl      __cpuc_flush_kern_all
 #endif
 
-       pop_ctx_regs                    @ restore context registers
+       pop_ctx_regs r0, r1             @ restore context registers
        mov     pc, lr
 ENDPROC(tegra2_sleep_wfi)
 
index 50d4e43..60d5dc7 100644 (file)
@@ -151,7 +151,7 @@ ENDPROC(tegra_cpu_suspend)
  */
 
 ENTRY(tegra_cpu_save)
-       push_ctx_regs                   @ save context registers
+       push_ctx_regs r1                @ save context registers
 
        adr     r3, tegra_cpu_resume
 
@@ -202,7 +202,7 @@ tegra_cpu_resume:
 
        bl      cpu_init
 
-       pop_ctx_regs                    @ restore context registers
+       pop_ctx_regs r1, r2             @ restore context registers
        mov     pc, lr
 
 /*
index f919e96..cba062e 100644 (file)
        dsb
 .endm
 
-.macro push_ctx_regs
+#define DEBUG_CONTEXT_STACK    0
+
+/* pops a debug check token from the stack */
+.macro pop_stack_token tmp1, tmp2
+#if DEBUG_CONTEXT_STACK
+       mov32   \tmp1, 0xBAB1F00D
+       ldmfd   sp!, {\tmp2}
+       cmp     \tmp1, \tmp2
+       movne   pc, #0
+#endif
+.endm
+
+/* pushes a debug check token onto the stack */
+.macro push_stack_token tmp1
+#if DEBUG_CONTEXT_STACK
+       mov32   \tmp1, 0xBAB1F00D
+       stmfd   sp!, {\tmp1}
+#endif
+.endm
+
+.macro push_ctx_regs, tmp1
+       push_stack_token \tmp1          @ debug check word
        stmfd   sp!, {r4 - r11, lr}
        /* FIXME: The next two instructions should be removed if our change to
           save the diagnostic regsiter in the CPU context is accepted. */
        stmfd   sp!, {r4}
 .endm
 
-.macro pop_ctx_regs
+.macro pop_ctx_regs, tmp1, tmp2
        /* FIXME: The next two instructions should be removed if our change to
           save the diagnostic regsiter in the CPU context is accepted. */
        ldmfd   sp!, {r4}
        mcr     p15, 0, r4, c15, c0, 1  @ write diagnostic register
        ldmfd   sp!, {r4 - r11, lr}
+       pop_stack_token \tmp1, \tmp2    @ debug stack debug token
 .endm
 
 #else