Design Notes on Exporting U-Boot Functions to Standalone Applications:
======================================================================

1. The functions are exported by U-Boot via a jump table. The jump
   table is allocated and initialized in the jumptable_init() routine
   (common/exports.c). Other routines may also modify the jump table,
   however. The jump table can be accessed as the 'jt' field of the
   'global_data' structure. The struct members for the jump table are
   defined in the <include/exports.h> header. E.g., to substitute the
   malloc() and free() functions that will be available to standalone
   applications, one should do the following:

	DECLARE_GLOBAL_DATA_PTR;

	gd->jt->malloc	= my_malloc;
	gd->jt->free = my_free;

   Note that the pointers to the functions are real function pointers
   so the compiler can perform type checks on these assignments.

2. The pointer to the jump table is passed to the application in a
   machine-dependent way. PowerPC, ARM, MIPS, Blackfin and Nios II
   architectures use a dedicated register to hold the pointer to the
   'global_data' structure: r2 on PowerPC, r9 on ARM, k0 on MIPS,
   P3 on Blackfin and gp on Nios II. The x86 architecture does not
   use such a register; instead, the pointer to the 'global_data'
   structure is passed as 'argv[-1]' pointer.

   The application can access the 'global_data' structure in the same
   way as U-Boot does:

	DECLARE_GLOBAL_DATA_PTR;

	printf("U-Boot relocation offset: %x\n", gd->reloc_off);

3. The application should call the app_startup() function before any
   call to the exported functions. Also, implementor of the
   application may want to check the version of the ABI provided by
   U-Boot. To facilitate this, a get_version() function is exported
   that returns the ABI version of the running U-Boot. I.e., a
   typical application startup may look like this:

	int my_app (int argc, char * const argv[])
	{
		app_startup (argv);
		if (get_version () != XF_VERSION)
			return 1;
	}

4. The default load and start addresses of the applications are as
   follows:

			Load address	Start address
	x86		0x00040000	0x00040000
	PowerPC		0x00040000	0x00040004
	ARM		0x0c100000	0x0c100000
	MIPS		0x80200000	0x80200000
	Blackfin	0x00001000	0x00001000
	NDS32		0x00300000	0x00300000
	Nios II		0x02000000	0x02000000

   For example, the "hello world" application may be loaded and
   executed on a PowerPC board with the following commands:

   => tftp 0x40000 hello_world.bin
   => go 0x40004

5. To export some additional function long foobar(int i,char c), the following steps
   should be undertaken:

   - Append the following line at the end of the include/_exports.h
     file:

	EXPORT_FUNC(foobar, long, foobar, int, char)

	Parameters to EXPORT_FUNC:
	 - the first parameter is the function that is exported (default implementation)
	 - the second parameter is the return value type
	 - the third  parameter is the name of the member in struct jt_funcs
	   this is also the name that the standalone application will used.
	   the rest of the parameters are the function arguments

   - Add the prototype for this function to the include/exports.h
     file:

	long foobar(int i, char c);

	Initialization with the default implementation is done in jumptable_init()

	You can override the default implementation using:

	gd->jt->foobar = another_foobar;

	The signature of another_foobar must then match the declaration of foobar.

   - Increase the XF_VERSION value by one in the include/exports.h
     file

   - If you want to export a function which depends on a CONFIG_XXX
	use 2 lines like this:
	#ifdef CONFIG_FOOBAR
		EXPORT_FUNC(foobar, long, foobar, int, char)
	#else
		EXPORT_FUNC(dummy, void, foobar, void)
	#endif


6. The code for exporting the U-Boot functions to applications is
   mostly machine-independent. The only places written in assembly
   language are stub functions that perform the jump through the jump
   table. That said, to port this code to a new architecture, the
   only thing to be provided is the code in the examples/stubs.c
   file. If this architecture, however, uses some uncommon method of
   passing the 'global_data' pointer (like x86 does), one should add
   the respective code to the app_startup() function in that file.

   Note that these functions may only use call-clobbered registers;
   those registers that are used to pass the function's arguments,
   the stack contents and the return address should be left intact.
