[LinuxBIOS] r458 - in LinuxBIOSv3: include lib

svn at openbios.org svn at openbios.org
Thu Jul 19 17:03:06 CEST 2007


Author: mjones
Date: 2007-07-19 17:03:05 +0200 (Thu, 19 Jul 2007)
New Revision: 458

Modified:
   LinuxBIOSv3/include/lar.h
   LinuxBIOSv3/lib/lar.c
Log:
Add execute in place to lar. Allows code to be run from the ROM.

Signed-off-by: Marc Jones <marc.jones at amd.com> 
Acked-by: Ronald G. Minnich <rminnich at gmail.com> 



Modified: LinuxBIOSv3/include/lar.h
===================================================================
--- LinuxBIOSv3/include/lar.h	2007-07-18 19:19:48 UTC (rev 457)
+++ LinuxBIOSv3/include/lar.h	2007-07-19 15:03:05 UTC (rev 458)
@@ -76,5 +76,6 @@
 int find_file(struct mem_file *archive, char *filename, struct mem_file *result);
 int copy_file(struct mem_file *archive, char *filename, void *where);
 int run_file(struct mem_file *archive, char *filename, void *where);
+int execute_in_place(struct mem_file *archive, char *filename);
 
 #endif /* LAR_H */

Modified: LinuxBIOSv3/lib/lar.c
===================================================================
--- LinuxBIOSv3/lib/lar.c	2007-07-18 19:19:48 UTC (rev 457)
+++ LinuxBIOSv3/lib/lar.c	2007-07-19 15:03:05 UTC (rev 458)
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2006-2007 coresystems GmbH
  * (Written by Stefan Reinauer <stepan at coresystems.de> for coresystems GmbH)
+ * Copyright (C) 2007 Advanced Micro Devices, Inc.
  *
  * 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
@@ -103,16 +104,41 @@
 	return 1;
 }
 
+
+/**
+ * Find the file in the LAR header, copy it to the desired location,
+ * and execute it. A location of 0xFFFFFFFF means execute in place (XIP).
+ */
 int run_file(struct mem_file *archive, char *filename, void *where)
 {
 	int (*v) (void);
+	struct mem_file result;
 
-	if (copy_file(archive, filename, where)) {
-		printk(BIOS_INFO, "LAR: Run file %s failed: No such file.\n",
-		       filename);
-		return 1;
+	if ((u32) where != 0xFFFFFFFF) {
+		if (copy_file(archive, filename, where)) {
+			printk(BIOS_INFO,
+			      "LAR: Run file %s failed: No such file.\n",
+			       filename);
+			return 1;
+		}
+	} else { /* XIP */
+		if (find_file(archive, filename, &result)) {
+			printk(BIOS_INFO,
+			       "LAR: Run file %s failed: No such file.\n",
+			       filename);
+			return 1;
+		}
+		where = result.start;
 	}
 
 	v = where;
 	return v();
 }
+
+/**
+ * Call run_file() to execute in place.
+ */
+int execute_in_place(struct mem_file *archive, char *filename)
+{
+	return run_file(archive, filename, (void *) 0xFFFFFFFF);
+}





More information about the coreboot mailing list