mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
157 lines
5.9 KiB
Text
157 lines
5.9 KiB
Text
|
Design Notes on Exporting U-Boot Functions to Standalone Applications:
|
||
|
======================================================================
|
||
|
|
||
|
1. Add a field to the global_data structure, the pointer to a jump
|
||
|
table.
|
||
|
|
||
|
2. Jump table itself is allocated and filled in the same way as the
|
||
|
syscall table is (allocated with malloc() after the code has been
|
||
|
relocated to RAM); a special function, fixed to the table element
|
||
|
number 0, will be added which returns the ABI version so
|
||
|
applications can check for compatibility issues.
|
||
|
|
||
|
3. It is application's responsibility to check the ABI version and
|
||
|
act accordingly.
|
||
|
|
||
|
4. Pointer to the global_data is passed to the application in the
|
||
|
dedicated register that is used in the U-Boot to hold this
|
||
|
pointer. This assumes that the application is built with the same
|
||
|
register- allocation flags as the U-Boot itself. (Actually, this
|
||
|
is a requirement even now, as the 'go' command does not perform
|
||
|
any actions to protect this register against being clobbered by
|
||
|
the application).
|
||
|
|
||
|
This approach won't work on the x86 architecture. See below.
|
||
|
|
||
|
5. Application now calls standard library functions like printf()
|
||
|
instead of specially prefixed names like mon_printf() as it did
|
||
|
before. Present implementation of these functions (using the
|
||
|
system calls mechanism) will be replaced with jump stubs.
|
||
|
|
||
|
6. To export additional functions, the following steps will have to be
|
||
|
taken:
|
||
|
|
||
|
- Add the xxx() U-Boot function to the EXPORT_FUNC list
|
||
|
- Add initialization of the appropriate slot in the jump table
|
||
|
|
||
|
7. To port to a new architecture, the appropriate stub code should be
|
||
|
provided. No other machine-dependent code is used. Once the stub
|
||
|
template is available, no additional coding is needed when
|
||
|
exporting new U-Boot functions. A pre-processor macro will be used
|
||
|
to automatically instantiate the stub definition for each exported
|
||
|
function.
|
||
|
|
||
|
Note the following:
|
||
|
|
||
|
- This approach uses a jump table with fixed slot allocation. That
|
||
|
said, to retain the ABI compatibility, no table reordering,
|
||
|
inserting new functions in the middle of the list or deleting
|
||
|
functions from the list is allowed. Any such action will break the
|
||
|
ABI compatibility.
|
||
|
|
||
|
- The x86 architecture does not use a dedicated register to store the
|
||
|
pointer to the global_data structure. There are the following
|
||
|
approaches available:
|
||
|
|
||
|
* Pass the global_data pointer to the application in a register or
|
||
|
as an additional argument. This requires special machine-
|
||
|
dependent startup code to be compiled into the application.
|
||
|
|
||
|
* Make the x86 consistent with the rest of architectures and use a
|
||
|
dedicated register. This renders one register unusable in the
|
||
|
rest of the U-Boot code and thus increases the size of the U-Boot
|
||
|
binary and decreases it performance.
|
||
|
|
||
|
The following changes will be made:
|
||
|
|
||
|
- The syscall handling code will be removed.
|
||
|
|
||
|
- The include/_exports.h file will be introduced, containing the list
|
||
|
of the exported functions in the following form:
|
||
|
|
||
|
EXPORT_FUNC(getc)
|
||
|
EXPORT_FUNC(tstc)
|
||
|
...
|
||
|
|
||
|
This list will be used to assign the slot numbers in the jump
|
||
|
table, to determine the size of the jump table and to generate the
|
||
|
code for the stub functions.
|
||
|
|
||
|
- The include/exports.h file will be introduced, containing the
|
||
|
prototypes of the exported functions and the assigned slot numbers.
|
||
|
|
||
|
- The examples/stubs.c file will be introduced, containing the code
|
||
|
for the jump stubs for each of the exported functions.
|
||
|
|
||
|
Implementation Notes on Exporting U-Boot Functions:
|
||
|
===================================================
|
||
|
|
||
|
1. The patch was applied against TOT as of 7/24 12:50 MEST; the
|
||
|
resulting images were tested on the following boards:
|
||
|
|
||
|
* lwmon (PowerPC)
|
||
|
* trab (ARM)
|
||
|
* inca (MIPS)
|
||
|
|
||
|
The hello_world application was loaded and executed then:
|
||
|
|
||
|
[lwmon]
|
||
|
=> tftp 0x40000 /tftpboot/LWMON/hello_world.bin-avn
|
||
|
=> go 0x40004
|
||
|
|
||
|
[trab]
|
||
|
TRAB # tftp 0xc100000 /tftpboot/TRAB/hello_world.bin-avn
|
||
|
TRAB # go 0xc100000
|
||
|
|
||
|
[inca]
|
||
|
INCA-IP # tftp 0x80200000 /tftpboot/INCA/hello_world.bin-avn
|
||
|
INCA-IP # go 0x80200000
|
||
|
|
||
|
2. As neither of supported x86 boards can be built from the TOT
|
||
|
sources currently, the patch build was verified by manually
|
||
|
running the following command in the U-Boot top directory:
|
||
|
|
||
|
> make -C examples TOPDIR=`pwd` ARCH=i386 CROSS_COMPILE=
|
||
|
|
||
|
The rest of the code is mostly machine-independent and was not
|
||
|
verified.
|
||
|
|
||
|
3. To test the x86 assembly code, a small standalone application was
|
||
|
written. It was built and run on the RedHat Linux 8.0 (x86). The
|
||
|
application performs a jump using a pointer to jump table and a
|
||
|
function's index in it.
|
||
|
|
||
|
4. For the MIPS architecture, the linker script is also provided for
|
||
|
linking applications. The default linker script places the .text
|
||
|
and .data sections too far from each other so that the resulting
|
||
|
.bin files span about 256Mb in size.
|
||
|
|
||
|
5. Several example applications required updating for the new API.
|
||
|
These applications relied upon the bd_t pointer being passed as
|
||
|
the 1st argument to the main function; this had changed when the
|
||
|
system calls were introduced, but apparently, these applications
|
||
|
weren't fixed at that moment. This is fixed now.
|
||
|
|
||
|
6. GCC issues warnings for the 'sched' application. Since now the
|
||
|
mon_printf() function is renamed to printf(), GCC applies its
|
||
|
knowledge of the format specifiers to check the arguments,
|
||
|
complaining about ints passed as longs and vice versa. This is not
|
||
|
fixed yet.
|
||
|
|
||
|
7. Only the hello_world example application was modified to make use
|
||
|
of the newly supplied get_version() function. The application now
|
||
|
prints two ABI versions, the one that the application was compiled
|
||
|
for and the other, actual ABI version.
|
||
|
|
||
|
8. The following new files were added:
|
||
|
common/exports.c
|
||
|
examples/mips.lds
|
||
|
examples/stubs.c
|
||
|
include/_exports.h
|
||
|
include/exports.h
|
||
|
doc/README.standalone
|
||
|
|
||
|
The following files are no longer used and will be removed:
|
||
|
examples/syscall.S
|
||
|
include/syscall.h
|