[OpenBIOS] [commit] r720 - in trunk/openbios-devel: arch/unix include/libopenbios libopenbios packages

repository service svn at openbios.org
Mon Mar 29 01:47:36 CEST 2010


Author: mcayland
Date: Mon Mar 29 01:47:36 2010
New Revision: 720
URL: http://tracker.coreboot.org/trac/openbios/changeset/720

Log:
Move the *_init_program() functions into the main loader source files so that everything is in one place. Part of this 
involves taking the existing parts of the XCOFF loader and putting them into a new loader file xcoff_load.c. Also fix a 
dependency order change these changes introduce when building openbios-unix.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>

Added:
   trunk/openbios-devel/include/libopenbios/xcoff_load.h
   trunk/openbios-devel/libopenbios/xcoff_load.c
Modified:
   trunk/openbios-devel/arch/unix/build.xml
   trunk/openbios-devel/arch/unix/unix.c
   trunk/openbios-devel/include/libopenbios/aout_load.h
   trunk/openbios-devel/include/libopenbios/elf_load.h
   trunk/openbios-devel/include/libopenbios/fcode_load.h
   trunk/openbios-devel/include/libopenbios/forth_load.h
   trunk/openbios-devel/libopenbios/aout_load.c
   trunk/openbios-devel/libopenbios/build.xml
   trunk/openbios-devel/libopenbios/elf_load.c
   trunk/openbios-devel/libopenbios/fcode_load.c
   trunk/openbios-devel/libopenbios/forth_load.c
   trunk/openbios-devel/packages/elf-loader.c
   trunk/openbios-devel/packages/xcoff-loader.c

Modified: trunk/openbios-devel/arch/unix/build.xml
==============================================================================
--- trunk/openbios-devel/arch/unix/build.xml	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/arch/unix/build.xml	Mon Mar 29 01:47:36 2010	(r720)
@@ -13,8 +13,8 @@
   <object source="blk.c"  flags="-DBOOTSTRAP"/>
   <object source="plugins.c" flags="-DBOOTSTRAP" condition="PLUGINS"/>
   <external-object source="libbootstrap.a"/>
-  <external-object source="libopenbios.a"/>
   <external-object source="libpackages.a"/>
+  <external-object source="libopenbios.a"/>
   <external-object source="libdrivers.a"/>
   <external-object source="libfs.a"/>
   <external-object source="liblibc.a"/>

Modified: trunk/openbios-devel/arch/unix/unix.c
==============================================================================
--- trunk/openbios-devel/arch/unix/unix.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/arch/unix/unix.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -51,6 +51,8 @@
 static void exit_terminal(void);
 void boot(void);
 
+unsigned long virt_offset = 0;
+
 /* local variables */
 
 static ucell *memory;

Modified: trunk/openbios-devel/include/libopenbios/aout_load.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/aout_load.h	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/include/libopenbios/aout_load.h	Mon Mar 29 01:47:36 2010	(r720)
@@ -22,5 +22,6 @@
 
 extern int is_aout(struct exec *ehdr);
 extern int aout_load(struct sys_info *info, const char *filename);
+extern void aout_init_program(void);
 
 #endif   /* _H_AOUTLOAD */

Modified: trunk/openbios-devel/include/libopenbios/elf_load.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/elf_load.h	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/include/libopenbios/elf_load.h	Mon Mar 29 01:47:36 2010	(r720)
@@ -22,6 +22,7 @@
 #include "libopenbios/sys_info.h"
 
 extern int 		elf_load(struct sys_info *info, const char *filename, const char *cmdline, void **boot_notes);
+extern void 		elf_init_program(void);
 extern int		is_elf(Elf_ehdr *ehdr);
 extern int		find_elf(Elf_ehdr *ehdr);
 

Modified: trunk/openbios-devel/include/libopenbios/fcode_load.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/fcode_load.h	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/include/libopenbios/fcode_load.h	Mon Mar 29 01:47:36 2010	(r720)
@@ -19,5 +19,6 @@
 
 extern int is_fcode(unsigned char *fcode);
 extern int fcode_load(const char *filename);
+extern void fcode_init_program(void);
 
 #endif   /* _H_FCODELOAD */

