diff mbox

[U-Boot,v2] SPL: tiny-printf: avoid any BSS usage

Message ID 1467987515-2794-1-git-send-email-andre.przywara@arm.com
State Accepted
Commit 59d07ee08e858bf2c121d0cdc6c8ddd3b26ee5b1
Delegated to: Tom Rini
Headers show

Commit Message

Andre Przywara July 8, 2016, 2:18 p.m. UTC
As printf calls may be executed quite early, we should avoid using any
BSS stored variables, since some boards put BSS in DRAM, which may not
have been initialised yet.
Explicitly mark those "static global" variables as belonging to the
.data section, to keep tiny-printf clear of any BSS usage.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
Changes v1 .. v2:
- remove NO_BSS macro, use __attribute__ ... directly instead

 lib/tiny-printf.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

Comments

Tom Rini July 8, 2016, 4:50 p.m. UTC | #1
On Fri, Jul 08, 2016 at 03:18:35PM +0100, Andre Przywara wrote:

> As printf calls may be executed quite early, we should avoid using any
> BSS stored variables, since some boards put BSS in DRAM, which may not
> have been initialised yet.
> Explicitly mark those "static global" variables as belonging to the
> .data section, to keep tiny-printf clear of any BSS usage.
> 
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>

Applied to u-boot/master, thanks!
Marek Vasut July 8, 2016, 9:48 p.m. UTC | #2
On 07/08/2016 06:50 PM, Tom Rini wrote:
> On Fri, Jul 08, 2016 at 03:18:35PM +0100, Andre Przywara wrote:
>
>> As printf calls may be executed quite early, we should avoid using any
>> BSS stored variables, since some boards put BSS in DRAM, which may not
>> have been initialised yet.
>> Explicitly mark those "static global" variables as belonging to the
>> .data section, to keep tiny-printf clear of any BSS usage.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>
> Applied to u-boot/master, thanks!
>
Mind you, __section(".data") would be enough, no need to spell the whole 
attribute.
Tom Rini July 9, 2016, 12:28 a.m. UTC | #3
On Fri, Jul 08, 2016 at 11:48:12PM +0200, Marek Vasut wrote:
> On 07/08/2016 06:50 PM, Tom Rini wrote:
> >On Fri, Jul 08, 2016 at 03:18:35PM +0100, Andre Przywara wrote:
> >
> >>As printf calls may be executed quite early, we should avoid using any
> >>BSS stored variables, since some boards put BSS in DRAM, which may not
> >>have been initialised yet.
> >>Explicitly mark those "static global" variables as belonging to the
> >>.data section, to keep tiny-printf clear of any BSS usage.
> >>
> >>Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> >
> >Applied to u-boot/master, thanks!
> >
> Mind you, __section(".data") would be enough, no need to spell the
> whole attribute.

True, but that's a helper that's not really utilized today.
Marek Vasut July 9, 2016, 8:22 a.m. UTC | #4
On 07/09/2016 02:28 AM, Tom Rini wrote:
> On Fri, Jul 08, 2016 at 11:48:12PM +0200, Marek Vasut wrote:
>> On 07/08/2016 06:50 PM, Tom Rini wrote:
>>> On Fri, Jul 08, 2016 at 03:18:35PM +0100, Andre Przywara wrote:
>>>
>>>> As printf calls may be executed quite early, we should avoid using any
>>>> BSS stored variables, since some boards put BSS in DRAM, which may not
>>>> have been initialised yet.
>>>> Explicitly mark those "static global" variables as belonging to the
>>>> .data section, to keep tiny-printf clear of any BSS usage.
>>>>
>>>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>>>
>>> Applied to u-boot/master, thanks!
>>>
>> Mind you, __section(".data") would be enough, no need to spell the
>> whole attribute.
>
> True, but that's a helper that's not really utilized today.
>
That's something that should likely be changed, as it allows to 
seamlessly deal with compiler quirks (if some were to ever pop up in 
this area).
Simon Glass July 9, 2016, 2:38 p.m. UTC | #5
On 8 July 2016 at 08:18, Andre Przywara <andre.przywara@arm.com> wrote:
> As printf calls may be executed quite early, we should avoid using any
> BSS stored variables, since some boards put BSS in DRAM, which may not
> have been initialised yet.
> Explicitly mark those "static global" variables as belonging to the
> .data section, to keep tiny-printf clear of any BSS usage.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>

