Patchwork [2/2] PPC: fix hreset_vector for 60x, 7x0, 7x5, G2, MPC8xx, MPC5xx, 7400 and 7450

login
register
mail settings
Submitter Fabien Chouteau
Date March 29, 2013, 12:06 p.m.
Message ID <1364558788-4795-2-git-send-email-chouteau@adacore.com>
Download mbox | patch
Permalink /patch/232389/
State New
Headers show

Comments

Fabien Chouteau - March 29, 2013, 12:06 p.m.
According to the different user's manuals, the vector offset for system
reset (both /HRESET and /SRESET) is 0x00100.

This patch may break support of some executables, as the power-on start
address may change. For a specific board, if the power-on start address
is different than HRESET vector (i.e. 0x00000100 or 0xfff00100), this
should be fixed in board's initialization code.

Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
---
 target-ppc/translate_init.c |   22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)
Fabien Chouteau - April 2, 2013, 7:53 a.m.
On 04/02/2013 10:09 AM, Alexander Graf wrote:
> 
> On 29.03.2013, at 13:06, Fabien Chouteau wrote:
> 
>> According to the different user's manuals, the vector offset for system
>> reset (both /HRESET and /SRESET) is 0x00100.
>>
>> This patch may break support of some executables, as the power-on start
>> address may change. For a specific board, if the power-on start address
>> is different than HRESET vector (i.e. 0x00000100 or 0xfff00100), this
>> should be fixed in board's initialization code.
>>
>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
> 
> What about the other users of hreset_vector? Can we just remove the variable altogether?
>

For the CPUs that don't implement MSR[IP], the hreset_prefix is always
0x00000000, so hreset_vector will be the reset address (i.e. 0xFFFFFFFC)

I guess all this can be converted to a CPU feature flag, telling if
reset is an exception or not.
Alexander Graf - April 2, 2013, 8:09 a.m.
On 29.03.2013, at 13:06, Fabien Chouteau wrote:

> According to the different user's manuals, the vector offset for system
> reset (both /HRESET and /SRESET) is 0x00100.
> 
> This patch may break support of some executables, as the power-on start
> address may change. For a specific board, if the power-on start address
> is different than HRESET vector (i.e. 0x00000100 or 0xfff00100), this
> should be fixed in board's initialization code.
> 
> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>

What about the other users of hreset_vector? Can we just remove the variable altogether?


Alex

> ---
> target-ppc/translate_init.c |   22 +++++++++++-----------
> 1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> index ce5238b..2c9b477 100644
> --- a/target-ppc/translate_init.c
> +++ b/target-ppc/translate_init.c
> @@ -2645,7 +2645,7 @@ static void init_excp_MPC5xx (CPUPPCState *env)
>     env->ivor_mask = 0x0000FFF0UL;
>     env->ivpr_mask = 0xFFFF0000UL;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2676,7 +2676,7 @@ static void init_excp_MPC8xx (CPUPPCState *env)
>     env->ivor_mask = 0x0000FFF0UL;
>     env->ivpr_mask = 0xFFFF0000UL;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2701,7 +2701,7 @@ static void init_excp_G2 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
>     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2804,7 +2804,7 @@ static void init_excp_602 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
>     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2828,7 +2828,7 @@ static void init_excp_603 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
>     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2873,7 +2873,7 @@ static void init_excp_7x0 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
>     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2895,7 +2895,7 @@ static void init_excp_750cl (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
>     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2917,7 +2917,7 @@ static void init_excp_750cx (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
>     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2944,7 +2944,7 @@ static void init_excp_7x5 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
>     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2969,7 +2969,7 @@ static void init_excp_7400 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
>     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> @@ -2996,7 +2996,7 @@ static void init_excp_7450 (CPUPPCState *env)
>     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
>     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
>     /* Hardware reset vector */
> -    env->hreset_vector = 0xFFFFFFFCUL;
> +    env->hreset_vector = 0x00000100UL;
> #endif
> }
> 
> -- 
> 1.7.9.5
>
Fabien Chouteau - April 2, 2013, 8:10 a.m.
On 04/02/2013 10:56 AM, Alexander Graf wrote:
> 
> On 02.04.2013, at 09:53, Fabien Chouteau wrote:
> 
>> On 04/02/2013 10:09 AM, Alexander Graf wrote:
>>>
>>> What about the other users of hreset_vector? Can we just remove the variable altogether?
>>>
>>
>> For the CPUs that don't implement MSR[IP], the hreset_prefix is always
>> 0x00000000, so hreset_vector will be the reset address (i.e. 0xFFFFFFFC)
>>
>> I guess all this can be converted to a CPU feature flag, telling if
>> reset is an exception or not.
> 
> Hrm, maybe. Not sure which way is cleaner.
> 
> I'll apply your patch for now. It's certainly a step into the right direction.
>

OK, thanks,
Alexander Graf - April 2, 2013, 8:56 a.m.
On 02.04.2013, at 09:53, Fabien Chouteau wrote:

> On 04/02/2013 10:09 AM, Alexander Graf wrote:
>> 
>> On 29.03.2013, at 13:06, Fabien Chouteau wrote:
>> 
>>> According to the different user's manuals, the vector offset for system
>>> reset (both /HRESET and /SRESET) is 0x00100.
>>> 
>>> This patch may break support of some executables, as the power-on start
>>> address may change. For a specific board, if the power-on start address
>>> is different than HRESET vector (i.e. 0x00000100 or 0xfff00100), this
>>> should be fixed in board's initialization code.
>>> 
>>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>> 
>> What about the other users of hreset_vector? Can we just remove the variable altogether?
>> 
> 
> For the CPUs that don't implement MSR[IP], the hreset_prefix is always
> 0x00000000, so hreset_vector will be the reset address (i.e. 0xFFFFFFFC)
> 
> I guess all this can be converted to a CPU feature flag, telling if
> reset is an exception or not.

Hrm, maybe. Not sure which way is cleaner.

I'll apply your patch for now. It's certainly a step into the right direction.


Alex

Patch

diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index ce5238b..2c9b477 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -2645,7 +2645,7 @@  static void init_excp_MPC5xx (CPUPPCState *env)
     env->ivor_mask = 0x0000FFF0UL;
     env->ivpr_mask = 0xFFFF0000UL;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2676,7 +2676,7 @@  static void init_excp_MPC8xx (CPUPPCState *env)
     env->ivor_mask = 0x0000FFF0UL;
     env->ivpr_mask = 0xFFFF0000UL;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2701,7 +2701,7 @@  static void init_excp_G2 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2804,7 +2804,7 @@  static void init_excp_602 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2828,7 +2828,7 @@  static void init_excp_603 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2873,7 +2873,7 @@  static void init_excp_7x0 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2895,7 +2895,7 @@  static void init_excp_750cl (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2917,7 +2917,7 @@  static void init_excp_750cx (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2944,7 +2944,7 @@  static void init_excp_7x5 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2969,7 +2969,7 @@  static void init_excp_7400 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }
 
@@ -2996,7 +2996,7 @@  static void init_excp_7450 (CPUPPCState *env)
     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
     /* Hardware reset vector */
-    env->hreset_vector = 0xFFFFFFFCUL;
+    env->hreset_vector = 0x00000100UL;
 #endif
 }