/*
* Copyright (c) 2006 SigmaTel, Inc.
*
* elftosb boot description file that creates some complicated situations for
* the loader to handle. of course this is also a good test for elftosb itself.
*/
/* testing C style comments */
// testing C++ style comments
# testing shell style comments
constants {
kProgressReportsImageFlag = 0x1;
kPlayerDriveTag = 0xa0;
kHostlinkDriveTag = 0xb0;
}
options {
productVersion = "5.0.999";
componentVersion = "5.0.999";
flags = kProgressReportsImageFlag; // turn on progress reports
secinfoClear = "ignore";
}
constants {
arg = 0xfeedf00d;
callArg1 = 2;
callArg2 = 3;
halfword = 10.h;
// flag = 1;
testboolexpr = 1 > 0;
mainSizeIsDefined = defined(mainSize);
}
sources {
elffile = extern(0) (toolset="ghs");
binfile1 = extern(1);
binfile2 = extern(2);
foofile = "file.dat";
anotherfile = "another.dat";
srecfile = "test_files/sd_player_gcc.srec";
}
options {
driveTag = kPlayerDriveTag;
some_option = defined(testboolexpr);
}
constants {
printMessageAddr = elffile:printMessage;
printMessageSize = sizeof(elffile:printMessage);
// create const with address of main() in elffile
mainAddr = elffile:main;
mainSize = sizeof(elffile:main);
halfwordSize = sizeof(halfword);
elf_startAddr = elffile:_start;
// poop = exists(nonexistantfile);
binfile1size = sizeof(binfile1);
}
/*
* test s-record support
*/
section (0)
{
load dcd {{ 00 11 22 33 }} > 0;
load srecfile;
call srecfile;
}
section(1; coalesce=true) {
info "welcome to section 1!";
info "elffile path = $(elffile)";
info "mainSizeIsDefined = $(d:mainSizeIsDefined)";
info "printMessage = $(x:printMessageAddr)";
info "size of binfile1 = $(binfile1size)";
// can use symbol refs inside bool expressions in an if stmt
if elffile:main == 0
{
warning "$(elffile) does not seem to have a main() function";
}
else
{
info "address of main() of $(elffile) is $(x:mainAddr)";
}
if defined(flag) && flag != 0
{
load 0x1234.h > 0..10K;
}
else
{
// print message using both decimal and hex formatting
warning "loading only halfword = $(d:halfword) [$(x:halfword)]!";
load halfword > 0..1K;
}
info "size of main() in $(elffile) is $(mainSize)";
info "printMessage() size is $(printMessageSize)";
info "size of halfword = $(halfwordSize)";
load 0xff.b > 32K..32K + sizeof(elffile:printMessage);
from elffile {
load {{ 00 01 02 03 04 }} > 1K;
// load all sections except .mytext
load ~$.mytext;
// figure out where to go from here
call :maybeSwitchSections(callArg1);
// print msg and loop
load "hi from section 1" > :szMsg;
call :printMessage(0);
jump :hello(0);
}
// erase a function in memory
load 0.w > (elffile:endOfLine)..(elffile:endOfLine + sizeof(elffile:endOfLine));
}
section(2; alignment=64K) {
// cause an error if testConst has not been set
if !defined(testConst)
{
error "testConst is not defined!";
}
from elffile {
load "in section 2" > :szMsg;
call :printMessage();
}
// load the contents of binfile1 into the upper 128KB of ocram
load binfile1 > 128K..192K;
from elffile {
load "loaded binfile1" > :szMsg;
call :printMessage(0);
call :maybeSwitchSections(callArg2);
jump :endOfLine(2);
}
}
// non-bootable section between two bootable sections
section(0xbeef; alignment=32K, cleartext=false) <= binfile2;
section(3; alignment=8K) {
// load our special section
load $.mytext from elffile;
call elffile:countToN(5);
if (exists(foofile) && exists(anotherfile))
{
// a trainload of beef!
load 0xbeef.h > 128K..192K;
}
else if (exists(elffile) && callArg1 == 2)
{
// aaaaaaah!
load 0x12345678.w > 128K..192K;
}
else
{
from elffile
{
// aaaaaaah!
load 0xaaaa.h > 128K..192K;
load $.text;
load 0xbbbb.h > 128K..192K;
}
}
from elffile {
load "hold on now, in section 3" > :szMsg;
call :printMessage(0);
jump :endOfLine(3);
}
from elffile {
load elffile;
load elffile > .;
load elffile[ $.bss ] > elffile:countToN;
// load [ $.bss ] > (elffile:countToN)..(elffile:countToN + sizeof(elffile:countToN));
call elffile;
call elffile(1);
}
info "address of _start in $(elffile) is $(elf_startAddr)";
}
section ('four'; alignment=8K, sectionFlags=0x1000) <= binfile1;
section ('five'; alignment=8K, cleartext=1, sectionFlags=0x1000) <= binfile1;
/*
* create a data section out of some sections of an elf file
*/
section (1234) <= ~$.bss, ~$.data from elffile;
section (4321) <= elffile [ $* ];
section (1111) <= elffile;
/* test data sections from various data sources */
section (0xaa) <= 0x12345678.w;
section (0xbb) <= "hi there! this is a data section.";
section (0xcc) <= {{ aa55aa55aa55aa55aa55aa55aa55aa55 }};
section (2345)
{
load elffile[ $*.text*, ~$.sdram* ];
}
section ('six_')
{
// load a blob at address 0x1000
load {{
00 0a 07 b0 bb ff 03 78
00 0a 07 b0 bb ff 03 78
00 0a 07 b0 bb ff 03 78
00 0a 07 b0 bb ff 03 78
00 0a 07 b0 bb ff 03 78
}} > 0x1000;
}
section ('bad_')
{
// uncomment to test better error reporting for files that failed to open
// load foofile;
}
//section (2345) <= {{ 00 11 22 33 44 55 }};