Reviewed-by: Simon Glass <sjg@chromium.org>

Another approach would be to put these vars in a struct, declare it as
a local variable and pass it around. But this works OK too.

> ---
> Changes v1 .. v2:
> - remove NO_BSS macro, use __attribute__ ... directly instead
>
>  lib/tiny-printf.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
> index 451f4f7..b334f05 100644
> --- a/lib/tiny-printf.c
> +++ b/lib/tiny-printf.c
> @@ -13,11 +13,16 @@
>  #include <stdarg.h>
>  #include <serial.h>
>
> -static char *bf;
> -static char zs;
> +/*
> + * This code in here may execute before the DRAM is initialised, so
> + * we should make sure that it doesn't touch BSS, which some boards
> + * put in DRAM.
> + */
> +static char *bf __attribute__ ((section(".data")));
> +static char zs __attribute__ ((section(".data")));
>
>  /* Current position in sprintf() output string */
> -static char *outstr;
> +static char *outstr __attribute__ ((section(".data")));
>
>  static void out(char c)
>  {
> --
> 2.8.2
>
Tom Rini July 9, 2016, 2:50 p.m. UTC | #6
On Sat, Jul 09, 2016 at 10:22:37AM +0200, Marek Vasut wrote:
> On 07/09/2016 02:28 AM, Tom Rini wrote:
> >On Fri, Jul 08, 2016 at 11:48:12PM +0200, Marek Vasut wrote:
> >>On 07/08/2016 06:50 PM, Tom Rini wrote:
> >>>On Fri, Jul 08, 2016 at 03:18:35PM +0100, Andre Przywara wrote:
> >>>
> >>>>As printf calls may be executed quite early, we should avoid using any
> >>>>BSS stored variables, since some boards put BSS in DRAM, which may not
> >>>>have been initialised yet.
> >>>>Explicitly mark those "static global" variables as belonging to the
> >>>>.data section, to keep tiny-printf clear of any BSS usage.
> >>>>
> >>>>Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> >>>
> >>>Applied to u-boot/master, thanks!
> >>>
> >>Mind you, __section(".data") would be enough, no need to spell the
> >>whole attribute.
> >
> >True, but that's a helper that's not really utilized today.
> >
> That's something that should likely be changed, as it allows to
> seamlessly deal with compiler quirks (if some were to ever pop up in
> this area).

Patches welcome for the next release ;)
Marek Vasut July 9, 2016, 3:16 p.m. UTC | #7
On 07/09/2016 04:38 PM, Simon Glass wrote:
> On 8 July 2016 at 08:18, Andre Przywara <andre.przywara@arm.com> wrote:
>> As printf calls may be executed quite early, we should avoid using any
>> BSS stored variables, since some boards put BSS in DRAM, which may not
>> have been initialised yet.
>> Explicitly mark those "static global" variables as belonging to the
>> .data section, to keep tiny-printf clear of any BSS usage.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> Another approach would be to put these vars in a struct, declare it as
> a local variable and pass it around. But this works OK too.

This might in fact be even better.

