diff mbox

[U-Boot] arm: psci: save and restore registers from r4 to r12

Message ID 1475924927-6682-1-git-send-email-chenhui.zhao@nxp.com
State Deferred
Delegated to: Tom Rini
Headers show

Commit Message

Chenhui Zhao Oct. 8, 2016, 11:08 a.m. UTC
Save and restore core registers from r4 to r12 so that PSCI code won't
break their value.

Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
Signed-off-by: Alison Wang <alison.wang@nxp.com>
Signed-off-by: Abhimanyu Saini <abhimanyu.saini@nxp.com>
---
 arch/arm/cpu/armv7/psci.S | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Chen-Yu Tsai Oct. 13, 2016, 9:52 a.m. UTC | #1
On Sat, Oct 8, 2016 at 7:08 PM, Chenhui Zhao <chenhui.zhao@nxp.com> wrote:
> Save and restore core registers from r4 to r12 so that PSCI code won't
> break their value.
>
> Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
> Signed-off-by: Alison Wang <alison.wang@nxp.com>
> Signed-off-by: Abhimanyu Saini <abhimanyu.saini@nxp.com>
> ---
>  arch/arm/cpu/armv7/psci.S | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S
> index 6a36208..746297c 100644
> --- a/arch/arm/cpu/armv7/psci.S
> +++ b/arch/arm/cpu/armv7/psci.S
> @@ -152,7 +152,7 @@ _psci_table:
>         .word   0
>
>  _smc_psci:
> -       push    {r4-r7,lr}
> +       push    {r4-r12,lr}

This change is not needed. This function only uses r4-r7.
Any subroutines called should save variable registers (r4-r12)
themselves, per the ARM calling conventions.

ChenYu

>
>         @ Switch to secure
>         mrc     p15, 0, r7, c1, c1, 0
> @@ -175,7 +175,7 @@ _smc_psci:
>         @ Switch back to non-secure
>  2:     mcr     p15, 0, r7, c1, c1, 0
>
> -       pop     {r4-r7, lr}
> +       pop     {r4-r12, lr}
>         movs    pc, lr                  @ Return to the kernel
>
>  @ Requires dense and single-cluster CPU ID space
> --
> 1.9.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Chenhui Zhao Oct. 13, 2016, 10:37 a.m. UTC | #2

Chenhui Zhao Oct. 14, 2016, 12:14 a.m. UTC | #3
On Thu, Oct 13, 2016 at 5:52 PM, Chen-Yu Tsai <wens@csie.org> wrote:
> On Sat, Oct 8, 2016 at 7:08 PM, Chenhui Zhao <chenhui.zhao@nxp.com> wrote:
>> Save and restore core registers from r4 to r12 so that PSCI code won't
>> break their value.
>>
>> Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
>> Signed-off-by: Alison Wang <alison.wang@nxp.com>
>> Signed-off-by: Abhimanyu Saini <abhimanyu.saini@nxp.com>
>> ---
>>  arch/arm/cpu/armv7/psci.S | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S
>> index 6a36208..746297c 100644
>> --- a/arch/arm/cpu/armv7/psci.S
>> +++ b/arch/arm/cpu/armv7/psci.S
>> @@ -152,7 +152,7 @@ _psci_table:
>>         .word   0
>>
>>  _smc_psci:
>> -       push    {r4-r7,lr}
>> +       push    {r4-r12,lr}
>
> This change is not needed. This function only uses r4-r7.
> Any subroutines called should save variable registers (r4-r12)
> themselves, per the ARM calling conventions.
>
> ChenYu
>

I do not think it is a normal calling, instead it is an exception
handler. In the exception context,
it is necessary to save/restore all registers.

Sorry, my mail server has something wrong.

Chenhui

>>
>>         @ Switch to secure
>>         mrc     p15, 0, r7, c1, c1, 0
>> @@ -175,7 +175,7 @@ _smc_psci:
>>         @ Switch back to non-secure
>>  2:     mcr     p15, 0, r7, c1, c1, 0
>>
>> -       pop     {r4-r7, lr}
>> +       pop     {r4-r12, lr}
>>         movs    pc, lr                  @ Return to the kernel
>>
>>  @ Requires dense and single-cluster CPU ID space
>> --
>> 1.9.1
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
Chen-Yu Tsai Oct. 17, 2016, 4:46 p.m. UTC | #4
On Fri, Oct 14, 2016 at 8:14 AM, Chenhui Zhao <z.chenhui@gmail.com> wrote:
> On Thu, Oct 13, 2016 at 5:52 PM, Chen-Yu Tsai <wens@csie.org> wrote:
>> On Sat, Oct 8, 2016 at 7:08 PM, Chenhui Zhao <chenhui.zhao@nxp.com> wrote:
>>> Save and restore core registers from r4 to r12 so that PSCI code won't
>>> break their value.
>>>
>>> Signed-off-by: Chenhui Zhao <chenhui.zhao@nxp.com>
>>> Signed-off-by: Alison Wang <alison.wang@nxp.com>
>>> Signed-off-by: Abhimanyu Saini <abhimanyu.saini@nxp.com>
>>> ---
>>>  arch/arm/cpu/armv7/psci.S | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S
>>> index 6a36208..746297c 100644
>>> --- a/arch/arm/cpu/armv7/psci.S
>>> +++ b/arch/arm/cpu/armv7/psci.S
>>> @@ -152,7 +152,7 @@ _psci_table:
>>>         .word   0
>>>
>>>  _smc_psci:
>>> -       push    {r4-r7,lr}
>>> +       push    {r4-r12,lr}
>>
>> This change is not needed. This function only uses r4-r7.
>> Any subroutines called should save variable registers (r4-r12)
>> themselves, per the ARM calling conventions.
>>
>> ChenYu
>>
>
> I do not think it is a normal calling, instead it is an exception
> handler. In the exception context,
> it is necessary to save/restore all registers.

It should be the same for an exception handler. You only save the
registers that you clobber, at each function level.

ChenYu

>
> Sorry, my mail server has something wrong.
>
> Chenhui
>
>>>
>>>         @ Switch to secure
>>>         mrc     p15, 0, r7, c1, c1, 0
>>> @@ -175,7 +175,7 @@ _smc_psci:
>>>         @ Switch back to non-secure
>>>  2:     mcr     p15, 0, r7, c1, c1, 0
>>>
>>> -       pop     {r4-r7, lr}
>>> +       pop     {r4-r12, lr}
>>>         movs    pc, lr                  @ Return to the kernel
>>>
>>>  @ Requires dense and single-cluster CPU ID space
>>> --
>>> 1.9.1
>>>
>>> _______________________________________________
>>> U-Boot mailing list
>>> U-Boot@lists.denx.de
>>> http://lists.denx.de/mailman/listinfo/u-boot
diff mbox

Patch

diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S
index 6a36208..746297c 100644
--- a/arch/arm/cpu/armv7/psci.S
+++ b/arch/arm/cpu/armv7/psci.S
@@ -152,7 +152,7 @@  _psci_table:
 	.word	0
 
 _smc_psci:
-	push	{r4-r7,lr}
+	push	{r4-r12,lr}
 
 	@ Switch to secure
 	mrc	p15, 0, r7, c1, c1, 0
@@ -175,7 +175,7 @@  _smc_psci:
 	@ Switch back to non-secure
 2:	mcr	p15, 0, r7, c1, c1, 0
 
-	pop	{r4-r7, lr}
+	pop	{r4-r12, lr}
 	movs	pc, lr			@ Return to the kernel
 
 @ Requires dense and single-cluster CPU ID space