1 /* SPDX-License-Identifier: GPL-2.0 */ !! 1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 2 /* 3 * hibernate_asm.S: Hibernaton support specif !! 3 * Hibernation support specific for mips - temporary page tables 4 * 4 * 5 * Copyright (C) 2013 Kirill V Tkhai (tkhai@ya !! 5 * Copyright (C) 2009 Lemote Inc. >> 6 * Author: Hu Hongbing <huhb@lemote.com> >> 7 * Wu Zhangjin <wuzhangjin@gmail.com> 6 */ 8 */ 7 << 8 #include <linux/linkage.h> << 9 << 10 #include <asm/asm-offsets.h> 9 #include <asm/asm-offsets.h> 11 #include <asm/cpudata.h> !! 10 #include <asm/regdef.h> 12 #include <asm/page.h> !! 11 #include <asm/asm.h> 13 << 14 ENTRY(swsusp_arch_suspend) << 15 save %sp, -128, %sp << 16 save %sp, -128, %sp << 17 flushw << 18 << 19 setuw saved_context, %g3 << 20 << 21 /* Save window regs */ << 22 rdpr %cwp, %g2 << 23 stx %g2, [%g3 + SC_REG_CWP] << 24 rdpr %wstate, %g2 << 25 stx %g2, [%g3 + SC_REG_WSTATE] << 26 stx %fp, [%g3 + SC_REG_FP] << 27 << 28 /* Save state regs */ << 29 rdpr %tick, %g2 << 30 stx %g2, [%g3 + SC_REG_TICK] << 31 rdpr %pstate, %g2 << 32 stx %g2, [%g3 + SC_REG_PSTATE] << 33 << 34 /* Save global regs */ << 35 stx %g4, [%g3 + SC_REG_G4] << 36 stx %g5, [%g3 + SC_REG_G5] << 37 stx %g6, [%g3 + SC_REG_G6] << 38 << 39 call swsusp_save << 40 nop << 41 << 42 mov %o0, %i0 << 43 restore << 44 << 45 mov %o0, %i0 << 46 ret << 47 restore << 48 << 49 ENTRY(swsusp_arch_resume) << 50 /* Write restore_pblist to %l0 */ << 51 sethi %hi(restore_pblist), %l0 << 52 ldx [%l0 + %lo(restore_pblist)], % << 53 << 54 call __flush_tlb_all << 55 nop << 56 << 57 /* Write PAGE_OFFSET to %g7 */ << 58 sethi %hi(PAGE_OFFSET), %g7 << 59 ldx [%g7 + %lo(PAGE_OFFSET)], %g7 << 60 << 61 setuw (PAGE_SIZE-8), %g3 << 62 << 63 /* Use MMU Bypass */ << 64 rd %asi, %g1 << 65 wr %g0, ASI_PHYS_USE_EC, %asi << 66 << 67 ba fill_itlb << 68 nop << 69 << 70 pbe_loop: << 71 cmp %l0, %g0 << 72 be restore_ctx << 73 sub %l0, %g7, %l0 << 74 << 75 ldxa [%l0 ] %asi, %l1 /* address << 76 ldxa [%l0 + 8] %asi, %l2 /* orig_ad << 77 << 78 /* phys addr */ << 79 sub %l1, %g7, %l1 << 80 sub %l2, %g7, %l2 << 81 << 82 mov %g3, %l3 /* PAGE_SIZE-8 */ << 83 copy_loop: << 84 ldxa [%l1 + %l3] ASI_PHYS_USE_EC, % << 85 stxa %g2, [%l2 + %l3] ASI_PHYS_USE_ << 86 cmp %l3, %g0 << 87 bne copy_loop << 88 sub %l3, 8, %l3 << 89 << 90 /* next pbe */ << 91 ba pbe_loop << 92 ldxa [%l0 + 16] %asi, %l0 << 93 << 94 restore_ctx: << 95 setuw saved_context, %g3 << 96 << 97 /* Restore window regs */ << 98 wrpr %g0, 0, %canrestore << 99 wrpr %g0, 0, %otherwin << 100 wrpr %g0, 6, %cansave << 101 wrpr %g0, 0, %cleanwin << 102 << 103 ldxa [%g3 + SC_REG_CWP] %asi, %g2 << 104 wrpr %g2, %cwp << 105 ldxa [%g3 + SC_REG_WSTATE] %asi, %g << 106 wrpr %g2, %wstate << 107 ldxa [%g3 + SC_REG_FP] %asi, %fp << 108 << 109 /* Restore state regs */ << 110 ldxa [%g3 + SC_REG_PSTATE] %asi, %g << 111 wrpr %g2, %pstate << 112 ldxa [%g3 + SC_REG_TICK] %asi, %g2 << 113 wrpr %g2, %tick << 114 << 115 /* Restore global regs */ << 116 ldxa [%g3 + SC_REG_G4] %asi, %g4 << 117 ldxa [%g3 + SC_REG_G5] %asi, %g5 << 118 ldxa [%g3 + SC_REG_G6] %asi, %g6 << 119 << 120 wr %g1, %g0, %asi << 121 << 122 restore << 123 restore << 124 << 125 wrpr %g0, 14, %pil << 126 << 127 retl << 128 mov %g0, %o0 << 129 12 130 fill_itlb: !! 13 .text 131 ba pbe_loop !! 14 LEAF(swsusp_arch_suspend) 132 wrpr %g0, 15, %pil !! 15 PTR_LA t0, saved_regs >> 16 PTR_S ra, PT_R31(t0) >> 17 PTR_S sp, PT_R29(t0) >> 18 PTR_S fp, PT_R30(t0) >> 19 PTR_S gp, PT_R28(t0) >> 20 PTR_S s0, PT_R16(t0) >> 21 PTR_S s1, PT_R17(t0) >> 22 PTR_S s2, PT_R18(t0) >> 23 PTR_S s3, PT_R19(t0) >> 24 PTR_S s4, PT_R20(t0) >> 25 PTR_S s5, PT_R21(t0) >> 26 PTR_S s6, PT_R22(t0) >> 27 PTR_S s7, PT_R23(t0) >> 28 j swsusp_save >> 29 END(swsusp_arch_suspend) >> 30 >> 31 LEAF(restore_image) >> 32 PTR_L t0, restore_pblist >> 33 0: >> 34 PTR_L t1, PBE_ADDRESS(t0) /* source */ >> 35 PTR_L t2, PBE_ORIG_ADDRESS(t0) /* destination */ >> 36 PTR_ADDU t3, t1, _PAGE_SIZE >> 37 1: >> 38 REG_L t8, (t1) >> 39 REG_S t8, (t2) >> 40 PTR_ADDIU t1, t1, SZREG >> 41 PTR_ADDIU t2, t2, SZREG >> 42 bne t1, t3, 1b >> 43 PTR_L t0, PBE_NEXT(t0) >> 44 bnez t0, 0b >> 45 PTR_LA t0, saved_regs >> 46 PTR_L ra, PT_R31(t0) >> 47 PTR_L sp, PT_R29(t0) >> 48 PTR_L fp, PT_R30(t0) >> 49 PTR_L gp, PT_R28(t0) >> 50 PTR_L s0, PT_R16(t0) >> 51 PTR_L s1, PT_R17(t0) >> 52 PTR_L s2, PT_R18(t0) >> 53 PTR_L s3, PT_R19(t0) >> 54 PTR_L s4, PT_R20(t0) >> 55 PTR_L s5, PT_R21(t0) >> 56 PTR_L s6, PT_R22(t0) >> 57 PTR_L s7, PT_R23(t0) >> 58 PTR_LI v0, 0x0 >> 59 jr ra >> 60 END(restore_image)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.