]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 8 Sep 2008 22:55:18 +0000 (15:55 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 8 Sep 2008 22:55:18 +0000 (15:55 -0700)
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6:
  avr32: pm_standby low-power ram bug fix
  avr32: Fix lockup after Java stack underflow in user mode

arch/avr32/kernel/asm-offsets.c
arch/avr32/kernel/entry-avr32b.S
arch/avr32/mach-at32ap/pm-at32ap700x.S

index e4796c67a831aa930208c736de6722b1a460891b..d6a8193a1d2f09c8d9356212db5bd6ae44efeda4 100644 (file)
@@ -4,6 +4,8 @@
  * to extract and format the required data.
  */
 
+#include <linux/mm.h>
+#include <linux/sched.h>
 #include <linux/thread_info.h>
 #include <linux/kbuild.h>
 
@@ -17,4 +19,8 @@ void foo(void)
        OFFSET(TI_rar_saved, thread_info, rar_saved);
        OFFSET(TI_rsr_saved, thread_info, rsr_saved);
        OFFSET(TI_restart_block, thread_info, restart_block);
+       BLANK();
+       OFFSET(TSK_active_mm, task_struct, active_mm);
+       BLANK();
+       OFFSET(MM_pgd, mm_struct, pgd);
 }
index 2b398cae110c839fc5b3c3be3d9d7a48fcf3a2ec..33d49377b8beda6ae217cf40928d304d5eabfa6d 100644 (file)
@@ -334,9 +334,64 @@ save_full_context_ex:
 
        /* Low-level exception handlers */
 handle_critical:
+       /*
+        * AT32AP700x errata:
+        *
+        * After a Java stack overflow or underflow trap, any CPU
+        * memory access may cause erratic behavior. This will happen
+        * when the four least significant bits of the JOSP system
+        * register contains any value between 9 and 15 (inclusive).
+        *
+        * Possible workarounds:
+        *   - Don't use the Java Extension Module
+        *   - Ensure that the stack overflow and underflow trap
+        *     handlers do not do any memory access or trigger any
+        *     exceptions before the overflow/underflow condition is
+        *     cleared (by incrementing or decrementing the JOSP)
+        *   - Make sure that JOSP does not contain any problematic
+        *     value before doing any exception or interrupt
+        *     processing.
+        *   - Set up a critical exception handler which writes a
+        *     known-to-be-safe value, e.g. 4, to JOSP before doing
+        *     any further processing.
+        *
+        * We'll use the last workaround for now since we cannot
+        * guarantee that user space processes don't use Java mode.
+        * Non-well-behaving userland will be terminated with extreme
+        * prejudice.
+        */
+#ifdef CONFIG_CPU_AT32AP700X
+       /*
+        * There's a chance we can't touch memory, so temporarily
+        * borrow PTBR to save the stack pointer while we fix things
+        * up...
+        */
+       mtsr    SYSREG_PTBR, sp
+       mov     sp, 4
+       mtsr    SYSREG_JOSP, sp
+       mfsr    sp, SYSREG_PTBR
+       sub     pc, -2
+
+       /* Push most of pt_regs on stack. We'll do the rest later */
        sub     sp, 4
-       stmts   --sp, r0-lr
-       rcall   save_full_context_ex
+       pushm   r0-r12
+
+       /* PTBR mirrors current_thread_info()->task->active_mm->pgd */
+       get_thread_info r0
+       ld.w    r1, r0[TI_task]
+       ld.w    r2, r1[TSK_active_mm]
+       ld.w    r3, r2[MM_pgd]
+       mtsr    SYSREG_PTBR, r3
+#else
+       sub     sp, 4
+       pushm   r0-r12
+#endif
+       sub     r0, sp, -(14 * 4)
+       mov     r1, lr
+       mfsr    r2, SYSREG_RAR_EX
+       mfsr    r3, SYSREG_RSR_EX
+       pushm   r0-r3
+
        mfsr    r12, SYSREG_ECR
        mov     r11, sp
        rcall   do_critical_exception
index 5be4de65b209661edbaab3851f7283149c96dba0..17503b0ed6c9b3f5865406fb0d5f44241ce6bab7 100644 (file)
@@ -134,7 +134,7 @@ pm_standby:
        mov     r11, SDRAMC_LPR_LPCB_SELF_RFR
        bfins   r10, r11, 0, 2          /* LPCB <- self Refresh */
        sync    0                       /* flush write buffer */
-       st.w    r12[SDRAMC_LPR], r11    /* put SDRAM in self-refresh mode */
+       st.w    r12[SDRAMC_LPR], r10    /* put SDRAM in self-refresh mode */
        ld.w    r11, r12[SDRAMC_LPR]
        unmask_interrupts
        sleep   CPU_SLEEP_FROZEN