/* * linux/arch/unicore32/kernel/hibernate_asm.S * * Code specific to PKUnity SoC and UniCore ISA * * Maintained by GUAN Xue-tao <gxt@mprc.pku.edu.cn> * Copyright (C) 2001-2010 Guan Xuetao * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <linux/sys.h> #include <linux/errno.h> #include <linux/linkage.h> #include <generated/asm-offsets.h> #include <asm/page.h> #include <asm/pgtable.h> #include <asm/assembler.h> @ restore_image(pgd_t *resume_pg_dir, struct pbe *restore_pblist) @ r0: resume_pg_dir @ r1: restore_pblist @ copy restore_pblist pages @ restore registers from swsusp_arch_regs_cpu0 @ ENTRY(restore_image) sub r0, r0, #PAGE_OFFSET mov r5, #0 movc p0.c6, r5, #6 @invalidate ITLB & DTLB movc p0.c2, r0, #0 nop nop nop nop nop nop nop .p2align 4,,7 101: csub.a r1, #0 beq 109f ldw r6, [r1+], #PBE_ADDRESS ldw r7, [r1+], #PBE_ORIN_ADDRESS movl ip, #128 102: ldm.w (r8 - r15), [r6]+ stm.w (r8 - r15), [r7]+ sub.a ip, ip, #1 bne 102b ldw r1, [r1+], #PBE_NEXT b 101b .p2align 4,,7 109: /* go back to the original page tables */ ldw r0, =swapper_pg_dir sub r0, r0, #PAGE_OFFSET mov r5, #0 movc p0.c6, r5, #6 movc p0.c2, r0, #0 nop nop nop nop nop nop nop #ifdef CONFIG_UNICORE_FPU_F64 ldw ip, 1f add ip, ip, #SWSUSP_FPSTATE lfm.w (f0 - f7 ), [ip]+ lfm.w (f8 - f15), [ip]+ lfm.w (f16 - f23), [ip]+ lfm.w (f24 - f31), [ip]+ ldw r4, [ip] ctf r4, s31 #endif mov r0, #0x0 ldw ip, 1f add ip, ip, #SWSUSP_CPU ldm.w (r4 - r15), [ip]+ ldm (r16 - r27, sp, pc), [ip]+ @ Load all regs saved previously .align 2 1: .long swsusp_arch_regs_cpu0 @ swsusp_arch_suspend() @ - prepare pc for resume, return from function without swsusp_save on resume @ - save registers in swsusp_arch_regs_cpu0 @ - call swsusp_save write suspend image ENTRY(swsusp_arch_suspend) ldw ip, 1f add ip, ip, #SWSUSP_CPU stm.w (r4 - r15), [ip]+ stm.w (r16 - r27, sp, lr), [ip]+ #ifdef CONFIG_UNICORE_FPU_F64 ldw ip, 1f add ip, ip, #SWSUSP_FPSTATE sfm.w (f0 - f7 ), [ip]+ sfm.w (f8 - f15), [ip]+ sfm.w (f16 - f23), [ip]+ sfm.w (f24 - f31), [ip]+ cff r4, s31 stw r4, [ip] #endif b swsusp_save @ no return 1: .long swsusp_arch_regs_cpu0