[OpenBIOS] r579 - trunk/openbios-devel/modules

svn at openbios.org svn at openbios.org
Sat Sep 19 01:01:28 CEST 2009


Author: laurent
Date: 2009-09-19 01:01:28 +0200 (Sat, 19 Sep 2009)
New Revision: 579

Added:
   trunk/openbios-devel/modules/elf-loader.c
Log:
Add missing file from r578

Added: trunk/openbios-devel/modules/elf-loader.c
===================================================================
--- trunk/openbios-devel/modules/elf-loader.c	                        (rev 0)
+++ trunk/openbios-devel/modules/elf-loader.c	2009-09-18 23:01:28 UTC (rev 579)
@@ -0,0 +1,90 @@
+/*
+ *
+ *       <elf-loader.c>
+ *
+ *       ELF file loader
+ *
+ *   Copyright (C) 2009 Laurent Vivier (Laurent at vivier.eu)
+ *
+ *   Some parts Copyright (C) 2002, 2003, 2004 Samuel Rydh (samuel at ibrium.se)
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   version 2
+ *
+ */
+
+#include "openbios/config.h"
+#include "openbios/bindings.h"
+#include "modules.h"
+#include "ofmem.h"
+
+#include "openbios/elf.h"
+#include "asm/elf.h"
+
+/* TODO: manage ELF notes section */
+
+//#define DEBUG_ELF
+
+#ifdef DEBUG_ELF
+#define DPRINTF(fmt, args...) \
+    do { printk("%s: " fmt, __func__ , ##args); } while (0)
+#else
+#define DPRINTF(fmt, args...) \
+    do { } while (0)
+#endif
+
+DECLARE_NODE(elf_loader, INSTALL_OPEN, 0, "+/packages/elf-loader" );
+
+#ifdef CONFIG_PPC
+extern void             flush_icache_range( char *start, char *stop );
+#endif
+
+static void
+elf_loader_init_program( void *dummy )
+{
+	char *base;
+	int i;
+	Elf_ehdr *ehdr;
+	Elf_phdr *phdr;
+	size_t size;
+	char *addr;
+
+	feval("load-base");
+	base = (char*)POP();
+
+	ehdr = (Elf_ehdr *)base;
+	phdr = (Elf_phdr *)(base + ehdr->e_phoff);
+
+	for (i = 0; i < ehdr->e_phnum; i++) {
+		DPRINTF("filesz: %08lX memsz: %08lX p_offset: %08lX "
+                        "p_vaddr %08lX\n",
+			(ulong)phdr[i].p_filesz, (ulong)phdr[i].p_memsz,
+			(ulong)phdr[i].p_offset, (ulong)phdr[i].p_vaddr );
+
+		size = MIN(phdr[i].p_filesz, phdr[i].p_memsz);
+		if (!size)
+			continue;
+		if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) {
+                        printk("Claim failed!\n");
+			return;
+		}
+		addr = (char*)phdr[i].p_vaddr;
+		memcpy(addr, base + phdr[i].p_offset, size);
+#ifdef CONFIG_PPC
+		flush_icache_range( addr, addr + size );
+#endif
+	}
+	/* FIXME: should initialize saved-program-state. */
+	PUSH(ehdr->e_entry);
+	feval("elf-entry !");
+}
+
+NODE_METHODS( elf_loader ) = {
+	{ "init-program", elf_loader_init_program },
+};
+
+void elf_loader_init( void )
+{
+	REGISTER_NODE( elf_loader );
+}




More information about the OpenBIOS mailing list