[U-Boot-Users] .bss section problem

Hi there,
I'm working on the port of U-Boot to a new custom board based on the i.MX1 (ARM920T). I noticed that in the start.S the code in which the .bss will be cleared, loops until _bss_start != _bss_end i.e.
clear_bss: ldr r0, _bss_start /* find start of bss segment */ add r0, r0, #4 /* start at first byte of bss */ ldr r1, _bss_end /* stop here */ mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /* clear loop... */ add r0, r0, #4 cmp r0, r1 bne clbss_l
So, when _bss_end is not forced to be .ALIGNED(4) like the _bss_start is, the code may loops till it crashs :-( This is what actually happened in my case. Now to fix the problem on my port I changed my u-boot.lds as:
. = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = ALIGN(4);
and to be consistent I replaced the 'bne clbss_1' with 'ble clbss_1' instruction.
I was wondering if I'm missing something on the linker directives or indeed it is small bug.
Thanks for your suggestions, -Paolo Broggini

In message NDBBJGGCBKABIDHFAMBIIEPICDAA.pbroggini@softool.ch you wrote:
(ARM920T). I noticed that in the start.S the code in which the .bss will be cleared, loops until _bss_start != _bss_end i.e.
...
and to be consistent I replaced the 'bne clbss_1' with 'ble clbss_1' instruction.
I was wondering if I'm missing something on the linker directives or indeed it is small bug.
It's not exactly a bug as it works on all correctly configured systems, but your version is obviously more robust. Added. Thanks.
Best regards,
Wolfgang Denk
participants (2)
-
Paolo Broggini
-
Wolfgang Denk