[U-Boot] [PATCH v3 0/6] Introduce generic relocation feature

Simon Glass sjg at chromium.org
Wed Jan 18 20:31:53 CET 2012


[+TI maintainers, tx25 board maintainer]

Hi Albert,

On Tue, Jan 17, 2012 at 11:28 PM, Albert ARIBAUD
<albert.u.boot at aribaud.net> wrote:
> Hi Simon,
>
> Le 26/12/2011 19:24, Simon Glass a écrit :
>
>> (I am resending this rebased so I can continue with this board-unification
>> work and allow people to review patches. There were some comments on the
>> v2 series but my questions have been sitting on the list for 2 weeks so it
>> is probably time for a new series.)
>>
>> This is the second patch series aiming to unify the various board.c files
>> in each architecture into a single one. This series implements a generic
>> relocation feature, which is the bridge between board_init_f() and
>> board_init_r(). It then moves ARM over to use this framework, as an
>> example.
>>
>> On ARM the relocation code is duplicated for each CPU yet it
>> is the same. We can bring this up to the arch level. But since (I believe)
>> Elf relocation is basically the same process for all archs, there is no
>> reason not to bring it up to the generic level.
>>
>> Each architecture which uses this framework needs to provide a function
>> called arch_elf_relocate_entry() which processes a single relocation
>> entry. This is a static inline function to reduce code size overhead.
>
>
> Agreed.

OK, that is the first three patches.

>
>
>> For ARM, a new arch/arm/lib/proc.S file is created, which holds generic
>> ARM assembler code (things that cannot be written in C and are common
>> functions used by all ARM CPUs). This helps reduce duplication. Interrupt
>> handling code and perhaps even some startup code can move there later.
>>
>> It may be useful for other architectures with a lot of different CPUs
>> to have a similar file.
>
>
> NAK for several reasons:

I think you are NAKing the 'arm: Add processor function library'
patch out of the series:

Create reloc.h and include it where needed
define CONFIG_SYS_SKIP_RELOC for all archs
Add generic relocation feature
arm: Add processor function library
arm: Move over to generic relocation
arm: Remove unused code in start.S

Q1: Should I remove that patch and just repeat the code from there in
each start.S file? The impact would be to remove most of the code in
the relocate_code() function in each start.S except for the last few
instructions (reproduced below).

>
> 1. The code that goes on proc.S is already in start.S, which already
> contains "things which cannot be written in C and are common functions used
> by all ARM CPUs". Granted, right now start.S is duplicated in multiple CPU
> directories; so the thing to do is to merge all ARM start.S files into a
> single one, rather than merging only one of its parts.

Q2: What should this merged file be called and what directory should
it be in? This is the question I asked last time, and the lack of an
answer is the reason why I have been unable to make progress here.
Please advise your preference and I will sort it out.

Note I don't think I can do this in one series - there is far too much
variation between the files for me to take on that way. I need a new
file than I can bit I bit move things over into, allowing affected
parties to comment on each as I go.

>
> 2. There is no interest in moving this segment of code from all start.S
> files into a new proc.S file: there is no gain is code size obviously, and
> there is an increase in source file count.

Just checking that you see that the code is removed from start.S, not
moved. The code in proc.S is:

.globl proc_call_board_init_r
proc_call_board_init_r:
#ifndef CONFIG_SYS_ICACHE_OFF
	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache
	mcr     p15, 0, r0, c7, c10, 4	@ DSB
	mcr     p15, 0, r0, c7, c5, 4	@ ISB
#endif
	mov	sp, r3
	/* jump to it ... */
	mov	pc, r2

which is taken from the end of each relocate_code() copy. Assuming we
are on the page, then ok.

>
> 3. I consider that files should contain 'things' based on their common
> /functionality/, not on their similar /nature/, and "going about starting up
> U-Boot" is a functionality.

The code here sets the stack pointer and calls a function. However I
agree this unlikely to be useful outside starting up. See Q2.

>
> Note that eventually, having a single start.S will achieve the same effect
> as this 'proc.S' patch.

