Showing results for 
Search instead for 
Did you mean: 
Honored Contributor I

Uboot with no mmu booting standalone application



I'm trying to get u-boot starts my standalone "Hello World" application. So this is what I did: 


1) Create Application in Nios IDE 

2) Create a binary from elf 

nios2-linux-gnu-objcopy -O binary testNiosUboot.elf testNiosUboot.bin 

I did not remove any section from the elf... 

3) check the elf disassembly code to see if it match with the binary i just generated: 


testNiosUboot.elf: file format elf32-littlenios2 Disassembly of section .exceptions: 00000020 <alt_exception>: 20: deffed04 addi sp,sp,-76 24: dfc00015 stw ra,0(sp) 28: d8400215 stw at,8(sp) ... 000000ec <alt_irq_handler>: ec: defff904 addi sp,sp,-28 f0: dfc00615 stw ra,24(sp) f4: df000515 stw fp,20(sp) f8: df000504 addi fp,sp,20 ... Disassembly of section .text: 000001c4 <_start>: 1c4: 00880014 movui r2,8192 1c8: 10000033 initd 0(r2) 1cc: 10bff804 addi r2,r2,-32 1d0: 00bffd16 blt zero,r2,1c8 <_start+0x4> ...  


Binary output: 

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 04 ED FF DE 15 00 C0 DF 15 02 40 D8 15 03 80 D8 00000010 15 04 C0 D8 15 05 00 D9 15 06 40 D9 15 07 80 D9 00000020 15 08 C0 D9 7A 30 0B 00 15 09 00 DA 15 0A 40 DA ... 00000180 15 FB BF E0 17 FB BF E0 3A 00 05 10 1E 01 00 10 00000190 06 D8 3F 00 17 06 C0 DF 17 05 00 DF 04 07 C0 DE 000001A0 3A 28 00 F8 14 00 88 00 33 00 00 10 04 F8 BF 10 000001B0 16 FD BF 00 34 80 C0 06 14 00 C0 DE 74 00 80 06 ...  


4) Create u-boot image 


mkimage -A nios2 -O linux -T standalone -C none -a 0x00000020 -e 0x000001C4 -n "testNiosUboot" -d testNiosUboot.bin uImageTest  


I set the loadin address to 0x20 because my binary first byte is the exception entry first byte. And starting address to 0x1C4. 


5) Try it... 


UBOOT>tftpboot 1000000 uImageTest Using ALTERA_TSE-0 device TFTP from server; our IP address is Filename 'uImageTest'. Load address: 0x1000000 Loading:# ############ done Bytes transferred = 62780 (f53c hex) UBOOT>bootm 1000000# # Booting kernel from Legacy Image at 01000000 ... Image Name: testNiosUboot Image Type: NIOS II Linux Standalone Program (uncompressed) Data Size: 62716 Bytes = 61.2 KiB Load Address: 00000020 Entry Point: 000001c4 Verifying Checksum ... OK Loading Standalone Program ... OK OK 


It hangs.... 


6) Look at u-boot code and make dirty patches: 


In cmd_bootm.c, I uncomment enable_interrupts because it stops execution and we never go to bootm_start_standalone : 

if (images.os.type == IH_TYPE_STANDALONE) { printf("iflag = %x\n", iflag); /*if (iflag) enable_interrupts();*/ /* This may return when 'autostart' is 'no' */ bootm_start_standalone(iflag, argc, argv); return 0; }  

Then I cutout lot of stuff here to test it quickly: 

static int bootm_start_standalone(ulong iflag, int argc, char *argv) { char *s; int (*appl)(int, char *); /* Don't start if "autostart" is set to "no" */ /* if (((s = getenv("autostart")) != NULL) && (strcmp(s, "no") == 0)) { char buf; sprintf(buf, "%lX", images.os.image_len); setenv("filesize", buf); return 0; }*/ appl = (int (*)(int, char *))/*ntohl*/(images.ep); printf("Jump to 0x%08lx\n", appl); (*appl)(argc-1, &argv); return 0; }  


I got "Jump to 0x000001c4" printed out but nothing happens....I don't have my Hello World.... 


Am I wrong somewhere ?? 



0 Kudos
4 Replies
Honored Contributor I

I think I messed something up last time. It works. However I had to keep my patches I order to make it works....

Honored Contributor I



Was your hello world application a u-boot standalone application (i mean compiled with u-boot source) or a generic linux application. 


I have a doubt that a linux application would be having printf(...) calling some syscalls to write string on UART, and syscall implementations would not be available in standalone environment. 


Secondly, is there a better way to configure/find the load address of a compiled application? 



Honored Contributor I

It was a loooong time ago :) 


It was a Nios2 executable (not a linux image or uboot stuff). 


The common way of starting an elf file is bootelf. However, for testing purpose I wanted to put this program in a uboot image.... 


If you want to find the linked address of an elf program you can use objdump. 


Best regards, 

Honored Contributor I

Thanks for the information.