Modified: trunk/openbios-devel/include/libopenbios/forth_load.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/forth_load.h	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/include/libopenbios/forth_load.h	Mon Mar 29 01:47:36 2010	(r720)
@@ -19,5 +19,6 @@
 
 extern int is_forth(char *forth);
 extern int forth_load(const char *filename);
+extern void forth_init_program(void);
 
 #endif   /* _H_FORTHLOAD */

Added: trunk/openbios-devel/include/libopenbios/xcoff_load.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/openbios-devel/include/libopenbios/xcoff_load.h	Mon Mar 29 01:47:36 2010	(r720)
@@ -0,0 +1,27 @@
+/*
+ *   Creation Date: <2010/03/22 18:00:00 mcayland>
+ *   Time-stamp: <2010/03/22 18:00:00 mcayland>
+ *
+ *	<xcoff_load.h>
+ *
+ *	XCOFF loader
+ *
+ *   Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland at siriusit.co.uk)
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation
+ *
+ */
+
+#ifndef _H_XCOFFLOAD
+#define _H_XCOFFLOAD
+
+#include "arch/common/xcoff.h"
+#include "libopenbios/sys_info.h"
+
+extern int is_xcoff(COFF_filehdr_t *fhdr);
+extern int xcoff_load(struct sys_info *info, const char *filename);
+extern void xcoff_init_program(void);
+
+#endif   /* _H_XCOFFLOAD */

Modified: trunk/openbios-devel/libopenbios/aout_load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/aout_load.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/libopenbios/aout_load.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -23,7 +23,8 @@
 static char *image_name, *image_version;
 static int fd;
 
-static int check_mem_ranges(struct sys_info *info,
+static int 
+check_mem_ranges(struct sys_info *info,
                             unsigned long start,
                             unsigned long size)
 {
@@ -58,16 +59,17 @@
     return 0;
 }
 
-int is_aout(struct exec *ehdr)
+int 
+is_aout(struct exec *ehdr)
 {
 	return ((ehdr->a_info & 0xffff) == OMAGIC
 		|| (ehdr->a_info & 0xffff) == NMAGIC
 		|| (ehdr->a_info & 0xffff) == ZMAGIC
 		|| (ehdr->a_info & 0xffff) == QMAGIC);
-
 }
 
-int aout_load(struct sys_info *info, const char *filename)
+int 
+aout_load(struct sys_info *info, const char *filename)
 {
     int retval = -1;
     struct exec ehdr;
@@ -154,3 +156,10 @@
     close_io(fd);
     return retval;
 }
+
+void 
+aout_init_program(void)
+{
+	// Currently not implemented
+	feval("0 state-valid !");
+}

Modified: trunk/openbios-devel/libopenbios/build.xml
==============================================================================
--- trunk/openbios-devel/libopenbios/build.xml	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/libopenbios/build.xml	Mon Mar 29 01:47:36 2010	(r720)
@@ -14,6 +14,7 @@
   <object source="ipchecksum.c"/>
   <object source="linuxbios_info.c" condition="LINUXBIOS"/>
   <object source="ofmem_common.c" condition="OFMEM"/>
+  <object source="xcoff_load.c" condition="LOADER_XCOFF"/>
  </library>
 
  <dictionary name="openbios" target="forth">

Modified: trunk/openbios-devel/libopenbios/elf_load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/elf_load.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/libopenbios/elf_load.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -19,6 +19,10 @@
 #define MAX_HEADERS	0x20
 #define BS		0x100	/* smallest step used when looking for the ELF header */
 
+#ifdef CONFIG_PPC
+extern void             flush_icache_range( char *start, char *stop );
+#endif
+
 /* FreeBSD and possibly others mask the high 8 bits */
 #define addr_fixup(addr) ((addr) & 0x00ffffff)
 
@@ -362,7 +366,8 @@
     return phdr;
 }
 
-int elf_load(struct sys_info *info, const char *filename, const char *cmdline, void **boot_notes)
+int 
+elf_load(struct sys_info *info, const char *filename, const char *cmdline, void **boot_notes)
 {
     Elf_ehdr ehdr;
     Elf_phdr *phdr = NULL;
@@ -460,3 +465,55 @@
 	free(image_version);
     return retval;
 }
