* [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention
@ 2011-06-13 17:14 Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 01/14] ARM: suspend: make MULTI_CPU and !MULTI_CPU resume paths the same Russell King - ARM Linux
` (14 more replies)
0 siblings, 15 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:14 UTC (permalink / raw)
To: linux-arm-kernel
Currently cpu_suspend is not like a normal C function - when it's called
it returns normally to a bunch of code which is not expected to return.
The return path is via code pointed to by 'r3'.
It also corrupts a bunch of registers in ways which make it non-compliant
with a C API.
If we do make this complaint as a normal C-like function, it eliminates
this register saving. We also swap 'lr' and 'r3', so cpu_suspend
effectively only returns to following code on resume - and r3 points
to the suspend code.
So, this becomes:
ENTRY(acmeSoC_cpu_suspend)
stmfd sp!, {lr}
adr r3, soc_finish_suspend
bl cpu_suspend
ldmfd sp!, {pc}
ENDPROC(acmeSoC_cpu_suspend)
soc_finish_suspend:
blah
blah
put soc to sleep
never return
or even:
static void soc_suspend(void)
{
[soc specific preparation]
cpu_suspend(0, PLAT_PHYS_OFFSET - PAGE_OFFSET,
soc_suspend_arg, soc_suspend_fn);
[soc specific cleanup ]
}
where soc_suspend_fn can be either assembly or C code - but must never
return.
Tested on Assabet (SA1100) only.
arch/arm/kernel/sleep.S | 70 +++++++++++++++-------------------------
arch/arm/mach-exynos4/sleep.S | 10 ++----
arch/arm/mach-pxa/sleep.S | 48 ++++++++++++++--------------
arch/arm/mach-s3c64xx/sleep.S | 11 ++-----
arch/arm/mach-s5pv210/sleep.S | 10 ++----
arch/arm/mach-sa1100/sleep.S | 17 +++-------
arch/arm/plat-s3c24xx/sleep.S | 12 ++-----
7 files changed, 67 insertions(+), 111 deletions(-)
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 01/14] ARM: suspend: make MULTI_CPU and !MULTI_CPU resume paths the same
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
@ 2011-06-13 17:15 ` Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 02/14] ARM: suspend: move return address (for cpu_resume) to top of stack Russell King - ARM Linux
` (13 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:15 UTC (permalink / raw)
To: linux-arm-kernel
Eliminate the differences between MULTI_CPU and non-MULTI_CPU resume
paths, making the saved structure identical irrespective of the way
the kernel was configured.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 12 +++---------
1 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 6398ead..97a6577 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -40,9 +40,11 @@ ENTRY(cpu_suspend)
#else
mov r2, sp @ current virtual SP
ldr r0, =cpu_suspend_size
+ ldr ip, =cpu_do_resume
sub sp, sp, r0 @ allocate CPU state on stack
mov r0, sp @ save pointer
- stmfd sp!, {r1, r2, r3} @ save v:p, virt SP, return fn
+ add ip, ip, r1 @ convert resume fn to phys
+ stmfd sp!, {r1, r2, r3, ip} @ save v:p, virt SP, retfn, phys resume fn
ldr r3, =sleep_save_sp
add r2, sp, r1 @ convert SP to phys
#ifdef CONFIG_SMP
@@ -120,20 +122,12 @@ ENTRY(cpu_resume)
ldr r0, sleep_save_sp @ stack phys addr
#endif
setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1 @ set SVC, irqs off
-#ifdef MULTI_CPU
@ load v:p, stack, return fn, resume fn
ARM( ldmia r0!, {r1, sp, lr, pc} )
THUMB( ldmia r0!, {r1, r2, r3, r4} )
THUMB( mov sp, r2 )
THUMB( mov lr, r3 )
THUMB( bx r4 )
-#else
- @ load v:p, stack, return fn
- ARM( ldmia r0!, {r1, sp, lr} )
-THUMB( ldmia r0!, {r1, r2, lr} )
-THUMB( mov sp, r2 )
- b cpu_do_resume
-#endif
ENDPROC(cpu_resume)
sleep_save_sp:
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 02/14] ARM: suspend: move return address (for cpu_resume) to top of stack
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 01/14] ARM: suspend: make MULTI_CPU and !MULTI_CPU resume paths the same Russell King - ARM Linux
@ 2011-06-13 17:15 ` Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths Russell King - ARM Linux
` (12 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:15 UTC (permalink / raw)
To: linux-arm-kernel
Move the return address for cpu_resume to the top of stack so that
cpu_resume looks more like a normal function.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 97a6577..f8e9251 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -15,6 +15,7 @@
* r0-r3,r9,r10,lr corrupted
*/
ENTRY(cpu_suspend)
+ stmfd sp!, {r3}
mov r9, lr
#ifdef MULTI_CPU
ldr r10, =processor
@@ -24,7 +25,7 @@ ENTRY(cpu_suspend)
sub sp, sp, r0 @ allocate CPU state on stack
mov r0, sp @ save pointer
add ip, ip, r1 @ convert resume fn to phys
- stmfd sp!, {r1, r2, r3, ip} @ save v:p, virt SP, retfn, phys resume fn
+ stmfd sp!, {r1, r2, ip} @ save v:p, virt SP, phys resume fn
ldr r3, =sleep_save_sp
add r2, sp, r1 @ convert SP to phys
#ifdef CONFIG_SMP
@@ -44,7 +45,7 @@ ENTRY(cpu_suspend)
sub sp, sp, r0 @ allocate CPU state on stack
mov r0, sp @ save pointer
add ip, ip, r1 @ convert resume fn to phys
- stmfd sp!, {r1, r2, r3, ip} @ save v:p, virt SP, retfn, phys resume fn
+ stmfd sp!, {r1, r2, ip} @ save v:p, virt SP, phys resume fn
ldr r3, =sleep_save_sp
add r2, sp, r1 @ convert SP to phys
#ifdef CONFIG_SMP
@@ -99,7 +100,7 @@ ENDPROC(cpu_resume_turn_mmu_on)
cpu_resume_after_mmu:
str r5, [r2, r4, lsl #2] @ restore old mapping
mcr p15, 0, r0, c1, c0, 0 @ turn on D-cache
- mov pc, lr
+ ldmfd sp!, {pc}
ENDPROC(cpu_resume_after_mmu)
/*
@@ -122,12 +123,11 @@ ENTRY(cpu_resume)
ldr r0, sleep_save_sp @ stack phys addr
#endif
setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1 @ set SVC, irqs off
- @ load v:p, stack, return fn, resume fn
- ARM( ldmia r0!, {r1, sp, lr, pc} )
-THUMB( ldmia r0!, {r1, r2, r3, r4} )
+ @ load v:p, stack, resume fn
+ ARM( ldmia r0!, {r1, sp, pc} )
+THUMB( ldmia r0!, {r1, r2, r3} )
THUMB( mov sp, r2 )
-THUMB( mov lr, r3 )
-THUMB( bx r4 )
+THUMB( bx r3 )
ENDPROC(cpu_resume)
sleep_save_sp:
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 01/14] ARM: suspend: make MULTI_CPU and !MULTI_CPU resume paths the same Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 02/14] ARM: suspend: move return address (for cpu_resume) to top of stack Russell King - ARM Linux
@ 2011-06-13 17:15 ` Russell King - ARM Linux
2011-06-13 19:29 ` Nicolas Pitre
2011-06-13 17:16 ` [PATCH 04/14] ARM: suspend: preserve r4 - r11 across a suspend Russell King - ARM Linux
` (11 subsequent siblings)
14 siblings, 1 reply; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:15 UTC (permalink / raw)
To: linux-arm-kernel
Very little code is different between these two paths now, so extract
the common code.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 24 ++++++------------------
1 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index f8e9251..0a778c3 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -19,29 +19,13 @@ ENTRY(cpu_suspend)
mov r9, lr
#ifdef MULTI_CPU
ldr r10, =processor
- mov r2, sp @ current virtual SP
ldr r0, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
ldr ip, [r10, #CPU_DO_RESUME] @ virtual resume function
- sub sp, sp, r0 @ allocate CPU state on stack
- mov r0, sp @ save pointer
- add ip, ip, r1 @ convert resume fn to phys
- stmfd sp!, {r1, r2, ip} @ save v:p, virt SP, phys resume fn
- ldr r3, =sleep_save_sp
- add r2, sp, r1 @ convert SP to phys
-#ifdef CONFIG_SMP
- ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
- ALT_UP(mov lr, #0)
- and lr, lr, #15
- str r2, [r3, lr, lsl #2] @ save phys SP
#else
- str r2, [r3] @ save phys SP
-#endif
- mov lr, pc
- ldr pc, [r10, #CPU_DO_SUSPEND] @ save CPU state
-#else
- mov r2, sp @ current virtual SP
ldr r0, =cpu_suspend_size
ldr ip, =cpu_do_resume
+#endif
+ mov r2, sp @ current virtual SP
sub sp, sp, r0 @ allocate CPU state on stack
mov r0, sp @ save pointer
add ip, ip, r1 @ convert resume fn to phys
@@ -56,6 +40,10 @@ ENTRY(cpu_suspend)
#else
str r2, [r3] @ save phys SP
#endif
+#ifdef MULTI_CPU
+ mov lr, pc
+ ldr pc, [r10, #CPU_DO_SUSPEND] @ save CPU state
+#else
bl cpu_do_suspend
#endif
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 04/14] ARM: suspend: preserve r4 - r11 across a suspend
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (2 preceding siblings ...)
2011-06-13 17:15 ` [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths Russell King - ARM Linux
@ 2011-06-13 17:16 ` Russell King - ARM Linux
2011-06-13 17:16 ` [PATCH 05/14] ARM: suspend: reallocate registers to avoid r2, r3 Russell King - ARM Linux
` (10 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:16 UTC (permalink / raw)
To: linux-arm-kernel
Make cpu_suspend()..return function preserve r4 to r11 across a suspend
cycle. This is in preparation of relieving platform support code from
this task.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 0a778c3..8dbca93 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -12,10 +12,11 @@
* r1 = v:p offset
* r3 = virtual return function
* Note: sp is decremented to allocate space for CPU state on stack
- * r0-r3,r9,r10,lr corrupted
+ * r0-r3,ip,lr corrupted
*/
ENTRY(cpu_suspend)
stmfd sp!, {r3}
+ stmfd sp!, {r4 - r11}
mov r9, lr
#ifdef MULTI_CPU
ldr r10, =processor
@@ -88,7 +89,7 @@ ENDPROC(cpu_resume_turn_mmu_on)
cpu_resume_after_mmu:
str r5, [r2, r4, lsl #2] @ restore old mapping
mcr p15, 0, r0, c1, c0, 0 @ turn on D-cache
- ldmfd sp!, {pc}
+ ldmfd sp!, {r4 - r11, pc}
ENDPROC(cpu_resume_after_mmu)
/*
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 05/14] ARM: suspend: reallocate registers to avoid r2, r3
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (3 preceding siblings ...)
2011-06-13 17:16 ` [PATCH 04/14] ARM: suspend: preserve r4 - r11 across a suspend Russell King - ARM Linux
@ 2011-06-13 17:16 ` Russell King - ARM Linux
2011-06-13 17:16 ` [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention Russell King - ARM Linux
` (9 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:16 UTC (permalink / raw)
To: linux-arm-kernel
Avoid using r2 and r3 in the suspend code, allowing these to be
passed further into the function as arguments.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 8dbca93..358be13 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -20,26 +20,26 @@ ENTRY(cpu_suspend)
mov r9, lr
#ifdef MULTI_CPU
ldr r10, =processor
- ldr r0, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
+ ldr r5, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
ldr ip, [r10, #CPU_DO_RESUME] @ virtual resume function
#else
- ldr r0, =cpu_suspend_size
+ ldr r5, =cpu_suspend_size
ldr ip, =cpu_do_resume
#endif
- mov r2, sp @ current virtual SP
- sub sp, sp, r0 @ allocate CPU state on stack
+ mov r6, sp @ current virtual SP
+ sub sp, sp, r5 @ allocate CPU state on stack
mov r0, sp @ save pointer
add ip, ip, r1 @ convert resume fn to phys
- stmfd sp!, {r1, r2, ip} @ save v:p, virt SP, phys resume fn
- ldr r3, =sleep_save_sp
- add r2, sp, r1 @ convert SP to phys
+ stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn
+ ldr r5, =sleep_save_sp
+ add r6, sp, r1 @ convert SP to phys
#ifdef CONFIG_SMP
ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
ALT_UP(mov lr, #0)
and lr, lr, #15
- str r2, [r3, lr, lsl #2] @ save phys SP
+ str r6, [r5, lr, lsl #2] @ save phys SP
#else
- str r2, [r3] @ save phys SP
+ str r6, [r5] @ save phys SP
#endif
#ifdef MULTI_CPU
mov lr, pc
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (4 preceding siblings ...)
2011-06-13 17:16 ` [PATCH 05/14] ARM: suspend: reallocate registers to avoid r2, r3 Russell King - ARM Linux
@ 2011-06-13 17:16 ` Russell King - ARM Linux
2011-06-17 2:54 ` Rob Herring
2011-06-13 17:17 ` [PATCH 07/14] ARM: suspend: move sa1100 to use proper suspend func arg0 Russell King - ARM Linux
` (8 subsequent siblings)
14 siblings, 1 reply; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:16 UTC (permalink / raw)
To: linux-arm-kernel
Save the suspend function pointer onto the stack for use when returning.
Allocate r2 to pass an argument to the suspend function.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index 358be13..b924bcc 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -10,6 +10,7 @@
/*
* Save CPU state for a suspend
* r1 = v:p offset
+ * r2 = suspend function arg0
* r3 = virtual return function
* Note: sp is decremented to allocate space for CPU state on stack
* r0-r3,ip,lr corrupted
@@ -17,7 +18,6 @@
ENTRY(cpu_suspend)
stmfd sp!, {r3}
stmfd sp!, {r4 - r11}
- mov r9, lr
#ifdef MULTI_CPU
ldr r10, =processor
ldr r5, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
@@ -33,6 +33,7 @@ ENTRY(cpu_suspend)
stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn
ldr r5, =sleep_save_sp
add r6, sp, r1 @ convert SP to phys
+ stmfd sp!, {r2, lr} @ save suspend func arg and pointer
#ifdef CONFIG_SMP
ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
ALT_UP(mov lr, #0)
@@ -51,12 +52,12 @@ ENTRY(cpu_suspend)
@ flush data cache
#ifdef MULTI_CACHE
ldr r10, =cpu_cache
- mov lr, r9
+ mov lr, pc
ldr pc, [r10, #CACHE_FLUSH_KERN_ALL]
#else
- mov lr, r9
- b __cpuc_flush_kern_all
+ bl __cpuc_flush_kern_all
#endif
+ ldmfd sp!, {r0, pc} @ call suspend fn
ENDPROC(cpu_suspend)
.ltorg
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 07/14] ARM: suspend: move sa1100 to use proper suspend func arg0
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (5 preceding siblings ...)
2011-06-13 17:16 ` [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention Russell King - ARM Linux
@ 2011-06-13 17:17 ` Russell King - ARM Linux
2011-06-13 17:17 ` [PATCH 08/14] ARM: suspend: convert cpu_suspend() to a normal function Russell King - ARM Linux
` (7 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:17 UTC (permalink / raw)
To: linux-arm-kernel
In the previous commit, we introduced an official way to supply an
argument to the suspend function. Convert the sa1100 suspend code
to use this method.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/mach-pxa/sleep.S | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S
index 6f53688..613ddfa 100644
--- a/arch/arm/mach-pxa/sleep.S
+++ b/arch/arm/mach-pxa/sleep.S
@@ -59,7 +59,7 @@ ENTRY(pxa27x_cpu_suspend)
mra r2, r3, acc0
#endif
stmfd sp!, {r2 - r12, lr} @ save registers on stack
- mov r4, r0 @ save sleep mode
+ mov r2, r0 @ save sleep mode
ldr r3, =pxa_cpu_resume @ resume function
bl cpu_suspend
@@ -67,7 +67,7 @@ ENTRY(pxa27x_cpu_suspend)
@ (also workaround for sighting 28071)
@ prepare value for sleep mode
- mov r1, r4 @ sleep mode
+ mov r1, r0 @ sleep mode
@ prepare pointer to physical address 0 (virtual mapping in generic.c)
mov r2, #UNCACHED_PHYS_0
@@ -109,11 +109,11 @@ ENTRY(pxa27x_cpu_suspend)
ENTRY(pxa25x_cpu_suspend)
stmfd sp!, {r2 - r12, lr} @ save registers on stack
- mov r4, r0 @ save sleep mode
+ mov r2, r0 @ save sleep mode
ldr r3, =pxa_cpu_resume @ resume function
bl cpu_suspend
@ prepare value for sleep mode
- mov r1, r4 @ sleep mode
+ mov r1, r0 @ sleep mode
@ prepare pointer to physical address 0 (virtual mapping in generic.c)
mov r2, #UNCACHED_PHYS_0
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 08/14] ARM: suspend: convert cpu_suspend() to a normal function
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (6 preceding siblings ...)
2011-06-13 17:17 ` [PATCH 07/14] ARM: suspend: move sa1100 to use proper suspend func arg0 Russell King - ARM Linux
@ 2011-06-13 17:17 ` Russell King - ARM Linux
2011-06-13 17:17 ` [PATCH 09/14] ARM: suspend: plat-s3c24xx: cleanup s3c_cpu_save Russell King - ARM Linux
` (6 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:17 UTC (permalink / raw)
To: linux-arm-kernel
cpu_suspend() has a weird calling method which makes it only possible to
call from assembly code: it returns with a modified stack pointer to
finish the suspend, but on resume, it 'returns' via a provided pointer.
We can make cpu_suspend() appear to be a normal function merely by
swapping the resume pointer argument and the link register.
Do so, and update all callers to take account of this more traditional
behaviour.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/sleep.S | 10 ++++------
arch/arm/mach-exynos4/sleep.S | 7 +++----
arch/arm/mach-pxa/sleep.S | 13 ++++++++++---
arch/arm/mach-s3c64xx/sleep.S | 9 +++------
arch/arm/mach-s5pv210/sleep.S | 7 +++----
arch/arm/mach-sa1100/sleep.S | 15 ++++-----------
arch/arm/plat-s3c24xx/sleep.S | 10 +++-------
7 files changed, 30 insertions(+), 41 deletions(-)
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index b924bcc..e062677 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -11,13 +11,11 @@
* Save CPU state for a suspend
* r1 = v:p offset
* r2 = suspend function arg0
- * r3 = virtual return function
- * Note: sp is decremented to allocate space for CPU state on stack
- * r0-r3,ip,lr corrupted
+ * r3 = suspend function
+ * Note: does not return until system resumes
*/
ENTRY(cpu_suspend)
- stmfd sp!, {r3}
- stmfd sp!, {r4 - r11}
+ stmfd sp!, {r4 - r11, lr}
#ifdef MULTI_CPU
ldr r10, =processor
ldr r5, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
@@ -33,7 +31,7 @@ ENTRY(cpu_suspend)
stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn
ldr r5, =sleep_save_sp
add r6, sp, r1 @ convert SP to phys
- stmfd sp!, {r2, lr} @ save suspend func arg and pointer
+ stmfd sp!, {r2, r3} @ save suspend func arg and pointer
#ifdef CONFIG_SMP
ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
ALT_UP(mov lr, #0)
diff --git a/arch/arm/mach-exynos4/sleep.S b/arch/arm/mach-exynos4/sleep.S
index 6b62425..d9a2287 100644
--- a/arch/arm/mach-exynos4/sleep.S
+++ b/arch/arm/mach-exynos4/sleep.S
@@ -42,16 +42,15 @@
ENTRY(s3c_cpu_save)
stmfd sp!, { r3 - r12, lr }
- ldr r3, =resume_with_mmu
+ adr r3, BSYM(exynos4_finish_suspend)
bl cpu_suspend
+ ldmfd sp!, { r3 - r12, pc }
+exynos4_finish_suspend:
ldr r0, =pm_cpu_sleep
ldr r0, [ r0 ]
mov pc, r0
-resume_with_mmu:
- ldmfd sp!, { r3 - r12, pc }
-
.ltorg
/*
diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S
index 613ddfa..3a67887 100644
--- a/arch/arm/mach-pxa/sleep.S
+++ b/arch/arm/mach-pxa/sleep.S
@@ -35,9 +35,11 @@ ENTRY(pxa3xx_cpu_suspend)
#endif
stmfd sp!, {r2 - r12, lr} @ save registers on stack
mov r1, r0
- ldr r3, =pxa_cpu_resume @ resume function
+ adr r3, BSYM(pxa3xx_finish_suspend)
bl cpu_suspend
+ b pxa_cpu_resume
+pxa3xx_finish_suspend:
mov r0, #0x06 @ S2D3C4 mode
mcr p14, 0, r0, c7, c0, 0 @ enter sleep
@@ -60,9 +62,11 @@ ENTRY(pxa27x_cpu_suspend)
#endif
stmfd sp!, {r2 - r12, lr} @ save registers on stack
mov r2, r0 @ save sleep mode
- ldr r3, =pxa_cpu_resume @ resume function
+ adr r3, BSYM(pxa27x_finish_suspend)
bl cpu_suspend
+ b pxa_cpu_resume
+pxa27x_finish_suspend:
@ Put the processor to sleep
@ (also workaround for sighting 28071)
@@ -110,8 +114,11 @@ ENTRY(pxa27x_cpu_suspend)
ENTRY(pxa25x_cpu_suspend)
stmfd sp!, {r2 - r12, lr} @ save registers on stack
mov r2, r0 @ save sleep mode
- ldr r3, =pxa_cpu_resume @ resume function
+ adr r3, BSYM(pxa25x_finish_suspend)
bl cpu_suspend
+ b pxa_cpu_resume
+
+pxa25x_finish_suspend:
@ prepare value for sleep mode
mov r1, r0 @ sleep mode
diff --git a/arch/arm/mach-s3c64xx/sleep.S b/arch/arm/mach-s3c64xx/sleep.S
index 1f87732..dc4f582 100644
--- a/arch/arm/mach-s3c64xx/sleep.S
+++ b/arch/arm/mach-s3c64xx/sleep.S
@@ -36,18 +36,15 @@
ENTRY(s3c_cpu_save)
stmfd sp!, { r4 - r12, lr }
- ldr r3, =resume_with_mmu
+ adr r3, BSYM(s3c64xx_finish_suspend)
bl cpu_suspend
+ ldmfd sp!, { r4 - r12, pc }
+s3c64xx_finish_suspend:
@@ call final suspend code
ldr r0, =pm_cpu_sleep
ldr pc, [r0]
- @@ return to the caller, after the MMU is turned on.
- @@ restore the last bits of the stack and return.
-resume_with_mmu:
- ldmfd sp!, { r4 - r12, pc } @ return, from sp from s3c_cpu_save
-
/* Sleep magic, the word before the resume entry point so that the
* bootloader can check for a resumeable image. */
diff --git a/arch/arm/mach-s5pv210/sleep.S b/arch/arm/mach-s5pv210/sleep.S
index a3d6494..1182fc8 100644
--- a/arch/arm/mach-s5pv210/sleep.S
+++ b/arch/arm/mach-s5pv210/sleep.S
@@ -41,16 +41,15 @@
ENTRY(s3c_cpu_save)
stmfd sp!, { r3 - r12, lr }
- ldr r3, =resume_with_mmu
+ adr r3, BSYM(s5pv210_finish_suspend)
bl cpu_suspend
+ ldmfd sp!, { r3 - r12, pc }
+s5pv210_finish_suspend:
ldr r0, =pm_cpu_sleep
ldr r0, [ r0 ]
mov pc, r0
-resume_with_mmu:
- ldmfd sp!, { r3 - r12, pc }
-
.ltorg
/* sleep magic, to allow the bootloader to check for an valid
diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S
index 04f2a61..214f4e2 100644
--- a/arch/arm/mach-sa1100/sleep.S
+++ b/arch/arm/mach-sa1100/sleep.S
@@ -31,9 +31,12 @@
ENTRY(sa1100_cpu_suspend)
stmfd sp!, {r4 - r12, lr} @ save registers on stack
mov r1, r0
- ldr r3, =sa1100_cpu_resume @ return function
+ adr r3, BSYM(sa1100_finish_suspend)
bl cpu_suspend
+ mcr p15, 0, r1, c15, c1, 2 @ enable clock switching
+ ldmfd sp!, {r4 - r12, pc} @ return to caller
+sa1100_finish_suspend:
@ disable clock switching
mcr p15, 0, r1, c15, c2, 2
@@ -139,13 +142,3 @@ sa1110_sdram_controller_fix:
str r13, [r12]
20: b 20b @ loop waiting for sleep
-
-/*
- * cpu_sa1100_resume()
- *
- * entry point from bootloader into kernel during resume
- */
- .align 5
-sa1100_cpu_resume:
- mcr p15, 0, r1, c15, c1, 2 @ enable clock switching
- ldmfd sp!, {r4 - r12, pc} @ return to caller
diff --git a/arch/arm/plat-s3c24xx/sleep.S b/arch/arm/plat-s3c24xx/sleep.S
index fd7032f..f822e62 100644
--- a/arch/arm/plat-s3c24xx/sleep.S
+++ b/arch/arm/plat-s3c24xx/sleep.S
@@ -49,21 +49,17 @@
ENTRY(s3c_cpu_save)
stmfd sp!, { r4 - r12, lr }
- ldr r3, =resume_with_mmu
+ adr r3, BSYM(s3c24xx_finish_suspend)
bl cpu_suspend
+ ldmfd sp!, { r4 - r12, pc }
+s3c24xx_finish_suspend:
@@ jump to final code to send system to sleep
ldr r0, =pm_cpu_sleep
@@ldr pc, [ r0 ]
ldr r0, [ r0 ]
mov pc, r0
- @@ return to the caller, after having the MMU
- @@ turned on, this restores the last bits from the
- @@ stack
-resume_with_mmu:
- ldmfd sp!, { r4 - r12, pc }
-
.ltorg
/* sleep magic, to allow the bootloader to check for an valid
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 09/14] ARM: suspend: plat-s3c24xx: cleanup s3c_cpu_save
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (7 preceding siblings ...)
2011-06-13 17:17 ` [PATCH 08/14] ARM: suspend: convert cpu_suspend() to a normal function Russell King - ARM Linux
@ 2011-06-13 17:17 ` Russell King - ARM Linux
2011-06-13 17:18 ` [PATCH 10/14] ARM: suspend: sa1100: cleanup sa1100_cpu_suspend Russell King - ARM Linux
` (5 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:17 UTC (permalink / raw)
To: linux-arm-kernel
s3c_cpu_save does not need to save any registers with the new
cpu_suspend calling convention. Remove these redundant instructions.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/plat-s3c24xx/sleep.S | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/arch/arm/plat-s3c24xx/sleep.S b/arch/arm/plat-s3c24xx/sleep.S
index f822e62..6ada459 100644
--- a/arch/arm/plat-s3c24xx/sleep.S
+++ b/arch/arm/plat-s3c24xx/sleep.S
@@ -48,10 +48,8 @@
*/
ENTRY(s3c_cpu_save)
- stmfd sp!, { r4 - r12, lr }
adr r3, BSYM(s3c24xx_finish_suspend)
- bl cpu_suspend
- ldmfd sp!, { r4 - r12, pc }
+ b cpu_suspend
s3c24xx_finish_suspend:
@@ jump to final code to send system to sleep
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 10/14] ARM: suspend: sa1100: cleanup sa1100_cpu_suspend
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (8 preceding siblings ...)
2011-06-13 17:17 ` [PATCH 09/14] ARM: suspend: plat-s3c24xx: cleanup s3c_cpu_save Russell King - ARM Linux
@ 2011-06-13 17:18 ` Russell King - ARM Linux
2011-06-13 17:18 ` [PATCH 11/14] ARM: suspend: mach-s5pv210: cleanup s3c_cpu_save Russell King - ARM Linux
` (4 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:18 UTC (permalink / raw)
To: linux-arm-kernel
sa1100_cpu_suspend does not need to save any registers to the stack
with the new cpu_suspend calling convention. Remove these redundant
instructions.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/mach-sa1100/sleep.S | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S
index 214f4e2..e814b60 100644
--- a/arch/arm/mach-sa1100/sleep.S
+++ b/arch/arm/mach-sa1100/sleep.S
@@ -29,12 +29,12 @@
*/
ENTRY(sa1100_cpu_suspend)
- stmfd sp!, {r4 - r12, lr} @ save registers on stack
+ mov r9, lr
mov r1, r0
adr r3, BSYM(sa1100_finish_suspend)
bl cpu_suspend
mcr p15, 0, r1, c15, c1, 2 @ enable clock switching
- ldmfd sp!, {r4 - r12, pc} @ return to caller
+ mov pc, r9 @ return to caller
sa1100_finish_suspend:
@ disable clock switching
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 11/14] ARM: suspend: mach-s5pv210: cleanup s3c_cpu_save
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (9 preceding siblings ...)
2011-06-13 17:18 ` [PATCH 10/14] ARM: suspend: sa1100: cleanup sa1100_cpu_suspend Russell King - ARM Linux
@ 2011-06-13 17:18 ` Russell King - ARM Linux
2011-06-13 17:18 ` [PATCH 12/14] ARM: suspend: mach-exynos4: " Russell King - ARM Linux
` (3 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:18 UTC (permalink / raw)
To: linux-arm-kernel
s3c_cpu_save does not need to save any registers with the new
cpu_suspend calling convention. Remove these redundant instructions.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/mach-s5pv210/sleep.S | 5 +----
1 files changed, 1 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-s5pv210/sleep.S b/arch/arm/mach-s5pv210/sleep.S
index 1182fc8..28dfeff 100644
--- a/arch/arm/mach-s5pv210/sleep.S
+++ b/arch/arm/mach-s5pv210/sleep.S
@@ -39,11 +39,8 @@
*/
ENTRY(s3c_cpu_save)
-
- stmfd sp!, { r3 - r12, lr }
adr r3, BSYM(s5pv210_finish_suspend)
- bl cpu_suspend
- ldmfd sp!, { r3 - r12, pc }
+ b cpu_suspend
s5pv210_finish_suspend:
ldr r0, =pm_cpu_sleep
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 12/14] ARM: suspend: mach-exynos4: cleanup s3c_cpu_save
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (10 preceding siblings ...)
2011-06-13 17:18 ` [PATCH 11/14] ARM: suspend: mach-s5pv210: cleanup s3c_cpu_save Russell King - ARM Linux
@ 2011-06-13 17:18 ` Russell King - ARM Linux
2011-06-13 17:19 ` [PATCH 13/14] ARM: suspend: mach-s3c64xx: " Russell King - ARM Linux
` (2 subsequent siblings)
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:18 UTC (permalink / raw)
To: linux-arm-kernel
s3c_cpu_save does not need to save any registers with the new
cpu_suspend calling convention. Remove these redundant instructions.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/mach-exynos4/sleep.S | 5 +----
1 files changed, 1 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-exynos4/sleep.S b/arch/arm/mach-exynos4/sleep.S
index d9a2287..b56a491 100644
--- a/arch/arm/mach-exynos4/sleep.S
+++ b/arch/arm/mach-exynos4/sleep.S
@@ -40,11 +40,8 @@
*/
ENTRY(s3c_cpu_save)
-
- stmfd sp!, { r3 - r12, lr }
adr r3, BSYM(exynos4_finish_suspend)
- bl cpu_suspend
- ldmfd sp!, { r3 - r12, pc }
+ b cpu_suspend
exynos4_finish_suspend:
ldr r0, =pm_cpu_sleep
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 13/14] ARM: suspend: mach-s3c64xx: cleanup s3c_cpu_save
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (11 preceding siblings ...)
2011-06-13 17:18 ` [PATCH 12/14] ARM: suspend: mach-exynos4: " Russell King - ARM Linux
@ 2011-06-13 17:19 ` Russell King - ARM Linux
2011-06-13 17:19 ` [PATCH 14/14] ARM: suspend: pxa: cleanup PXA suspend code Russell King - ARM Linux
2011-06-13 19:16 ` [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Nicolas Pitre
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:19 UTC (permalink / raw)
To: linux-arm-kernel
s3c_cpu_save does not need to save any registers with the new
cpu_suspend calling convention. Remove these redundant instructions.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/mach-s3c64xx/sleep.S | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-s3c64xx/sleep.S b/arch/arm/mach-s3c64xx/sleep.S
index dc4f582..2fd3433 100644
--- a/arch/arm/mach-s3c64xx/sleep.S
+++ b/arch/arm/mach-s3c64xx/sleep.S
@@ -35,10 +35,8 @@
*/
ENTRY(s3c_cpu_save)
- stmfd sp!, { r4 - r12, lr }
adr r3, BSYM(s3c64xx_finish_suspend)
- bl cpu_suspend
- ldmfd sp!, { r4 - r12, pc }
+ b cpu_suspend
s3c64xx_finish_suspend:
@@ call final suspend code
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 14/14] ARM: suspend: pxa: cleanup PXA suspend code
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (12 preceding siblings ...)
2011-06-13 17:19 ` [PATCH 13/14] ARM: suspend: mach-s3c64xx: " Russell King - ARM Linux
@ 2011-06-13 17:19 ` Russell King - ARM Linux
2011-06-13 19:16 ` [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Nicolas Pitre
14 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 17:19 UTC (permalink / raw)
To: linux-arm-kernel
Remove now redundant stacking of registers.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/mach-pxa/sleep.S | 33 +++++++++++++--------------------
1 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S
index 3a67887..cd39293 100644
--- a/arch/arm/mach-pxa/sleep.S
+++ b/arch/arm/mach-pxa/sleep.S
@@ -33,11 +33,15 @@ ENTRY(pxa3xx_cpu_suspend)
#ifndef CONFIG_IWMMXT
mra r2, r3, acc0
#endif
- stmfd sp!, {r2 - r12, lr} @ save registers on stack
+ stmfd sp!, {r2, r3, lr} @ save registers on stack
mov r1, r0
adr r3, BSYM(pxa3xx_finish_suspend)
bl cpu_suspend
- b pxa_cpu_resume
+ ldmfd sp!, {r2, r3, lr}
+#ifndef CONFIG_IWMMXT
+ mar acc0, r2, r3
+#endif
+ mov pc, lr
pxa3xx_finish_suspend:
mov r0, #0x06 @ S2D3C4 mode
@@ -60,11 +64,15 @@ ENTRY(pxa27x_cpu_suspend)
#ifndef CONFIG_IWMMXT
mra r2, r3, acc0
#endif
- stmfd sp!, {r2 - r12, lr} @ save registers on stack
+ stmfd sp!, {r2, r3, lr} @ save registers on stack
mov r2, r0 @ save sleep mode
adr r3, BSYM(pxa27x_finish_suspend)
bl cpu_suspend
- b pxa_cpu_resume
+ ldmfd sp!, {r2, r3, lr}
+#ifndef CONFIG_IWMMXT
+ mar acc0, r2, r3
+#endif
+ mov pc, lr
pxa27x_finish_suspend:
@ Put the processor to sleep
@@ -112,11 +120,9 @@ pxa27x_finish_suspend:
*/
ENTRY(pxa25x_cpu_suspend)
- stmfd sp!, {r2 - r12, lr} @ save registers on stack
mov r2, r0 @ save sleep mode
adr r3, BSYM(pxa25x_finish_suspend)
- bl cpu_suspend
- b pxa_cpu_resume
+ b cpu_suspend
pxa25x_finish_suspend:
@ prepare value for sleep mode
@@ -202,16 +208,3 @@ pxa_cpu_do_suspend:
mcr p14, 0, r1, c7, c0, 0 @ PWRMODE
20: b 20b @ loop waiting for sleep
-
-/*
- * pxa_cpu_resume()
- *
- * entry point from bootloader into kernel during resume
- */
- .align 5
-pxa_cpu_resume:
- ldmfd sp!, {r2, r3}
-#ifndef CONFIG_IWMMXT
- mar acc0, r2, r3
-#endif
- ldmfd sp!, {r4 - r12, pc} @ return to caller
--
1.7.4.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
` (13 preceding siblings ...)
2011-06-13 17:19 ` [PATCH 14/14] ARM: suspend: pxa: cleanup PXA suspend code Russell King - ARM Linux
@ 2011-06-13 19:16 ` Nicolas Pitre
14 siblings, 0 replies; 20+ messages in thread
From: Nicolas Pitre @ 2011-06-13 19:16 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, 13 Jun 2011, Russell King - ARM Linux wrote:
> Currently cpu_suspend is not like a normal C function - when it's called
> it returns normally to a bunch of code which is not expected to return.
> The return path is via code pointed to by 'r3'.
>
> It also corrupts a bunch of registers in ways which make it non-compliant
> with a C API.
>
> If we do make this complaint as a normal C-like function, it eliminates
> this register saving. We also swap 'lr' and 'r3', so cpu_suspend
> effectively only returns to following code on resume - and r3 points
> to the suspend code.
>
> So, this becomes:
> ENTRY(acmeSoC_cpu_suspend)
> stmfd sp!, {lr}
> adr r3, soc_finish_suspend
> bl cpu_suspend
> ldmfd sp!, {pc}
> ENDPROC(acmeSoC_cpu_suspend)
>
> soc_finish_suspend:
> blah
> blah
> put soc to sleep
> never return
>
> or even:
>
> static void soc_suspend(void)
> {
> [soc specific preparation]
>
> cpu_suspend(0, PLAT_PHYS_OFFSET - PAGE_OFFSET,
Please let's try not to use PLAT_PHYS_OFFSET if it can be avoided,
especially when the plain PHYS_OFFSET would do just as well. I'm
currently trying to get rid of all instances of PLAT_PHYS_OFFSET from
the kernel in order to eventually support multiple SOCs in a single
kernel image.
Nicolas
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths
2011-06-13 17:15 ` [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths Russell King - ARM Linux
@ 2011-06-13 19:29 ` Nicolas Pitre
2011-06-13 20:01 ` Russell King - ARM Linux
0 siblings, 1 reply; 20+ messages in thread
From: Nicolas Pitre @ 2011-06-13 19:29 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, 13 Jun 2011, Russell King - ARM Linux wrote:
> Very little code is different between these two paths now, so extract
> the common code.
What about simply always using the MULTI_CPU path unconditionally here?
The struct processor pointer could be made available in all cases, and
non critical paths could choose to always use it to simplify the code.
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> arch/arm/kernel/sleep.S | 24 ++++++------------------
> 1 files changed, 6 insertions(+), 18 deletions(-)
>
> diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
> index f8e9251..0a778c3 100644
> --- a/arch/arm/kernel/sleep.S
> +++ b/arch/arm/kernel/sleep.S
> @@ -19,29 +19,13 @@ ENTRY(cpu_suspend)
> mov r9, lr
> #ifdef MULTI_CPU
> ldr r10, =processor
> - mov r2, sp @ current virtual SP
> ldr r0, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
> ldr ip, [r10, #CPU_DO_RESUME] @ virtual resume function
> - sub sp, sp, r0 @ allocate CPU state on stack
> - mov r0, sp @ save pointer
> - add ip, ip, r1 @ convert resume fn to phys
> - stmfd sp!, {r1, r2, ip} @ save v:p, virt SP, phys resume fn
> - ldr r3, =sleep_save_sp
> - add r2, sp, r1 @ convert SP to phys
> -#ifdef CONFIG_SMP
> - ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
> - ALT_UP(mov lr, #0)
> - and lr, lr, #15
> - str r2, [r3, lr, lsl #2] @ save phys SP
> #else
> - str r2, [r3] @ save phys SP
> -#endif
> - mov lr, pc
> - ldr pc, [r10, #CPU_DO_SUSPEND] @ save CPU state
> -#else
> - mov r2, sp @ current virtual SP
> ldr r0, =cpu_suspend_size
> ldr ip, =cpu_do_resume
> +#endif
> + mov r2, sp @ current virtual SP
> sub sp, sp, r0 @ allocate CPU state on stack
> mov r0, sp @ save pointer
> add ip, ip, r1 @ convert resume fn to phys
> @@ -56,6 +40,10 @@ ENTRY(cpu_suspend)
> #else
> str r2, [r3] @ save phys SP
> #endif
> +#ifdef MULTI_CPU
> + mov lr, pc
> + ldr pc, [r10, #CPU_DO_SUSPEND] @ save CPU state
> +#else
> bl cpu_do_suspend
> #endif
>
> --
> 1.7.4.4
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths
2011-06-13 19:29 ` Nicolas Pitre
@ 2011-06-13 20:01 ` Russell King - ARM Linux
0 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-13 20:01 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 13, 2011 at 03:29:02PM -0400, Nicolas Pitre wrote:
> On Mon, 13 Jun 2011, Russell King - ARM Linux wrote:
>
> > Very little code is different between these two paths now, so extract
> > the common code.
>
> What about simply always using the MULTI_CPU path unconditionally here?
> The struct processor pointer could be made available in all cases, and
> non critical paths could choose to always use it to simplify the code.
For the ifdef sections I don't think its worth it.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention
2011-06-13 17:16 ` [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention Russell King - ARM Linux
@ 2011-06-17 2:54 ` Rob Herring
2011-06-17 7:21 ` Russell King - ARM Linux
0 siblings, 1 reply; 20+ messages in thread
From: Rob Herring @ 2011-06-17 2:54 UTC (permalink / raw)
To: linux-arm-kernel
Russell,
On 06/13/2011 12:16 PM, Russell King - ARM Linux wrote:
> Save the suspend function pointer onto the stack for use when returning.
> Allocate r2 to pass an argument to the suspend function.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> arch/arm/kernel/sleep.S | 9 +++++----
> 1 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
> index 358be13..b924bcc 100644
> --- a/arch/arm/kernel/sleep.S
> +++ b/arch/arm/kernel/sleep.S
> @@ -10,6 +10,7 @@
> /*
> * Save CPU state for a suspend
> * r1 = v:p offset
> + * r2 = suspend function arg0
> * r3 = virtual return function
> * Note: sp is decremented to allocate space for CPU state on stack
> * r0-r3,ip,lr corrupted
> @@ -17,7 +18,6 @@
> ENTRY(cpu_suspend)
> stmfd sp!, {r3}
> stmfd sp!, {r4 - r11}
> - mov r9, lr
> #ifdef MULTI_CPU
> ldr r10, =processor
> ldr r5, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
> @@ -33,6 +33,7 @@ ENTRY(cpu_suspend)
> stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn
> ldr r5, =sleep_save_sp
> add r6, sp, r1 @ convert SP to phys
> + stmfd sp!, {r2, lr} @ save suspend func arg and pointer
> #ifdef CONFIG_SMP
> ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
> ALT_UP(mov lr, #0)
> @@ -51,12 +52,12 @@ ENTRY(cpu_suspend)
> @ flush data cache
> #ifdef MULTI_CACHE
> ldr r10, =cpu_cache
> - mov lr, r9
> + mov lr, pc
> ldr pc, [r10, #CACHE_FLUSH_KERN_ALL]
> #else
> - mov lr, r9
> - b __cpuc_flush_kern_all
> + bl __cpuc_flush_kern_all
> #endif
If you change:
> + ldmfd sp!, {r0, pc} @ call suspend fn
To:
mov lr, pc
ldmfd sp!, {r0, pc}
ldmfd sp!, {r1, r6, ip}
mov sp, r6
ldmfd sp!, {r4-r11, pc}
It will allow the suspend fn to return and abort suspend. With that, I'm
able to use this for core powerdown in cpuidle.
Rob
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention
2011-06-17 2:54 ` Rob Herring
@ 2011-06-17 7:21 ` Russell King - ARM Linux
0 siblings, 0 replies; 20+ messages in thread
From: Russell King - ARM Linux @ 2011-06-17 7:21 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Jun 16, 2011 at 09:54:48PM -0500, Rob Herring wrote:
> If you change:
>
> > + ldmfd sp!, {r0, pc} @ call suspend fn
>
> To:
> mov lr, pc
> ldmfd sp!, {r0, pc}
> ldmfd sp!, {r1, r6, ip}
> mov sp, r6
> ldmfd sp!, {r4-r11, pc}
>
> It will allow the suspend fn to return and abort suspend. With that, I'm
> able to use this for core powerdown in cpuidle.
Did you see my last message in the "[RFC PATCH v5] ARM hibernation /
suspend-to-disk (fwd)" thread?
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2011-06-17 7:21 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-13 17:14 [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 01/14] ARM: suspend: make MULTI_CPU and !MULTI_CPU resume paths the same Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 02/14] ARM: suspend: move return address (for cpu_resume) to top of stack Russell King - ARM Linux
2011-06-13 17:15 ` [PATCH 03/14] ARM: suspend: extract common code from MULTI_CPU/!MULTI_CPU paths Russell King - ARM Linux
2011-06-13 19:29 ` Nicolas Pitre
2011-06-13 20:01 ` Russell King - ARM Linux
2011-06-13 17:16 ` [PATCH 04/14] ARM: suspend: preserve r4 - r11 across a suspend Russell King - ARM Linux
2011-06-13 17:16 ` [PATCH 05/14] ARM: suspend: reallocate registers to avoid r2, r3 Russell King - ARM Linux
2011-06-13 17:16 ` [PATCH 06/14] ARM: suspend: rejig suspend follow-on function calling convention Russell King - ARM Linux
2011-06-17 2:54 ` Rob Herring
2011-06-17 7:21 ` Russell King - ARM Linux
2011-06-13 17:17 ` [PATCH 07/14] ARM: suspend: move sa1100 to use proper suspend func arg0 Russell King - ARM Linux
2011-06-13 17:17 ` [PATCH 08/14] ARM: suspend: convert cpu_suspend() to a normal function Russell King - ARM Linux
2011-06-13 17:17 ` [PATCH 09/14] ARM: suspend: plat-s3c24xx: cleanup s3c_cpu_save Russell King - ARM Linux
2011-06-13 17:18 ` [PATCH 10/14] ARM: suspend: sa1100: cleanup sa1100_cpu_suspend Russell King - ARM Linux
2011-06-13 17:18 ` [PATCH 11/14] ARM: suspend: mach-s5pv210: cleanup s3c_cpu_save Russell King - ARM Linux
2011-06-13 17:18 ` [PATCH 12/14] ARM: suspend: mach-exynos4: " Russell King - ARM Linux
2011-06-13 17:19 ` [PATCH 13/14] ARM: suspend: mach-s3c64xx: " Russell King - ARM Linux
2011-06-13 17:19 ` [PATCH 14/14] ARM: suspend: pxa: cleanup PXA suspend code Russell King - ARM Linux
2011-06-13 19:16 ` [PATCH 00/14] Re-jig cpu_suspend for a saner calling convention Nicolas Pitre
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).