strings: use puts() rather than printf()
PATCH 1/1 strings: use puts() rather than printf()
When running strings on really long strings, the stack tends to get smashed due to printf(). Switch to puts() instead since we're only passing the data through.
--- common/cmd_strings.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
common/cmd_strings.c +2 -1
@@ -29,7 +29,8 @@ int do_strings(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])char *addr = start_addr;do { -printf ("%s\n" , addr); +puts (addr); +puts ("\n" ); addr +=strlen (addr) +1 ; }while (addr[0 ] && addr < last_addr);
Signature · 1 line
1.6.0.3
PATCH v2 1/1 cmd_elf: CONFIG_ELF_SIMPLE_LOAD: load ELFs according to PHDRs
The current ELF loading function does a lot of work above and beyond a simple "loading". It ignores the real load addresses and loads things into their virtual (runtime) address. This is undesirable when we just want it to load an ELF and let the ELF do the actual C runtime init.
---
- add a call to flush_cache() to make sure icache/dcache are in sync
common/cmd_elf.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
common/cmd_elf.c +28 -0
@@ -276,6 +276,33 @@ int valid_elf_image (unsigned long addr)* A very simple elf loader, assumes the image is valid, returns the * entry point address. * ====================================================================== */ +#ifdef CONFIG_ELF_SIMPLE_LOAD +unsigned long load_elf_image (unsigned long addr) +{ +Elf32_Ehdr *ehdr; +Elf32_Phdr *phdr; +unsigned long entry; +size_t i; + + ehdr = (Elf32_Ehdr *) addr; + phdr = (Elf32_Phdr *) (addr + ehdr->e_phoff); + + entry = ehdr->e_entry; + +/* Load each program header */ +for (i =0 ; i < ehdr->e_phnum; ++i) { +void *dst = (void *) phdr->p_paddr; +void *src = (void *) addr + phdr->p_offset; +printf ("Loading phdr %i to 0x%p (%i bytes)\n" , + i, dst, phdr->p_filesz); +memcpy (dst, src, phdr->p_filesz); +flush_cache ((unsigned long )dst, phdr->p_filesz); + ++phdr; + } + +return entry; +} +#else unsigned long load_elf_image (unsigned long addr) {Elf32_Ehdr *ehdr;/* Elf header structure pointer */
@@ -327,6 +354,7 @@ unsigned long load_elf_image (unsigned long addr)return ehdr->e_entry; } +#endif /* ====================================================================== */ U_BOOT_CMD(
Signature · 1 line
1.6.0.3
PATCH 1/1 strings: use puts() rather than printf()
In reply to Mike FrysingerQuoted 3 lines · Mike Frysinger
When running
stringson really long strings, the stack tends to get smashed due toprintf(). Switch toputs()instead since we're only passing the data through.
...which raises the question of why we don't have vsnprintf().
-Scott
Wolfgang Denk
AppliedPATCH 1/1 strings: use puts() rather than printf()
In reply to Mike FrysingerDear Mike Frysinger,
Quoted 8 lines · In message <[email protected]> you wrote:
When running
stringson really long strings, the stack tends to get smashed due toprintf(). Switch toputs()instead since we're only passing the data through.Signed-off-by Mike Frysinger <[email protected]>--- common/cmd_strings.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 4 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Never call a man a fool. Borrow from him.