+
+void 
+elf_init_program(void)
+{
+	char *base;
+	int i;
+	Elf_ehdr *ehdr;
+	Elf_phdr *phdr;
+	size_t size;
+	char *addr;
+	cell tmp;
+
+	/* TODO: manage ELF notes section */
+	feval("0 state-valid !");
+	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++) {
+
+#if DEBUG
+		debug("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 );
+#endif
+
+		size = MIN(phdr[i].p_filesz, phdr[i].p_memsz);
+		if (!size)
+			continue;
+#if 0
+		if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) {
+                        printk("Claim failed!\n");
+			return;
+		}
+#endif
+		/* Workaround for archs where sizeof(int) != pointer size */
+		tmp = phdr[i].p_vaddr;
+		addr = (char *)tmp;
+
+		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 !");
+	feval("-1 state-valid !");
+}

Modified: trunk/openbios-devel/libopenbios/fcode_load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/fcode_load.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/libopenbios/fcode_load.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -13,16 +13,18 @@
 
 static int fd;
 
-int is_fcode(unsigned char *fcode)
+int 
+is_fcode(unsigned char *fcode)
 {
-	return (fcode[0] == 0xf0		// start0
+	return (fcode[0] == 0xf0	// start0
 		|| fcode[0] == 0xf1	// start1 
 		|| fcode[0] == 0xf2	// start2
 		|| fcode[0] == 0xf3	// start4
 		|| fcode[0] == 0xfd);	// version1
 }
 
-int fcode_load(const char *filename)
+int 
+fcode_load(const char *filename)
 {
     int retval = -1;
     uint8_t fcode_header[8];
@@ -84,3 +86,16 @@
     close_io(fd);
     return retval;
 }
+
+void 
+fcode_init_program(void)
+{
+	/* If the payload is Fcode then we execute it immediately */
+	ucell address;
+
+	fword("load-base");
+	address = POP();
+	PUSH(address);
+	PUSH(1);
+	fword("byte-load");
+}

Modified: trunk/openbios-devel/libopenbios/forth_load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/forth_load.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/libopenbios/forth_load.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -78,3 +78,10 @@
     //	free(forthtext);
     return retval;
 }
+
+void 
+forth_init_program(void)
+{
+	// Currently not implemented
+	feval("0 state-valid !");
+}

