]> git.ipfire.org Git - people/ms/u-boot.git/blame - doc/README.standalone
riscv: doc: Add relative doc to describe RISC-V
[people/ms/u-boot.git] / doc / README.standalone
CommitLineData
27b207fd
WD
1Design Notes on Exporting U-Boot Functions to Standalone Applications:
2======================================================================
3
77846748
WD
41. The functions are exported by U-Boot via a jump table. The jump
5 table is allocated and initialized in the jumptable_init() routine
6 (common/exports.c). Other routines may also modify the jump table,
7 however. The jump table can be accessed as the 'jt' field of the
49cad547 8 'global_data' structure. The struct members for the jump table are
77846748
WD
9 defined in the <include/exports.h> header. E.g., to substitute the
10 malloc() and free() functions that will be available to standalone
11 applications, one should do the following:
12
13 DECLARE_GLOBAL_DATA_PTR;
14
49cad547
MD
15 gd->jt->malloc = my_malloc;
16 gd->jt->free = my_free;
77846748 17
49cad547
MD
18 Note that the pointers to the functions are real function pointers
19 so the compiler can perform type checks on these assignments.
77846748
WD
20
212. The pointer to the jump table is passed to the application in a
0df01fd3
TC
22 machine-dependent way. PowerPC, ARM, MIPS, Blackfin and Nios II
23 architectures use a dedicated register to hold the pointer to the
6a10560c 24 'global_data' structure: r2 on PowerPC, r9 on ARM, k0 on MIPS,
0df01fd3
TC
25 P3 on Blackfin and gp on Nios II. The x86 architecture does not
26 use such a register; instead, the pointer to the 'global_data'
27 structure is passed as 'argv[-1]' pointer.
77846748
WD
28
29 The application can access the 'global_data' structure in the same
30 way as U-Boot does:
31
32 DECLARE_GLOBAL_DATA_PTR;
33
34 printf("U-Boot relocation offset: %x\n", gd->reloc_off);
35
363. The application should call the app_startup() function before any
37 call to the exported functions. Also, implementor of the
38 application may want to check the version of the ABI provided by
39 U-Boot. To facilitate this, a get_version() function is exported
40 that returns the ABI version of the running U-Boot. I.e., a
41 typical application startup may look like this:
42
54841ab5 43 int my_app (int argc, char * const argv[])
77846748
WD
44 {
45 app_startup (argv);
46 if (get_version () != XF_VERSION)
47 return 1;
48 }
49
504. The default load and start addresses of the applications are as
51 follows:
52
4c58eb55
MF
53 Load address Start address
54 x86 0x00040000 0x00040000
55 PowerPC 0x00040000 0x00040004
56 ARM 0x0c100000 0x0c100000
57 MIPS 0x80200000 0x80200000
58 Blackfin 0x00001000 0x00001000
afc1ce82 59 NDS32 0x00300000 0x00300000
0df01fd3 60 Nios II 0x02000000 0x02000000
3fafced7 61 RISC-V 0x00600000 0x00600000
77846748
WD
62
63 For example, the "hello world" application may be loaded and
64 executed on a PowerPC board with the following commands:
65
66 => tftp 0x40000 hello_world.bin
67 => go 0x40004
27b207fd 68
49cad547 695. To export some additional function long foobar(int i,char c), the following steps
77846748 70 should be undertaken:
27b207fd 71
77846748
WD
72 - Append the following line at the end of the include/_exports.h
73 file:
27b207fd 74
49cad547
MD
75 EXPORT_FUNC(foobar, long, foobar, int, char)
76
77 Parameters to EXPORT_FUNC:
78 - the first parameter is the function that is exported (default implementation)
79 - the second parameter is the return value type
80 - the third parameter is the name of the member in struct jt_funcs
81 this is also the name that the standalone application will used.
82 the rest of the parameters are the function arguments
27b207fd 83
77846748
WD
84 - Add the prototype for this function to the include/exports.h
85 file:
27b207fd 86
49cad547
MD
87 long foobar(int i, char c);
88
89 Initialization with the default implementation is done in jumptable_init()
90
91 You can override the default implementation using:
27b207fd 92
49cad547 93 gd->jt->foobar = another_foobar;
27b207fd 94
49cad547 95 The signature of another_foobar must then match the declaration of foobar.
27b207fd 96
77846748
WD
97 - Increase the XF_VERSION value by one in the include/exports.h
98 file
27b207fd 99
49cad547
MD
100 - If you want to export a function which depends on a CONFIG_XXX
101 use 2 lines like this:
102 #ifdef CONFIG_FOOBAR
103 EXPORT_FUNC(foobar, long, foobar, int, char)
104 #else
105 EXPORT_FUNC(dummy, void, foobar, void)
106 #endif
107
108
77846748
WD
1096. The code for exporting the U-Boot functions to applications is
110 mostly machine-independent. The only places written in assembly
111 language are stub functions that perform the jump through the jump
112 table. That said, to port this code to a new architecture, the
113 only thing to be provided is the code in the examples/stubs.c
114 file. If this architecture, however, uses some uncommon method of
115 passing the 'global_data' pointer (like x86 does), one should add
116 the respective code to the app_startup() function in that file.
27b207fd 117
77846748
WD
118 Note that these functions may only use call-clobbered registers;
119 those registers that are used to pass the function's arguments,
120 the stack contents and the return address should be left intact.