Skip to contentSkip to conversation

strings: use puts() rather than printf()

PATCH New Mike Frysinger 3 participants 4 messages Nov 4, 2008 – Dec 7, 2008

lore
Share & tools
lore
#0 lore raw

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
index db54f29..7d05cf8 100644
@@ -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
#1 lore raw

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
index 3ebb6d9..d0515b9 100644
@@ -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
#2 lore raw

PATCH 1/1 strings: use puts() rather than printf()

In reply to Mike Frysinger
Quoted 3 lines · Mike Frysinger

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.

...which raises the question of why we don't have vsnprintf().

-Scott

#3 lore raw

PATCH 1/1 strings: use puts() rather than printf()

In reply to Mike Frysinger

Dear Mike Frysinger,

Quoted 8 lines · In message <[email protected]> you wrote:

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(-)

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.