[U-Boot,v4,12/16] common: env_embedded: allow fine placement of environment object
diff mbox series

Message ID ae6a0c7be8e730b3fe933ce859d97e99f2ae2b08.1521215903.git.christophe.leroy@c-s.fr
State Accepted
Delegated to: Tom Rini
Headers show
Series
  • Powerpc: mpc8xx: cleanup before migration to DM model
Related show

Commit Message

Christophe Leroy March 16, 2018, 4:20 p.m. UTC
Commit 7653942b10e9e ("common/env_embedded.c: drop support for
CONFIG_SYS_USE_PPCENV") dropped the .ppcenv section which was
used in linking scripts to allow fine placement of embedded
environment sections.

This implies that GCC randomly places objects from env/embedded.o
and environment is not guaranteed to be located at the correct address:

04003df8 g     F .text  00000038 mii_init
04004000 g     O .text  00000004 env_size
04004004 g     O .text  00002000 environment
04006004 g     F .text  00000040 .hidden __lshrdi3

This patch restores this capability by allocating each object marked
with __UBOOT_ENV_SECTION__ into a different section. Hence
'environment' will be alone in .text.environment, allowing a
fine placement in u-boot.lds with:

		. = DEFINED(env_offset) ? env_offset : .;
		env/embedded.o			(.text.environment)

Fixes: 7653942b10e9e ("common/env_embedded.c: drop support for CONFIG_SYS_USE_PPCENV")
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
 env/embedded.c        | 8 ++++----
 include/env_default.h | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

Comments

Tom Rini April 6, 2018, 9:03 p.m. UTC | #1
On Fri, Mar 16, 2018 at 05:20:53PM +0100, Christophe Leroy wrote:

> Commit 7653942b10e9e ("common/env_embedded.c: drop support for
> CONFIG_SYS_USE_PPCENV") dropped the .ppcenv section which was
> used in linking scripts to allow fine placement of embedded
> environment sections.
> 
> This implies that GCC randomly places objects from env/embedded.o
> and environment is not guaranteed to be located at the correct address:
> 
> 04003df8 g     F .text  00000038 mii_init
> 04004000 g     O .text  00000004 env_size
> 04004004 g     O .text  00002000 environment
> 04006004 g     F .text  00000040 .hidden __lshrdi3
> 
> This patch restores this capability by allocating each object marked
> with __UBOOT_ENV_SECTION__ into a different section. Hence
> 'environment' will be alone in .text.environment, allowing a
> fine placement in u-boot.lds with:
> 
> 		. = DEFINED(env_offset) ? env_offset : .;
> 		env/embedded.o			(.text.environment)
> 
> Fixes: 7653942b10e9e ("common/env_embedded.c: drop support for CONFIG_SYS_USE_PPCENV")
> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>

Applied to u-boot/master, thanks!

Patch
diff mbox series

diff --git a/env/embedded.c b/env/embedded.c
index 43694db70fe..9b0a6a3c3da 100644
--- a/env/embedded.c
+++ b/env/embedded.c
@@ -35,11 +35,11 @@ 
  * a seperate section.
  */
 #if defined(USE_HOSTCC) /* Native for 'tools/envcrc' */
-#  define __UBOOT_ENV_SECTION__	/*XXX DO_NOT_DEL_THIS_COMMENT*/
+#  define __UBOOT_ENV_SECTION__(name)	/*XXX DO_NOT_DEL_THIS_COMMENT*/
 
 #else /* Environment is embedded in U-Boot's .text section */
 /* XXX - This only works with GNU C */
-#  define __UBOOT_ENV_SECTION__	__attribute__ ((section(".text")))
+#  define __UBOOT_ENV_SECTION__(name)	__attribute__ ((section(".text."#name)))
 #endif
 
 /*
@@ -70,7 +70,7 @@ 
 #include <env_default.h>
 
 #ifdef CONFIG_ENV_ADDR_REDUND
-env_t redundand_environment __UBOOT_ENV_SECTION__ = {
+env_t redundand_environment __UBOOT_ENV_SECTION__(redundand_environment) = {
 	0,		/* CRC Sum: invalid */
 	0,		/* Flags:   invalid */
 	{
@@ -87,7 +87,7 @@  env_t redundand_environment __UBOOT_ENV_SECTION__ = {
  * .data/.sdata section.
  *
  */
-unsigned long env_size __UBOOT_ENV_SECTION__ = sizeof(env_t);
+unsigned long env_size __UBOOT_ENV_SECTION__(env_size) = sizeof(env_t);
 
 /*
  * Add in absolutes.
diff --git a/include/env_default.h b/include/env_default.h
index b574345af25..dd741315ba4 100644
--- a/include/env_default.h
+++ b/include/env_default.h
@@ -11,7 +11,7 @@ 
 #include <env_callback.h>
 
 #ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
-env_t environment __UBOOT_ENV_SECTION__ = {
+env_t environment __UBOOT_ENV_SECTION__(environment) = {
 	ENV_CRC,	/* CRC Sum */
 #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 	1,		/* Flags: valid */