Added: trunk/openbios-devel/libopenbios/xcoff_load.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/openbios-devel/libopenbios/xcoff_load.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -0,0 +1,141 @@
+/*
+ *
+ *       <xcoff_load.c>
+ *
+ *       XCOFF file loader
+ *
+ *   Copyright (C) 2009 Laurent Vivier (Laurent at vivier.eu)
+ *
+ *   from original XCOFF loader by Steven Noonan <steven at uplinklabs.net>
+ *
+ *   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 "config.h"
+#include "libopenbios/bindings.h"
+#include "libopenbios/xcoff_load.h"
+
+#include "arch/common/xcoff.h"
+
+#ifdef CONFIG_PPC
+extern void             flush_icache_range( char *start, char *stop );
+#endif
+
+//#define DEBUG_XCOFF
+
+#ifdef DEBUG_XCOFF
+#define DPRINTF(fmt, args...) \
+    do { printk("%s: " fmt, __func__ , ##args); } while (0)
+#else
+#define DPRINTF(fmt, args...) \
+    do { } while (0)
+#endif
+
+int 
+is_xcoff(COFF_filehdr_t *fhdr)
+{
+	return (fhdr->f_magic == U802WRMAGIC
+            || fhdr->f_magic == U802ROMAGIC
+	    || fhdr->f_magic == U802TOCMAGIC
+	    || fhdr->f_magic == U802TOMAGIC);
+}
+
+int 
+xcoff_load(struct sys_info *info, const char *filename)
+{
+	// Currently not implemented
+	return LOADER_NOT_SUPPORT;
+}
+
+void
+xcoff_init_program(void)
+{
+	char *base;
+	COFF_filehdr_t *fhdr;
+	COFF_aouthdr_t *ahdr;
+	COFF_scnhdr_t *shdr;
+	uint32_t offset;
+	int i;
+
+	feval("0 state-valid !");
+
+	feval("load-base");
+	base = (char*)POP();
+
+	fhdr = (COFF_filehdr_t*)base;
+
+	/* Is it an XCOFF file ? */
+	if (!is_xcoff(fhdr)) {
+		DPRINTF("Not a XCOFF file %02x\n", fhdr->f_magic);
+		return;
+	}
+
+	/* Is it executable ? */
+	if (fhdr->f_magic != 0x01DF &&
+	    (fhdr->f_flags & COFF_F_EXEC) == 0) {
+		DPRINTF("Not an executable XCOFF file %02x\n", fhdr->f_flags);
+		return;
+	}
+
+	/* Optional header is a.out ? */
+	if (fhdr->f_opthdr != sizeof(COFF_aouthdr_t)) {
+		DPRINTF("AOUT optional error size mismatch in XCOFF file\n");
+		return;
+	}
+
+        ahdr = (COFF_aouthdr_t*)(base + sizeof(COFF_filehdr_t));
+
+	/* check a.out magic number */
+	if (ahdr->magic != AOUT_MAGIC) {
+		DPRINTF("Invalid AOUT optional header\n");
+		return;
+	}
+
+	offset = sizeof(COFF_filehdr_t) + sizeof(COFF_aouthdr_t);
+
+	DPRINTF("XCOFF file with %d sections\n", fhdr->f_nscns);
+
+	for (i = 0; i < fhdr->f_nscns; i++) {
+
+		DPRINTF("Read header at offset %0x\n", offset);
+
+		shdr = (COFF_scnhdr_t*)(base + offset);
+
+		DPRINTF("Initializing '%s' section from %0x %0x to %0x (%0x)\n",
+			shdr->s_name, offset, shdr->s_scnptr,
+			shdr->s_vaddr, shdr->s_size);
+
+		if (strcmp(shdr->s_name, ".text") == 0) {
+
+			memcpy((char*)shdr->s_vaddr, base + shdr->s_scnptr,
+			       shdr->s_size);
+#ifdef CONFIG_PPC
+			flush_icache_range((char*)shdr->s_vaddr,
+					 (char*)(shdr->s_vaddr + shdr->s_size));
+#endif
+		} else if (strcmp(shdr->s_name, ".data") == 0) {
+
+			memcpy((char*)shdr->s_vaddr, base + shdr->s_scnptr,
+			       shdr->s_size);
+
+		} else if (strcmp(shdr->s_name, ".bss") == 0) {
+
+			memset((void *)shdr->s_vaddr, 0, shdr->s_size);
+
+		} else {
+			DPRINTF("    Skip '%s' section\n", shdr->s_name);
+		}
+		offset += sizeof(COFF_scnhdr_t);
+	}
+
+	/* FIXME: should initialize saved-program-state. */
+
+	DPRINTF("XCOFF entry point: %x\n", *(uint32_t*)ahdr->entry);
+	PUSH(*(uint32_t*)ahdr->entry);
+	feval("xcoff-entry !");
+
+	feval("-1 state-valid !");
+}

Modified: trunk/openbios-devel/packages/elf-loader.c
==============================================================================
--- trunk/openbios-devel/packages/elf-loader.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/packages/elf-loader.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -16,81 +16,13 @@
 
 #include "config.h"
 #include "libopenbios/bindings.h"
+#include "libopenbios/elf_load.h"
 #include "packages.h"
-#include "libopenbios/ofmem.h"
-
-#include "arch/common/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;
-	cell tmp;
-
-	feval("0 state-valid !");
-
-	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 0
-		if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) {
-                        printk("Claim failed!\n");
-			return;
-		}
-#endif
-		/* Workaround for archs where sizeof(int) != pointer size */
-		tmp = phdr[i].p_vaddr;
-		addr = (char *)tmp;
-
-		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 !");
-	feval("-1 state-valid !");
-}
-
 NODE_METHODS( elf_loader ) = {
-	{ "init-program", elf_loader_init_program },
+	{ "init-program", elf_init_program },
 };
 
 void elf_loader_init( void )

Modified: trunk/openbios-devel/packages/xcoff-loader.c
==============================================================================
--- trunk/openbios-devel/packages/xcoff-loader.c	Sun Mar 28 22:55:10 2010	(r719)
+++ trunk/openbios-devel/packages/xcoff-loader.c	Mon Mar 29 01:47:36 2010	(r720)
@@ -16,126 +16,13 @@
 
 #include "config.h"
 #include "libopenbios/bindings.h"
+#include "libopenbios/xcoff_load.h"
 #include "packages.h"
