|
@@ -5,6 +5,7 @@
|
|
#include <asm/debug-monitors.h>
|
|
#include <asm/debug-monitors.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/memory.h>
|
|
#include <asm/memory.h>
|
|
|
|
+#include <asm/mmu_context.h>
|
|
#include <asm/smp_plat.h>
|
|
#include <asm/smp_plat.h>
|
|
#include <asm/suspend.h>
|
|
#include <asm/suspend.h>
|
|
#include <asm/tlbflush.h>
|
|
#include <asm/tlbflush.h>
|
|
@@ -98,7 +99,18 @@ int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
|
*/
|
|
*/
|
|
ret = __cpu_suspend_enter(arg, fn);
|
|
ret = __cpu_suspend_enter(arg, fn);
|
|
if (ret == 0) {
|
|
if (ret == 0) {
|
|
- cpu_switch_mm(mm->pgd, mm);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We are resuming from reset with TTBR0_EL1 set to the
|
|
|
|
+ * idmap to enable the MMU; restore the active_mm mappings in
|
|
|
|
+ * TTBR0_EL1 unless the active_mm == &init_mm, in which case
|
|
|
|
+ * the thread entered __cpu_suspend with TTBR0_EL1 set to
|
|
|
|
+ * reserved TTBR0 page tables and should be restored as such.
|
|
|
|
+ */
|
|
|
|
+ if (mm == &init_mm)
|
|
|
|
+ cpu_set_reserved_ttbr0();
|
|
|
|
+ else
|
|
|
|
+ cpu_switch_mm(mm->pgd, mm);
|
|
|
|
+
|
|
flush_tlb_all();
|
|
flush_tlb_all();
|
|
|
|
|
|
/*
|
|
/*
|