>> ---
>> Changes v1 .. v2:
>> - remove NO_BSS macro, use __attribute__ ... directly instead
>>
>>  lib/tiny-printf.c | 11 ++++++++---
>>  1 file changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
>> index 451f4f7..b334f05 100644
>> --- a/lib/tiny-printf.c
>> +++ b/lib/tiny-printf.c
>> @@ -13,11 +13,16 @@
>>  #include <stdarg.h>
>>  #include <serial.h>
>>
>> -static char *bf;
>> -static char zs;
>> +/*
>> + * This code in here may execute before the DRAM is initialised, so
>> + * we should make sure that it doesn't touch BSS, which some boards
>> + * put in DRAM.
>> + */
>> +static char *bf __attribute__ ((section(".data")));
>> +static char zs __attribute__ ((section(".data")));
>>
>>  /* Current position in sprintf() output string */
>> -static char *outstr;
>> +static char *outstr __attribute__ ((section(".data")));
>>
>>  static void out(char c)
>>  {
>> --
>> 2.8.2
>>
Andre Przywara July 9, 2016, 5:27 p.m. UTC | #8
On 09/07/16 15:38, Simon Glass wrote:
> On 8 July 2016 at 08:18, Andre Przywara <andre.przywara@arm.com> wrote:
>> As printf calls may be executed quite early, we should avoid using any
>> BSS stored variables, since some boards put BSS in DRAM, which may not
>> have been initialised yet.
>> Explicitly mark those "static global" variables as belonging to the
>> .data section, to keep tiny-printf clear of any BSS usage.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>
> 
> Another approach would be to put these vars in a struct, declare it as
> a local variable and pass it around. But this works OK too.

Yeah, I was thinking about this too. Actually fixing the issue that we
need global variables in the first place.
But a quick look revealed that this is not trivial, so I reverted to
this simpler approach for the quick fix. Also I am not sure this will
eventually work against this "tiny" idea, we will see.

To be honest I think the real proper fix(TM) would be to provide a
separate BSS section for any code that runs _before_ DRAM init. This
should be a few bytes only and could easily live in SRAM.
If the loading part of the SPL requires a bigger BSS, that's fine as it
could still live in DRAM.
I might bake a patch when I get bored ...

Cheers,
Andre.


> 
>> ---
>> Changes v1 .. v2:
>> - remove NO_BSS macro, use __attribute__ ... directly instead
>>
>>  lib/tiny-printf.c | 11 ++++++++---
>>  1 file changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
>> index 451f4f7..b334f05 100644
>> --- a/lib/tiny-printf.c
>> +++ b/lib/tiny-printf.c
>> @@ -13,11 +13,16 @@
>>  #include <stdarg.h>
>>  #include <serial.h>
>>
>> -static char *bf;
>> -static char zs;
>> +/*
>> + * This code in here may execute before the DRAM is initialised, so
>> + * we should make sure that it doesn't touch BSS, which some boards
>> + * put in DRAM.
>> + */
>> +static char *bf __attribute__ ((section(".data")));
>> +static char zs __attribute__ ((section(".data")));
>>
>>  /* Current position in sprintf() output string */
>> -static char *outstr;
>> +static char *outstr __attribute__ ((section(".data")));
>>
>>  static void out(char c)
>>  {
>> --
>> 2.8.2
>>
>
Simon Glass Aug. 6, 2016, 12:11 a.m. UTC | #9
Hi,

On 9 July 2016 at 11:27, André Przywara <andre.przywara@arm.com> wrote:
> On 09/07/16 15:38, Simon Glass wrote:
>> On 8 July 2016 at 08:18, Andre Przywara <andre.przywara@arm.com> wrote:
>>> As printf calls may be executed quite early, we should avoid using any
>>> BSS stored variables, since some boards put BSS in DRAM, which may not
>>> have been initialised yet.
>>> Explicitly mark those "static global" variables as belonging to the
>>> .data section, to keep tiny-printf clear of any BSS usage.
>>>
>>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>
>> Another approach would be to put these vars in a struct, declare it as
>> a local variable and pass it around. But this works OK too.
>
> Yeah, I was thinking about this too. Actually fixing the issue that we
> need global variables in the first place.
> But a quick look revealed that this is not trivial, so I reverted to
> this simpler approach for the quick fix. Also I am not sure this will
> eventually work against this "tiny" idea, we will see.
>
> To be honest I think the real proper fix(TM) would be to provide a
> separate BSS section for any code that runs _before_ DRAM init. This
> should be a few bytes only and could easily live in SRAM.
> If the loading part of the SPL requires a bigger BSS, that's fine as it
> could still live in DRAM.
> I might bake a patch when I get bored ...

For reference I sent a patch to remove use of the data section:

http://patchwork.ozlabs.org/patch/656024/

>
> Cheers,
> Andre.

Regards,
Simon
diff mbox

Patch

diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 451f4f7..b334f05 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -13,11 +13,16 @@ 
 #include <stdarg.h>
 #include <serial.h>
 
-static char *bf;
-static char zs;
+/*
+ * This code in here may execute before the DRAM is initialised, so
+ * we should make sure that it doesn't touch BSS, which some boards
+ * put in DRAM.
+ */
+static char *bf __attribute__ ((section(".data")));
+static char zs __attribute__ ((section(".data")));
 
 /* Current position in sprintf() output string */
-static char *outstr;
+static char *outstr __attribute__ ((section(".data")));
 
 static void out(char c)
 {