| /* | |
| * 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 |