At present start.S runs for a bit and then jumps to board_init_f(). At
the end of board_init_f() we jump back to start.S (relocate_code()
function) and from there to board_init_r(). Also start.S has exception
handling code.

I think start.S should be thought of as in three parts:
- early CPU init (hardest to make common)
- relocation code (last 3 patches of this series)
- exception code

The first one clearly belongs in start.S. I don't think the other two
do. They are not related to CPU start-up. The relocation code is only
there because of the need to call a function with a new stack pointer.
Other than that it can be written in C. Apart from reset the exception
code isn't related to starting up the CPU - it is only there because
the it is a convenient assembler file (your reasoning suggests that
you would in fact want this in a new except.S file).

So maybe we want start.S, reloc.S and except.S?

>
> Note also that this start.S commonalization should be a completely different
> patch set.

Are you saying you want a later series which moves all the start.S
relocate_code() code from each cpu dir into a single place? If so,
please see Q2.

>
>
>> Code size on my ARMv7 system increases by 54 bytes with generic
>> relocation. This overhead is mostly just literal pool access and setting
>> up to call the relocated U-Boot at the end.
>>
>> On my system, execution time increases from 10.8ms to 15.6ms due to the
>> less efficient C implementations of the copy and zero loops. If execution
>> time is of concern, you can define CONFIG_USE_ARCH_MEMSET and
>> CONFIG_USE_ARCH_MEMCPY to reduce it. For met this reduces relocation time
>> to 5.4ms, i.e. twice as fast as the old system.
>
>
> Side question: is there any reason not to define these CONFIG options
> systematically?

Code size.

>
>
>> One problem remains which causes mx31pdk to fail to build. It doesn't
>> have string.c in its SPL code and the architecture-specific versions of
>> memset()/memcpy() are too large. I propose to add a local change to
>> reloc.c that uses inline code for boards that use the old legacy SPL
>> framework. We can remove it later. This is not included in v2 but I am
>> interested in comments on this approach. An alternative would be just
>> to add simple memset()/memcpy() functions just for this board (and one
>> other affected MX31 board).
>
>
> I am not too fond of the "later removal" approach. In my experience, this
> invariably tends to the "old bloat in the code no one knows the reason of"
> situations.

Me neither. The only board affected is the tx25. We could let the
maintainer fix it up, I suppose. I have no way of testing it.

