1
2
3
4
5
6
7
8
9
10
11 #include <linux/sys.h>
12 #include <linux/errno.h>
13 #include <linux/linkage.h>
14 #include <generated/asm-offsets.h>
15 #include <asm/page.h>
16 #include <asm/pgtable.h>
17 #include <asm/assembler.h>
18
19 @ restore_image(pgd_t *resume_pg_dir, struct pbe *restore_pblist)
20 @ r0: resume_pg_dir
21 @ r1: restore_pblist
22 @ copy restore_pblist pages
23 @ restore registers from swsusp_arch_regs_cpu0
24 @
25 ENTRY(restore_image)
26 sub r0, r0, #PAGE_OFFSET
27 mov r5, #0
28 movc p0.c6, r5, #6 @invalidate ITLB & DTLB
29 movc p0.c2, r0, #0
30 nop
31 nop
32 nop
33 nop
34 nop
35 nop
36 nop
37
38 .p2align 4,,7
39 101:
40 csub.a r1, #0
41 beq 109f
42
43 ldw r6, [r1+], #PBE_ADDRESS
44 ldw r7, [r1+], #PBE_ORIN_ADDRESS
45
46 movl ip, #128
47 102: ldm.w (r8 - r15), [r6]+
48 stm.w (r8 - r15), [r7]+
49 sub.a ip, ip, #1
50 bne 102b
51
52 ldw r1, [r1+], #PBE_NEXT
53 b 101b
54
55 .p2align 4,,7
56 109:
57
58 ldw r0, =swapper_pg_dir
59 sub r0, r0, #PAGE_OFFSET
60 mov r5, #0
61 movc p0.c6, r5, #6
62 movc p0.c2, r0, #0
63 nop
64 nop
65 nop
66 nop
67 nop
68 nop
69 nop
70
71 #ifdef CONFIG_UNICORE_FPU_F64
72 ldw ip, 1f
73 add ip, ip, #SWSUSP_FPSTATE
74 lfm.w (f0 - f7 ), [ip]+
75 lfm.w (f8 - f15), [ip]+
76 lfm.w (f16 - f23), [ip]+
77 lfm.w (f24 - f31), [ip]+
78 ldw r4, [ip]
79 ctf r4, s31
80 #endif
81 mov r0, #0x0
82 ldw ip, 1f
83 add ip, ip, #SWSUSP_CPU
84 ldm.w (r4 - r15), [ip]+
85 ldm (r16 - r27, sp, pc), [ip]+ @ Load all regs saved previously
86
87 .align 2
88 1: .long swsusp_arch_regs_cpu0
89
90
91 @ swsusp_arch_suspend()
92 @ - prepare pc for resume, return from function without swsusp_save on resume
93 @ - save registers in swsusp_arch_regs_cpu0
94 @ - call swsusp_save write suspend image
95
96 ENTRY(swsusp_arch_suspend)
97 ldw ip, 1f
98 add ip, ip, #SWSUSP_CPU
99 stm.w (r4 - r15), [ip]+
100 stm.w (r16 - r27, sp, lr), [ip]+
101
102 #ifdef CONFIG_UNICORE_FPU_F64
103 ldw ip, 1f
104 add ip, ip, #SWSUSP_FPSTATE
105 sfm.w (f0 - f7 ), [ip]+
106 sfm.w (f8 - f15), [ip]+
107 sfm.w (f16 - f23), [ip]+
108 sfm.w (f24 - f31), [ip]+
109 cff r4, s31
110 stw r4, [ip]
111 #endif
112 b swsusp_save @ no return
113
114 1: .long swsusp_arch_regs_cpu0