/* * 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 }};