Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer


# ooh! test input command file for elftosb 2!

options {
	coalesce = yes;

	# most elf files are GHS produced
	toolset = "GHS";

	# set versions
	productVersion = "111.222.333";
	componentVersion = "999.888.777";

	# set file flags
	flags = (1 << 0) | (1 << 1);
}

constants {
	ocram_start = 0;
	ocram_size = 256K;
	ocram_end = ocram_start + ocram_size - 1;

#	ocram = ocram_start .. ocram_end;
#
#	ocram = ocram_start +.. ocram_size;

	string_addr = 0x4500;

	# boot modes
	USB_BM = 0;
	JTAG_BM = 7;
	newBootMode = USB_BM;
}

sources {
	hello = extern(0);  # elf
	redboot = extern(1);  # srec
	hostlink = extern(2); # elf
	sd_player = extern(3) ( toolset="GCC" ); # elf
	datasrc = "test0.key"; # binary
}

section (0) {
	# load dcd
	load dcd {{ 00 11 22 33 }} > 0;

	# same load without dcd
	load {{ 00 11 22 33 }} > 0;

	call 0xf000;

    hab call 0xf0000000 (128);
	hab jump 0;

/*
	# load a simple IVT to an absolute address
	# this fills in the IVT self address field from the target address
	load ivt (entry=hello:_start) > 0x1000;

	# load simple IVT. the IVT self address is set explicitly in the IVT declaration,
	# giving the IVT a natural address so you don't have to tell where to load it.
	load ivt (entry=hello:_start, self=0x1000);

	load ivt (entry=hello:_start, self=0x1000, csf=0x2000, dcd=0);

	# Setting IVT entry point to the default entry point of a source file.
	load ivt (entry=hostlink) > 0;

	load ivt (entry=hello:_start, self=0x1000);
	hab call 0x1000;

	# Special syntax that combines the load and call into one statement.
	hab call ivt(entry=hello:_start, self=0x1000);



	load ivt (
	    entry = hello:_start,
	    csf = 0x2000
	) > 0x1000;

	# All supported IVT fields.
	load ivt (
	    entry = hello:,
	    dcd = 0,
	    boot_data = 0,
	    self = 0,
	    csf = 0
	);

	hab call ivt; # Call the last loaded IVT. */
}

section (32) {
	# load a string to some address
	load "some string" > string_addr;

	# byte fill a region
	load 0x55.b > ocram_start..ocram_end;

	from hostlink {
		load $*;
	}

	# jump to a symbol
	jump hostlink:_start (100);
}

section (100)
{
	load redboot;
	call redboot;
}

section(0x5a)
{
	load datasrc > 0..8;

	from hostlink
	{
#		load $* ( $.ocram.*, ~$.sdram.* );

#		load $.sdram.*;
#		load $.ocram.*;

		call :main;
		call :_start;
	}

#	goto 0x5b;
}

section (0x5b)
{
#	load $* from sd_player;

#	load hello$.text @ 64K;
#	load hello$*

	load $.text from hello > 0x10000;
	call sd_player (0xdeadbeef);
}

section (0x5c)
{
	# these loads should produce fill commands with a
	# length equal to the pattern word size
	load 0x55.b > 0x200;
	load 0x55aa.h > 0x400;
	load 0x55aa66bb.w > 0x800;

#	load 0x55.b to 0x200;
#	load 0x55aa.h to 0x400;
#	load 0x55aa66bb.w to 0x800;

#	load 0x55.b @ 0x200;
#	load 0x55aa.h @ 0x400;
#	load 0x55aa66bb.w @ 0x800;

#	load $.text from hello @ .;
#	load hello$.text @ .;
#	load hello$* @ .

	# this should produce a fill command with a length
	# of 0x100
	load 0x4c8e.h > 0x100..0x200;

#	load [ 0a 9b 77 66 55 44 33 22 11 00 ] @ 0x100;
}

# non-bootable section
section (0x100) <= datasrc;

#section (1K)
#{
#	load 0xff.b > hostlink:g_wUsbVID + 4;
#
#	load "Fred's Auto Service\x00" > hostlink:g_wUsbVendorName;
#
#	from sd_player
#	{
#		load [ 00 11 22 33 44 55 66 77 ] > :g_data + 16;
#	}
#
##	(0x10 .. 0x20) + 5  ==  0x15 .. 0x25
#}

# section that switches modes
section (2K)
{
	mode newBootMode;
}