* [U-Boot-Users] Why are some global vars part of the image, and some not?
@ 2006-11-03 21:58 Timur Tabi
2006-11-03 22:19 ` Timur Tabi
2006-11-03 23:44 ` Wolfgang Denk
0 siblings, 2 replies; 26+ messages in thread
From: Timur Tabi @ 2006-11-03 21:58 UTC (permalink / raw)
To: u-boot
I have the following code in one of my files:
#ifdef CFG_SPD_BUS_NUM
static volatile unsigned int i2c_bus_num = CFG_SPD_BUS_NUM;
#else
static volatile unsigned int i2c_bus_num = 0;
#endif
static volatile struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET),
#ifdef CFG_I2C2_OFFSET
(struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET)
#endif
};
As you can see, I defined two static volatile global vars: i2c_bus_num and
i2c_dev.
My U-Boot image is 0x294E0 bytes in size, and it's located at address
0xFE000000. When I run U-Boot, the address of i2c_bus_num is 0xfe02a114, and
the address of i2c_dev[] is 0xfe028124.
In other words, i2c_dev[] is part of the actual U-Boot image, but i2c_bus_num,
which is defined right next to it, isn't. This means that i2c_dev[] is
properly initialized, but i2c_bus_num is set to 0xFFFFFFFF (the value that
erased flash has).
How is this possible? How can two adjacent global variables be located is
completely different memory segments?
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-03 21:58 [U-Boot-Users] Why are some global vars part of the image, and some not? Timur Tabi
@ 2006-11-03 22:19 ` Timur Tabi
2006-11-03 23:47 ` Wolfgang Denk
2006-11-03 23:44 ` Wolfgang Denk
1 sibling, 1 reply; 26+ messages in thread
From: Timur Tabi @ 2006-11-03 22:19 UTC (permalink / raw)
To: u-boot
Timur Tabi wrote:
> #ifdef CFG_SPD_BUS_NUM
> static volatile unsigned int i2c_bus_num = CFG_SPD_BUS_NUM;
> #else
> static volatile unsigned int i2c_bus_num = 0;
> #endif
Ok, I fixed my problem by changing the above line to:
static volatile unsigned int i2c_bus_num __attribute__ ((section ("data"))) = 0;
Is "data" the right section to use? Here's my lds file:
OUTPUT_ARCH(powerpc)
SECTIONS
{
/* Read-only sections, merged into text segment: */
. = + SIZEOF_HEADERS;
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.rel.text : { *(.rel.text) }
.rela.text : { *(.rela.text) }
.rel.data : { *(.rel.data) }
.rela.data : { *(.rela.data) }
.rel.rodata : { *(.rel.rodata) }
.rela.rodata : { *(.rela.rodata) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.init : { *(.init) }
.plt : { *(.plt) }
.text :
{
cpu/mpc83xx/start.o (.text)
*(.text)
*(.fixup)
*(.got1)
. = ALIGN(16);
*(.rodata)
*(.rodata1)
*(.rodata.str1.4)
*(.eh_frame)
}
.fini : { *(.fini) } =0
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
_erotext = .;
PROVIDE (erotext = .);
.reloc :
{
*(.got)
_GOT2_TABLE_ = .;
*(.got2)
_FIXUP_TABLE_ = .;
*(.fixup)
}
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
__fixup_entries = (. - _FIXUP_TABLE_) >> 2;
.data :
{
*(.data)
*(.data1)
*(.sdata)
*(.sdata2)
*(.dynamic)
CONSTRUCTORS
}
_edata = .;
PROVIDE (edata = .);
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = .;
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;
. = ALIGN(4096);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(4096);
__init_end = .;
__bss_start = .;
.bss :
{
*(.sbss) *(.scommon)
*(.dynbss)
*(.bss)
*(COMMON)
}
_end = . ;
PROVIDE (end = .);
}
ENTRY(_start)
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-03 21:58 [U-Boot-Users] Why are some global vars part of the image, and some not? Timur Tabi
2006-11-03 22:19 ` Timur Tabi
@ 2006-11-03 23:44 ` Wolfgang Denk
2006-11-04 0:07 ` Timur Tabi
1 sibling, 1 reply; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-03 23:44 UTC (permalink / raw)
To: u-boot
Dear Timur,
in message <454BBB85.5040507@freescale.com> you wrote:
> I have the following code in one of my files:
>
> #ifdef CFG_SPD_BUS_NUM
> static volatile unsigned int i2c_bus_num = CFG_SPD_BUS_NUM;
> #else
> static volatile unsigned int i2c_bus_num = 0;
> #endif
>
> static volatile struct fsl_i2c *i2c_dev[2] = {
> (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET),
> #ifdef CFG_I2C2_OFFSET
> (struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET)
> #endif
> };
I'm not exactly sure what you mean by the "global vars" in the
Subject line. The declaration you show here says "static". This may
or may not be what you mean.
> As you can see, I defined two static volatile global vars: i2c_bus_num and
> i2c_dev.
Yes, and one of these is initialized with non-zero values (so it will
go to the data segment), while the other is not (so it will go to
bss).
> In other words, i2c_dev[] is part of the actual U-Boot image, but i2c_bus_num,
> which is defined right next to it, isn't. This means that i2c_dev[] is
> properly initialized, but i2c_bus_num is set to 0xFFFFFFFF (the value that
> erased flash has).
THis is perfectly OK. Just check the variables after U-Boot has been
relocated to RAM and BSS has been initialized.
> How is this possible? How can two adjacent global variables be located is
> completely different memory segments?
You need to understand the difference between data and bss segments,
or, between initialized and uninitialized (resp. initialized as zero)
data.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
In the bathtub of history the truth is harder to hold than the soap,
and much more difficult to find ... - Terry Pratchett, _Sourcery_
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-03 22:19 ` Timur Tabi
@ 2006-11-03 23:47 ` Wolfgang Denk
2006-11-04 0:09 ` Timur Tabi
0 siblings, 1 reply; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-03 23:47 UTC (permalink / raw)
To: u-boot
In message <454BC07C.4090704@freescale.com> you wrote:
>
> > #ifdef CFG_SPD_BUS_NUM
> > static volatile unsigned int i2c_bus_num = CFG_SPD_BUS_NUM;
> > #else
> > static volatile unsigned int i2c_bus_num = 0;
> > #endif
>
> Ok, I fixed my problem by changing the above line to:
I don't see any problem that needed fixing.
> static volatile unsigned int i2c_bus_num __attribute__ ((section ("data"))) = 0;
>
> Is "data" the right section to use? Here's my lds file:
If you have to ask this question, then the answer is no, and better
don't mess with things you don't understand.
What exactly is the "problem" you are experiencing? Did you read the
documentation, especially section "Initial Stack, Global Data" in the
README? Please let me know if there is anything in this text which is
not clear enough.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Behind every great man, there is a woman -- urging him on.
-- Harry Mudd, "I, Mudd", stardate 4513.3
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-03 23:44 ` Wolfgang Denk
@ 2006-11-04 0:07 ` Timur Tabi
2006-11-04 0:31 ` Wolfgang Denk
0 siblings, 1 reply; 26+ messages in thread
From: Timur Tabi @ 2006-11-04 0:07 UTC (permalink / raw)
To: u-boot
Wolfgang Denk wrote:
> I'm not exactly sure what you mean by the "global vars" in the
> Subject line. The declaration you show here says "static". This may
> or may not be what you mean.
To me, a variable defined outside of a function is a global variable,
regardless as to whether it's "static" or not. Technically, these variables
are static globals, but I don't think removing the "static" would change what
I'm seeing. Would it?
>> As you can see, I defined two static volatile global vars: i2c_bus_num and
>> i2c_dev.
>
> Yes, and one of these is initialized with non-zero values (so it will
> go to the data segment), while the other is not (so it will go to
> bss).
I realized that about two minutes after I posted my email, which is why I
posted a follow-up.
> THis is perfectly OK. Just check the variables after U-Boot has been
> relocated to RAM and BSS has been initialized.
I can't. This code is used to initialize the I2C bus, which is used to
initialize SPD on DDR, which is obviously done before U-Boot is relocated.
These variables contain the I2C bus number. On some boards, SPD is on bus 0,
on some they're on bus 1. So the compile-time initializer needs to be the
right bus.
(An alternative would be to change i2c_read() and i2c_write() to take a bus
number as a parameter, but that would change hundreds of files).
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-03 23:47 ` Wolfgang Denk
@ 2006-11-04 0:09 ` Timur Tabi
2006-11-04 0:33 ` Wolfgang Denk
0 siblings, 1 reply; 26+ messages in thread
From: Timur Tabi @ 2006-11-04 0:09 UTC (permalink / raw)
To: u-boot
Wolfgang Denk wrote:
> In message <454BC07C.4090704@freescale.com> you wrote:
>>> #ifdef CFG_SPD_BUS_NUM
>>> static volatile unsigned int i2c_bus_num = CFG_SPD_BUS_NUM;
>>> #else
>>> static volatile unsigned int i2c_bus_num = 0;
>>> #endif
>> Ok, I fixed my problem by changing the above line to:
>
> I don't see any problem that needed fixing.
The problem is that without specifying the section attribute, when I ran my
code, i2c_bus_num was equal to 0xFFFFFFFF.
>> static volatile unsigned int i2c_bus_num __attribute__ ((section ("data"))) = 0;
>>
>> Is "data" the right section to use? Here's my lds file:
>
> If you have to ask this question, then the answer is no, and better
> don't mess with things you don't understand.
>
> What exactly is the "problem" you are experiencing? Did you read the
> documentation, especially section "Initial Stack, Global Data" in the
> README? Please let me know if there is anything in this text which is
> not clear enough.
That section doesn't address issues with global (static or otherwise)
variables that need to be read prior to relocation.
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-04 0:07 ` Timur Tabi
@ 2006-11-04 0:31 ` Wolfgang Denk
2006-11-04 1:38 ` Timur Tabi
0 siblings, 1 reply; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-04 0:31 UTC (permalink / raw)
To: u-boot
In message <454BD9AB.1000303@freescale.com> you wrote:
>
> To me, a variable defined outside of a function is a global variable,
May I suggest we stick with ANSI C standard terminology instead of
private interpretations?
Since you complained about a problem where I could not see any (at
least none that was not clearly documented) I was not sure if your
expectation of "global" was correct, i. e. if you were aware of the
differences between "global" on file level versus "global" in the
meaning of "external" to the linker.
> > THis is perfectly OK. Just check the variables after U-Boot has been
> > relocated to RAM and BSS has been initialized.
>
> I can't. This code is used to initialize the I2C bus, which is used to
> initialize SPD on DDR, which is obviously done before U-Boot is relocated.
>
> These variables contain the I2C bus number. On some boards, SPD is on bus 0,
> on some they're on bus 1. So the compile-time initializer needs to be the
> right bus.
Then you must make sure that even zero-initialized data don't get
placed in bss, and your approach was correct.
[It would have been good if you had mentioned this in the opriginal
posting.]
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Pray: To ask that the laws of the universe be annulled in behalf of a
single petitioner confessedly unworthy. - Ambrose Bierce
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-04 0:09 ` Timur Tabi
@ 2006-11-04 0:33 ` Wolfgang Denk
0 siblings, 0 replies; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-04 0:33 UTC (permalink / raw)
To: u-boot
In message <454BDA40.5090806@freescale.com> you wrote:
>
> > I don't see any problem that needed fixing.
>
> The problem is that without specifying the section attribute, when I ran my
> code, i2c_bus_num was equal to 0xFFFFFFFF.
Yes, this to be expected. And explained in the README:
... and BSS is not initialized as zero.
> > What exactly is the "problem" you are experiencing? Did you read the
> > documentation, especially section "Initial Stack, Global Data" in the
> > README? Please let me know if there is anything in this text which is
> > not clear enough.
>
> That section doesn't address issues with global (static or otherwise)
> variables that need to be read prior to relocation.
Yes, it does:
This means that we don't have writable Data or BSS segments,
and BSS is not initialized as zero.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
An expert is a person who avoids the small errors while sweeping on
to the grand fallacy.
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-04 0:31 ` Wolfgang Denk
@ 2006-11-04 1:38 ` Timur Tabi
2006-11-04 2:04 ` Wolfgang Denk
0 siblings, 1 reply; 26+ messages in thread
From: Timur Tabi @ 2006-11-04 1:38 UTC (permalink / raw)
To: u-boot
Wolfgang Denk wrote:
> Since you complained about a problem where I could not see any (at
> least none that was not clearly documented) I was not sure if your
> expectation of "global" was correct, i. e. if you were aware of the
> differences between "global" on file level versus "global" in the
> meaning of "external" to the linker.
I was aware, I just didn't think it mattered for the issue that I was
seeing.
> Then you must make sure that even zero-initialized data don't get
> placed in bss, and your approach was correct.
What about modifying the linker script so that all of bss is merged into
the image, i.e. treat it like 'data'?
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-04 1:38 ` Timur Tabi
@ 2006-11-04 2:04 ` Wolfgang Denk
2006-11-06 17:43 ` Scott Wood
0 siblings, 1 reply; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-04 2:04 UTC (permalink / raw)
To: u-boot
In message <454BEF23.1020909@freescale.com> you wrote:
>
> What about modifying the linker script so that all of bss is merged into
> the image, i.e. treat it like 'data'?
That would mean that you have to allocate flash memory for all this
stuff, which is typically in the 100...150 kB range, i. e. you would
double the memory footprint of U-Boot in flash memory.,
No, this is NOT acceptable. Don't even think of it.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
I mean, I . . . think to understand you, I just don't know what you
are saying ... - Terry Pratchett, _Soul Music_
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-04 2:04 ` Wolfgang Denk
@ 2006-11-06 17:43 ` Scott Wood
2006-11-06 18:03 ` Jerry Van Baren
2006-11-06 20:26 ` Wolfgang Denk
0 siblings, 2 replies; 26+ messages in thread
From: Scott Wood @ 2006-11-06 17:43 UTC (permalink / raw)
To: u-boot
Wolfgang Denk wrote:
> In message <454BEF23.1020909@freescale.com> you wrote:
>
>>What about modifying the linker script so that all of bss is merged into
>>the image, i.e. treat it like 'data'?
>
>
> That would mean that you have to allocate flash memory for all this
> stuff, which is typically in the 100...150 kB range, i. e. you would
> double the memory footprint of U-Boot in flash memory.,
That seems rather ridiculously large... perhaps some of the larger
chunks of that could be dynamically allocated, rather than leaving a
giant welcome mat for bugs by executing C code before the BSS is cleared
(especially if, as it appears to be in this case, the compiler and/or
linker is putting things in the BSS even when explicitly initialized to
zero, rather than just left uninitialized)?
BTW, I'm only seeing about 19kB of BSS on an 8349EMDS build from the
current git head.
> No, this is NOT acceptable. Don't even think of it.
I don't think refusing to think about alternatives is conducive to good
software engineering.
-Scott
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 17:43 ` Scott Wood
@ 2006-11-06 18:03 ` Jerry Van Baren
2006-11-06 18:08 ` Timur Tabi
2006-11-06 20:26 ` Wolfgang Denk
1 sibling, 1 reply; 26+ messages in thread
From: Jerry Van Baren @ 2006-11-06 18:03 UTC (permalink / raw)
To: u-boot
Scott Wood wrote:
> Wolfgang Denk wrote:
>> In message <454BEF23.1020909@freescale.com> you wrote:
>>
>>> What about modifying the linker script so that all of bss is merged into
>>> the image, i.e. treat it like 'data'?
>>
>> That would mean that you have to allocate flash memory for all this
>> stuff, which is typically in the 100...150 kB range, i. e. you would
>> double the memory footprint of U-Boot in flash memory.,
>
> That seems rather ridiculously large... perhaps some of the larger
> chunks of that could be dynamically allocated, rather than leaving a
> giant welcome mat for bugs by executing C code before the BSS is cleared
> (especially if, as it appears to be in this case, the compiler and/or
> linker is putting things in the BSS even when explicitly initialized to
> zero, rather than just left uninitialized)?
>
> BTW, I'm only seeing about 19kB of BSS on an 8349EMDS build from the
> current git head.
>
>> No, this is NOT acceptable. Don't even think of it.
>
> I don't think refusing to think about alternatives is conducive to good
> software engineering.
>
> -Scott
You don't understand, u-boot _is_ what zeros bss so, until u-boot is
running enough to zero bss, bss will be random garbage. The stuff you
are doing is very early initialization - using I2C to read SPD, which is
before you even _have_ a normal bss because you don't even have your
SDRAM active at this point.
Welcome to the Wacky World of Embedded where you must do everything
yourself, and the world is populated with very sharp objects waiting to
nail you if you do anything wrong.
gvb
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 18:03 ` Jerry Van Baren
@ 2006-11-06 18:08 ` Timur Tabi
2006-11-06 18:48 ` Jerry Van Baren
2006-11-06 20:29 ` Wolfgang Denk
0 siblings, 2 replies; 26+ messages in thread
From: Timur Tabi @ 2006-11-06 18:08 UTC (permalink / raw)
To: u-boot
Jerry Van Baren wrote:
> You don't understand, u-boot _is_ what zeros bss so, until u-boot is
> running enough to zero bss, bss will be random garbage.
If BSS were merged into the DATA segment, then the compiler would be the one
that zeros BSS. Basically, BSS would go away, and all global variables
(static or otherwise) would be placed into DATA. They would be initialized to
zeros by the compiler, and when the image is burned into flash, that image
would have zeros in those memory locations.
This would also allow us to delete the BSS-initialization code in U-Boot.
I'm not advocating that we should implement this idea. I just wanted to
clarify things.
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 18:08 ` Timur Tabi
@ 2006-11-06 18:48 ` Jerry Van Baren
2006-11-06 18:56 ` Scott Wood
2006-11-06 20:29 ` Wolfgang Denk
1 sibling, 1 reply; 26+ messages in thread
From: Jerry Van Baren @ 2006-11-06 18:48 UTC (permalink / raw)
To: u-boot
Timur Tabi wrote:
> Jerry Van Baren wrote:
>
>> You don't understand, u-boot _is_ what zeros bss so, until u-boot is
>> running enough to zero bss, bss will be random garbage.
>
> If BSS were merged into the DATA segment, then the compiler would be the
> one that zeros BSS. Basically, BSS would go away, and all global
> variables (static or otherwise) would be placed into DATA. They would
> be initialized to zeros by the compiler, and when the image is burned
> into flash, that image would have zeros in those memory locations.
>
> This would also allow us to delete the BSS-initialization code in U-Boot.
>
> I'm not advocating that we should implement this idea. I just wanted to
> clarify things.
In theory, yes. In practice, I have my doubts that it is workable, let
alone a better way. Writing "then the compiler would be the one that
zeros BSS" is easy, actually making it work may be tricky. IMHO, there
are more profitable windmills to tilt. :-)
<http://en.wikipedia.org/wiki/Don_Quixote>
gvb
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 18:48 ` Jerry Van Baren
@ 2006-11-06 18:56 ` Scott Wood
2006-11-06 19:06 ` Jerry Van Baren
0 siblings, 1 reply; 26+ messages in thread
From: Scott Wood @ 2006-11-06 18:56 UTC (permalink / raw)
To: u-boot
Jerry Van Baren wrote:
> In theory, yes. In practice, I have my doubts that it is workable, let
> alone a better way. Writing "then the compiler would be the one that
> zeros BSS" is easy, actually making it work may be tricky.
It's a pretty simple linker script change, actually. Just move all of
the lines within .bss {} into .data {}. Where do you see the difficulty
coming from?
-Scott
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 18:56 ` Scott Wood
@ 2006-11-06 19:06 ` Jerry Van Baren
2006-11-06 19:46 ` Scott Wood
0 siblings, 1 reply; 26+ messages in thread
From: Jerry Van Baren @ 2006-11-06 19:06 UTC (permalink / raw)
To: u-boot
Scott Wood wrote:
> Jerry Van Baren wrote:
>> In theory, yes. In practice, I have my doubts that it is workable, let
>> alone a better way. Writing "then the compiler would be the one that
>> zeros BSS" is easy, actually making it work may be tricky.
>
> It's a pretty simple linker script change, actually. Just move all of
> the lines within .bss {} into .data {}. Where do you see the difficulty
> coming from?
>
> -Scott
Does the linker create proper zero initialization? If you initialize a
variable to zero, the compiler puts it in bss and does not initialize
it, secure in the knowledge that the runtime zeroes bss. If you
subsequently put it in the data section via the linker script, does it
get zeroed?
Does the bss/data end up in the right place? On start up your stack is
in cache or dual-port RAM until SDRAM is initialized. When does the
initialized portion of the data section get initialized and where?
Before it is in SDRAM or after SDRAM is initialized?
Simple enough things to experiment with, but it all takes time and the
benefit is questionable. Feel free to prove us curmudgeons wrong. ;-)
gvb
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 19:06 ` Jerry Van Baren
@ 2006-11-06 19:46 ` Scott Wood
2006-11-06 19:54 ` Timur Tabi
` (2 more replies)
0 siblings, 3 replies; 26+ messages in thread
From: Scott Wood @ 2006-11-06 19:46 UTC (permalink / raw)
To: u-boot
Jerry Van Baren wrote:
> Does the linker create proper zero initialization?
Yes.
> Does the bss/data end up in the right place?
It ends up where nonzero-initialized data currently is (i.e. in flash
before relocation, in RAM after).
> On start up your stack is
> in cache or dual-port RAM until SDRAM is initialized. When does the
> initialized portion of the data section get initialized and where?
> Before it is in SDRAM or after SDRAM is initialized?
I don't follow what, specifically, you mean by "initialized portion".
The data section contains data which is statically initiallized at
compile/link time; the only difference is that it would now include data
whose initial value is zero. Some pieces of data will be further
"initialized" at runtime by U-Boot code; this, of course, must happen
after SDRAM is initialized (and U-Boot has relocated to it), but that
has nothing to do with moving the BSS into the data segment.
The BSS is purely an optimization; besides increasing flash footprint
somewhat, removing it should not change anything except for code that
was already broken.
> Simple enough things to experiment with, but it all takes time and the
> benefit is questionable. Feel free to prove us curmudgeons wrong. ;-)
The main things that would take effort are changing all the board linker
scripts, and finding large BSS allocations and changing them to be
dynamically allocated so they don't take up space in flash.
The benefit is that bss-related bugs in the pre-RAM code go away and
stay away, and that ugliness such as having to specify __attribute__
((section ("data"))) whenever the value is zero also goes away.
-Scott
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 19:46 ` Scott Wood
@ 2006-11-06 19:54 ` Timur Tabi
2006-11-06 20:13 ` Jerry Van Baren
2006-11-06 20:35 ` Tolunay Orkun
2 siblings, 0 replies; 26+ messages in thread
From: Timur Tabi @ 2006-11-06 19:54 UTC (permalink / raw)
To: u-boot
Scott Wood wrote:
> The benefit is that bss-related bugs in the pre-RAM code go away and
> stay away, and that ugliness such as having to specify __attribute__
> ((section ("data"))) whenever the value is zero also goes away.
For the record, the only use of "section (data)" is in the I2C code I just
wrote. And this code can be eliminated if we change i2c_read() and
i2c_write() to take the bus number as a parameter. Although I should we
should implement that change, doing so would require changing 91 files.
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 19:46 ` Scott Wood
2006-11-06 19:54 ` Timur Tabi
@ 2006-11-06 20:13 ` Jerry Van Baren
2006-11-06 20:21 ` Timur Tabi
2006-11-06 20:35 ` Tolunay Orkun
2 siblings, 1 reply; 26+ messages in thread
From: Jerry Van Baren @ 2006-11-06 20:13 UTC (permalink / raw)
To: u-boot
Scott Wood wrote:
> Jerry Van Baren wrote:
>> Does the linker create proper zero initialization?
>
> Yes.
[snipped the rest of the "yes" answers - good to know this, thank you]
> The main things that would take effort are changing all the board linker
> scripts, and finding large BSS allocations and changing them to be
> dynamically allocated so they don't take up space in flash.
>
> The benefit is that bss-related bugs in the pre-RAM code go away and
> stay away, and that ugliness such as having to specify __attribute__
> ((section ("data"))) whenever the value is zero also goes away.
>
> -Scott
OK, but you are trading one fixed bss-related bug in the pre-RAM code
for a larger u-boot image and more complexity.
Pre-RAM code is short and sweet and thus has a pretty limited
opportunity for bugs. On the other hand, changing all the board linker
scripts takes effort and regression testing by all the board
maintainers. Finding large bss allocations and changing them to be
dynamically allocated sounds like a job that is initially large and
ultimately never ending.
<http://en.wikipedia.org/wiki/Sisyphus>
I'm afraid the audience here isn't very sympathetic.
Best regards,
gvb
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 20:13 ` Jerry Van Baren
@ 2006-11-06 20:21 ` Timur Tabi
2006-11-06 20:44 ` Wolfgang Denk
0 siblings, 1 reply; 26+ messages in thread
From: Timur Tabi @ 2006-11-06 20:21 UTC (permalink / raw)
To: u-boot
Jerry Van Baren wrote:
> Scott Wood wrote:
>> Jerry Van Baren wrote:
>>> Does the linker create proper zero initialization?
>> Yes.
>
> [snipped the rest of the "yes" answers - good to know this, thank you]
>
>> The main things that would take effort are changing all the board linker
>> scripts, and finding large BSS allocations and changing them to be
>> dynamically allocated so they don't take up space in flash.
>>
>> The benefit is that bss-related bugs in the pre-RAM code go away and
>> stay away, and that ugliness such as having to specify __attribute__
>> ((section ("data"))) whenever the value is zero also goes away.
>>
>> -Scott
>
> OK, but you are trading one fixed bss-related bug in the pre-RAM code
> for a larger u-boot image and more complexity.
No, I don't think that's accurate.
Advantages:
1) Eliminates the one (there may be more in the future) BSS-related bug
2) Eliminates the BSS initialization code
3) It's LESS complex. I don't know why you think it's more complex.
4) Eliminates the obscure bug that could occur if you expect "int X = 0" to
actually be 0 instead of 0xFFFFFFFF.
Disadvantes:
1) Larger U-Boot image file.
2) Larger flash storage requirements.
> Pre-RAM code is short and sweet and thus has a pretty limited
> opportunity for bugs. On the other hand, changing all the board linker
> scripts takes effort and regression testing by all the board
> maintainers.
I agree that making the change globally would require regression testing. For
instance, there could be buggy code out there that depends on the BSS section
being initialized to FF before the relocation.
> Finding large bss allocations and changing them to be
> dynamically allocated sounds like a job that is initially large and
> ultimately never ending.
It could be implemented as a compile-time option that would be disabled by
default.
--
Timur Tabi
Linux Kernel Developer @ Freescale
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 17:43 ` Scott Wood
2006-11-06 18:03 ` Jerry Van Baren
@ 2006-11-06 20:26 ` Wolfgang Denk
2006-11-06 20:48 ` Scott Wood
1 sibling, 1 reply; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-06 20:26 UTC (permalink / raw)
To: u-boot
In message <454F7440.5030709@freescale.com> you wrote:
>
> > No, this is NOT acceptable. Don't even think of it.
>
> I don't think refusing to think about alternatives is conducive to good
> software engineering.
The concept of BSS for using uninitialized data (meaning: implicitely
initialized to zero) is as old as C and Unix, actualy even older than
that (from IBM 7090 times, IIRC). It is simple, efficient, and
powerful.
I see zero reason to drop it.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"If you'll excuse me a minute, I'm going to have a cup of coffee."
- broadcast from Apollo 11's LEM, "Eagle", to Johnson Space Center,
Houston July 20, 1969, 7:27 P.M.
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 18:08 ` Timur Tabi
2006-11-06 18:48 ` Jerry Van Baren
@ 2006-11-06 20:29 ` Wolfgang Denk
1 sibling, 0 replies; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-06 20:29 UTC (permalink / raw)
To: u-boot
In message <454F7A30.9030100@freescale.com> you wrote:
>
> If BSS were merged into the DATA segment, then the compiler would be the one
> that zeros BSS. Basically, BSS would go away, and all global variables
> (static or otherwise) would be placed into DATA. They would be initialized to
... and U-Boot would stop being usable on a significan percentage of
boards simply because it does not fit any more in the available flash
memory.
There are many other ways to solve your problem with much less impact
on other boards.
I reject your suggestion. And this is a final statement.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Monday is an awful way to spend one seventh of your life.
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 19:46 ` Scott Wood
2006-11-06 19:54 ` Timur Tabi
2006-11-06 20:13 ` Jerry Van Baren
@ 2006-11-06 20:35 ` Tolunay Orkun
2 siblings, 0 replies; 26+ messages in thread
From: Tolunay Orkun @ 2006-11-06 20:35 UTC (permalink / raw)
To: u-boot
Scott Wood wrote:
> The BSS is purely an optimization; besides increasing flash footprint
> somewhat, removing it should not change anything except for code that
> was already broken.
But that increase in size can be important. Besides after relocation
from ROM to RAM the area will not be used. I personally would rather not
increase the size of image to handle a limited number of special cases
where this initialization is needed prior to relocation to RAM. You can
handle such special cases by instructing the variable to be placed on
"data" section (like Timur did). Perhaps a macro could be defined to
make it more readable and documentation/faq would take care of education.
Tolunay
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 20:21 ` Timur Tabi
@ 2006-11-06 20:44 ` Wolfgang Denk
0 siblings, 0 replies; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-06 20:44 UTC (permalink / raw)
To: u-boot
In message <454F992D.7010402@freescale.com> you wrote:
>
> Advantages:
>
> 1) Eliminates the one (there may be more in the future) BSS-related bug
Let's keep this straight. The bug is not in U-Boot, but in newly
introduced code, which ignores the documented way to write code that
is running in the restrictred environment before relocation.
> 2) Eliminates the BSS initialization code
Yes, what a win. We save 50 bytes of code and add - wait a second:
-> size u-boot
text data bss dec hex filename
328632 30584 314076 673292 a460c u-boot
...and add 307 KiB of data. You lose by one to several thousands.
> 3) It's LESS complex. I don't know why you think it's more complex.
> 4) Eliminates the obscure bug that could occur if you expect "int X = 0" to
> actually be 0 instead of 0xFFFFFFFF.
You don't understand. No matter what your're trying to do, pre-
relocation code runs in a severly restricted environment. All your
attapts to "fix" this are void, especially since the whole data
segment remains read-only. Solving the "int X=0;" case does not solve
the "X=1;" five lines later.
You have to be aware of this situation, and trying to hide it by
providong a "working solution" for a single special case is making
things more obscure.
I recommend just to keep in mind *all* the restrictions when writing
pre-reloc code, and to minimize the amount of such code in your
systems.
Anything else is probably worse than what we have now.
> I agree that making the change globally would require regression testing. For
> instance, there could be buggy code out there that depends on the BSS section
> being initialized to FF before the relocation.
You speculations are ... ummm... interesting. You find funny ways to
defend a situatioin where the problem is all your's only.
> It could be implemented as a compile-time option that would be disabled by
> default.
No. I will not accept any of such code. Period.
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Our business is run on trust. We trust you will pay in advance.
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 20:26 ` Wolfgang Denk
@ 2006-11-06 20:48 ` Scott Wood
2006-11-06 21:15 ` Wolfgang Denk
0 siblings, 1 reply; 26+ messages in thread
From: Scott Wood @ 2006-11-06 20:48 UTC (permalink / raw)
To: u-boot
Wolfgang Denk wrote:
> The concept of BSS for using uninitialized data (meaning: implicitely
> initialized to zero)
However, with the current u-boot linker scripts (some of them, at least;
I'm not going to make a sweeping statement about all 270), data
*explicitly* initialized to zero is also going in the bss. Combined
with the fact that some C code is executed before the bss is cleared,
that is simply evil.
> is as old as C and Unix, actualy even older than
> that (from IBM 7090 times, IIRC). It is simple, efficient, and
> powerful.
Your point being? I'm not attacking the concept of a bss, just the use
of it in a codebase where C code is executed prior to being able to
clear the bss.
> I see zero reason to drop it.
I have stated the reason. If you prefer an environment that invites
bugs and ugly workarounds thereto, then suit yourself.
-Scott
^ permalink raw reply [flat|nested] 26+ messages in thread
* [U-Boot-Users] Why are some global vars part of the image, and some not?
2006-11-06 20:48 ` Scott Wood
@ 2006-11-06 21:15 ` Wolfgang Denk
0 siblings, 0 replies; 26+ messages in thread
From: Wolfgang Denk @ 2006-11-06 21:15 UTC (permalink / raw)
To: u-boot
In message <454F9FB2.8090009@freescale.com> you wrote:
>
> However, with the current u-boot linker scripts (some of them, at least;
> I'm not going to make a sweeping statement about all 270), data
> *explicitly* initialized to zero is also going in the bss. Combined
Yes, and this is perfectly fine from the ANSI C standard point of
view. The situation is that we don;t have a standard C environment
yet, so you must not insist on being able to use standard C.
> with the fact that some C code is executed before the bss is cleared,
> that is simply evil.
It is one of several restrictions. There are many more. For example,
you cannot write any data in the data segment either. And you cannot
put big data structures on the stack. And you have to keep in mind
that you must not nest function calls too deeply because thestack
size is very limited. And... and...
It's IMHO nensense to figt this situation, you just make it worse.
Insted, please focus on moving all complex code *after* relocation,
where all these problems go away automagically.
> I have stated the reason. If you prefer an environment that invites
> bugs and ugly workarounds thereto, then suit yourself.
You don't fix anything but one special case (the initial assignment
of a zero). Any later assignments to the same variable will still
fail. If this deems OK to you, then please just use "#define foo 0"
instead of "int foo=0;"
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Software suppliers are trying to make their software packages more
``user-friendly''. . . . Their best approach, so far, has been to
take all the old brochures, and stamp the words, ``user-friendly'' on
the cover. - Bill Gates
^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2006-11-06 21:15 UTC | newest]
Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-03 21:58 [U-Boot-Users] Why are some global vars part of the image, and some not? Timur Tabi
2006-11-03 22:19 ` Timur Tabi
2006-11-03 23:47 ` Wolfgang Denk
2006-11-04 0:09 ` Timur Tabi
2006-11-04 0:33 ` Wolfgang Denk
2006-11-03 23:44 ` Wolfgang Denk
2006-11-04 0:07 ` Timur Tabi
2006-11-04 0:31 ` Wolfgang Denk
2006-11-04 1:38 ` Timur Tabi
2006-11-04 2:04 ` Wolfgang Denk
2006-11-06 17:43 ` Scott Wood
2006-11-06 18:03 ` Jerry Van Baren
2006-11-06 18:08 ` Timur Tabi
2006-11-06 18:48 ` Jerry Van Baren
2006-11-06 18:56 ` Scott Wood
2006-11-06 19:06 ` Jerry Van Baren
2006-11-06 19:46 ` Scott Wood
2006-11-06 19:54 ` Timur Tabi
2006-11-06 20:13 ` Jerry Van Baren
2006-11-06 20:21 ` Timur Tabi
2006-11-06 20:44 ` Wolfgang Denk
2006-11-06 20:35 ` Tolunay Orkun
2006-11-06 20:29 ` Wolfgang Denk
2006-11-06 20:26 ` Wolfgang Denk
2006-11-06 20:48 ` Scott Wood
2006-11-06 21:15 ` Wolfgang Denk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox