]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - tools/elftosb/bdfiles/complex.bd
Added source of Freescale's 'elftosb' tool
[karo-tx-uboot.git] / tools / elftosb / bdfiles / complex.bd
diff --git a/tools/elftosb/bdfiles/complex.bd b/tools/elftosb/bdfiles/complex.bd
new file mode 100644 (file)
index 0000000..4038a52
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+ * 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 }};
+
+
+
+