-#include "libopenbios/ofmem.h"
-
-#include "arch/common/xcoff.h"
-
-//#define DEBUG_XCOFF
-
-#ifdef DEBUG_XCOFF
-#define DPRINTF(fmt, args...) \
-    do { printk("%s: " fmt, __func__ , ##args); } while (0)
-#else
-#define DPRINTF(fmt, args...) \
-    do { } while (0)
-#endif
 
 DECLARE_NODE(xcoff_loader, INSTALL_OPEN, 0, "+/packages/xcoff-loader" );
 
-#ifdef CONFIG_PPC
-extern void             flush_icache_range( char *start, char *stop );
-#endif
-
-static void
-xcoff_loader_init_program( void *dummy )
-{
-	char *base;
-	COFF_filehdr_t *fhdr;
-	COFF_aouthdr_t *ahdr;
-	COFF_scnhdr_t *shdr;
-	uint32_t offset;
-	int i;
-
-	feval("0 state-valid !");
-
-	feval("load-base");
-	base = (char*)POP();
-
-	fhdr = (COFF_filehdr_t*)base;
-
-	/* Is it an XCOFF file ? */
-
-	if (fhdr->f_magic != U802WRMAGIC &&
-            fhdr->f_magic != U802ROMAGIC &&
-	    fhdr->f_magic != U802TOCMAGIC &&
-	    fhdr->f_magic != U802TOMAGIC) {
-		DPRINTF("Not a XCOFF file %02x\n", fhdr->f_magic);
-		return;
-	}
-
-	/* Is it executable ? */
-
-	if (fhdr->f_magic != 0x01DF &&
-	    (fhdr->f_flags & COFF_F_EXEC) == 0) {
-		DPRINTF("Not an executable XCOFF file %02x\n", fhdr->f_flags);
-		return;
-	}
-
-	/* Optional header is a.out ? */
-
-	if (fhdr->f_opthdr != sizeof(COFF_aouthdr_t)) {
-		DPRINTF("AOUT optional error size mismatch in XCOFF file\n");
-		return;
-	}
-
-        ahdr = (COFF_aouthdr_t*)(base + sizeof(COFF_filehdr_t));
-
-	/* check a.out magic number */
-
-	if (ahdr->magic != AOUT_MAGIC) {
-		DPRINTF("Invalid AOUT optional header\n");
-		return;
-	}
-
-	offset = sizeof(COFF_filehdr_t) + sizeof(COFF_aouthdr_t);
-
-	DPRINTF("XCOFF file with %d sections\n", fhdr->f_nscns);
-
-	for (i = 0; i < fhdr->f_nscns; i++) {
-
-		DPRINTF("Read header at offset %0x\n", offset);
-
-		shdr = (COFF_scnhdr_t*)(base + offset);
-
-		DPRINTF("Initializing '%s' section from %0x %0x to %0x (%0x)\n",
-			shdr->s_name, offset, shdr->s_scnptr,
-			shdr->s_vaddr, shdr->s_size);
-
-		if (strcmp(shdr->s_name, ".text") == 0) {
-
-			memcpy((char*)shdr->s_vaddr, base + shdr->s_scnptr,
-			       shdr->s_size);
-#ifdef CONFIG_PPC
-			flush_icache_range((char*)shdr->s_vaddr,
-					 (char*)(shdr->s_vaddr + shdr->s_size));
-#endif
-		} else if (strcmp(shdr->s_name, ".data") == 0) {
-
-			memcpy((char*)shdr->s_vaddr, base + shdr->s_scnptr,
-			       shdr->s_size);
-
-		} else if (strcmp(shdr->s_name, ".bss") == 0) {
-
-			memset((void *)shdr->s_vaddr, 0, shdr->s_size);
-
-		} else {
-			DPRINTF("    Skip '%s' section\n", shdr->s_name);
-		}
-		offset += sizeof(COFF_scnhdr_t);
-	}
-
-	/* FIXME: should initialize saved-program-state. */
-
-	DPRINTF("XCOFF entry point: %x\n", *(uint32_t*)ahdr->entry);
-	PUSH(*(uint32_t*)ahdr->entry);
-	feval("xcoff-entry !");
-
-	feval("-1 state-valid !");
-}
-
 NODE_METHODS( xcoff_loader ) = {
-	{ "init-program", xcoff_loader_init_program },
+	{ "init-program", xcoff_init_program },
 };
 
 void xcoff_loader_init( void )



More information about the OpenBIOS mailing list