]> git.ipfire.org Git - people/ms/u-boot.git/blame - doc/README.standalone
avr32: refactor the portmux/gpio code
[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
8 'global_data' structure. The slot numbers for the jump table are
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
15 gd->jt[XF_malloc] = my_malloc;
16 gd->jt[XF_free] = my_free;
17
18 Note that the pointers to the functions all have 'void *' type and
19 thus the compiler cannot perform type checks on these assignments.
20
212. The pointer to the jump table is passed to the application in a
4c58eb55
MF
22 machine-dependent way. PowerPC, ARM, MIPS and Blackfin architectures
23 use a dedicated register to hold the pointer to the 'global_data'
6f99eec3
WD
24 structure: r2 on PowerPC, r8 on ARM, k0 on MIPS, and P5 on Blackfin.
25 The x86 architecture does not use such a register; instead, the
26 pointer to the 'global_data' structure is passed as 'argv[-1]'
27 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
43 int my_app (int argc, char *argv[])
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
77846748
WD
59
60 For example, the "hello world" application may be loaded and
61 executed on a PowerPC board with the following commands:
62
63 => tftp 0x40000 hello_world.bin
64 => go 0x40004
27b207fd 65
77846748
WD
665. To export some additional function foobar(), the following steps
67 should be undertaken:
27b207fd 68
77846748
WD
69 - Append the following line at the end of the include/_exports.h
70 file:
27b207fd 71
77846748 72 EXPORT_FUNC(foobar)
27b207fd 73
77846748
WD
74 - Add the prototype for this function to the include/exports.h
75 file:
27b207fd 76
77846748 77 void foobar(void);
27b207fd 78
77846748
WD
79 - Add the initialization of the jump table slot wherever
80 appropriate (most likely, to the jumptable_init() function):
27b207fd 81
77846748 82 gd->jt[XF_foobar] = foobar;
27b207fd 83
77846748
WD
84 - Increase the XF_VERSION value by one in the include/exports.h
85 file
27b207fd 86
77846748
WD
876. The code for exporting the U-Boot functions to applications is
88 mostly machine-independent. The only places written in assembly
89 language are stub functions that perform the jump through the jump
90 table. That said, to port this code to a new architecture, the
91 only thing to be provided is the code in the examples/stubs.c
92 file. If this architecture, however, uses some uncommon method of
93 passing the 'global_data' pointer (like x86 does), one should add
94 the respective code to the app_startup() function in that file.
27b207fd 95
77846748
WD
96 Note that these functions may only use call-clobbered registers;
97 those registers that are used to pass the function's arguments,
98 the stack contents and the return address should be left intact.