>
>
>> Changes in v2:
>> - Use CONFIG_SYS_SKIP_RELOC instead of CONFIG_SYS_LEGACY_BOARD
>> - Import asm-generic/sections.h from Linux and add U-Boot extras
>> - Squash generic link symbols patch into generic relocation patch
>> - Move reloc.c into common/
>> - Add function comments
>> - Use memset, memcpy instead of inline code
>> - Add README file for relocation
>> - Invalidate I-cache when we jump to relocated code
>> - Use an inline relocation function to reduce code size
>> - Make relocation symbols global so we can use them outside start.S
>>
>> Changes in v3:
>> - Remove the 'reloc' tag from each commit
>> - Rebase to master
>>
>> Simon Glass (6):
>>   Create reloc.h and include it where needed
>>   define CONFIG_SYS_SKIP_RELOC for all archs
>>   Add generic relocation feature
>>   arm: Add processor function library
>>   arm: Move over to generic relocation
>>   arm: Remove unused code in start.S
>>
>>  README                                            |    4 +
>>  arch/arm/cpu/arm1136/start.S                      |  133 ++------------
>>  arch/arm/cpu/arm1176/start.S                      |  214
>> ++-------------------
>>  arch/arm/cpu/arm720t/start.S                      |  127 ++-----------
>>  arch/arm/cpu/arm920t/start.S                      |  135 ++------------
>>  arch/arm/cpu/arm925t/start.S                      |  135 ++------------
>>  arch/arm/cpu/arm926ejs/davinci/spl.c              |    1 +
>>  arch/arm/cpu/arm926ejs/start.S                    |  144 ++-------------
>>  arch/arm/cpu/arm946es/start.S                     |  130 ++-----------
>>  arch/arm/cpu/arm_intcm/start.S                    |  135 ++------------
>>  arch/arm/cpu/armv7/omap-common/spl.c              |    1 +
>>  arch/arm/cpu/armv7/start.S                        |  140 ++------------
>>  arch/arm/cpu/ixp/start.S                          |  127 ++-----------
>>  arch/arm/cpu/lh7a40x/start.S                      |  124 ++-----------
>>  arch/arm/cpu/pxa/start.S                          |  138 ++------------
>>  arch/arm/cpu/s3c44b0/start.S                      |  127 ++-----------
>>  arch/arm/cpu/sa1100/start.S                       |  124 ++-----------
>>  arch/arm/include/asm/reloc.h                      |   56 ++++++
>>  arch/arm/lib/Makefile                             |    2 +
>>  arch/arm/lib/board.c                              |    1 +
>>  arch/arm/lib/proc.S                               |   40 ++++
>>  arch/avr32/config.mk                              |    3 +
>>  arch/avr32/lib/board.c                            |    1 +
>>  arch/blackfin/config.mk                           |    3 +
>>  arch/m68k/config.mk                               |    3 +
>>  arch/m68k/lib/board.c                             |    1 +
>>  arch/microblaze/config.mk                         |    3 +
>>  arch/mips/config.mk                               |    3 +
>>  arch/mips/lib/board.c                             |    1 +
>>  arch/nds32/config.mk                              |    3 +
>>  arch/nds32/lib/board.c                            |    1 +
>>  arch/nios2/config.mk                              |    3 +
>>  arch/powerpc/config.mk                            |    3 +
>>  arch/powerpc/lib/board.c                          |    1 +
>>  arch/sandbox/config.mk                            |    3 +
>>  arch/sh/config.mk                                 |    3 +
>>  arch/sparc/config.mk                              |    3 +
>>  arch/x86/config.mk                                |    3 +
>>  arch/x86/lib/board.c                              |    1 +
>>  board/freescale/mpc8313erdb/mpc8313erdb.c         |    1 +
>>  board/freescale/mpc8315erdb/mpc8315erdb.c         |    1 +
>>  board/samsung/smdk6400/smdk6400_nand_spl.c        |    1 +
>>  board/sheldon/simpc8313/simpc8313.c               |    1 +
>>  common/Makefile                                   |    4 +
>>  common/reloc.c                                    |  121 ++++++++++++
>>  doc/README.relocation                             |   87 +++++++++
>>  include/asm-generic/sections.h                    |   92 +++++++++
>>  include/common.h                                  |    2 +-
>>  include/reloc.h                                   |   54 +++++
>>  nand_spl/board/freescale/mpc8536ds/nand_boot.c    |    1 +
>>  nand_spl/board/freescale/mpc8569mds/nand_boot.c   |    1 +
>>  nand_spl/board/freescale/mpc8572ds/nand_boot.c    |    1 +
>>  nand_spl/board/freescale/mx31pdk/Makefile         |    8 +-
>>  nand_spl/board/freescale/mx31pdk/u-boot.lds       |    1 +
>>  nand_spl/board/freescale/p1010rdb/nand_boot.c     |    1 +
>>  nand_spl/board/freescale/p1023rds/nand_boot.c     |    1 +
>>  nand_spl/board/freescale/p1_p2_rdb/nand_boot.c    |    1 +
>>  nand_spl/board/freescale/p1_p2_rdb_pc/nand_boot.c |    1 +
>>  nand_spl/board/karo/tx25/Makefile                 |    8 +-
>>  nand_spl/board/karo/tx25/u-boot.lds               |    1 +
>>  nand_spl/nand_boot_fsl_nfc.c                      |    1 +
>>  61 files changed, 705 insertions(+), 1765 deletions(-)
>>  create mode 100644 arch/arm/include/asm/reloc.h
>>  create mode 100644 arch/arm/lib/proc.S
>>  create mode 100644 common/reloc.c
>>  create mode 100644 doc/README.relocation
>>  create mode 100644 include/asm-generic/sections.h
>>  create mode 100644 include/reloc.h
>
>
> Amicalement,
> --
> Albert.

Regards,
Simon


More information about the U-Boot mailing list