:)
Marc

--
Marc Jones
Senior Software Engineer
(970) 226-9684 Office
mailto:[EMAIL PROTECTED]
http://www.amd.com/embeddedprocessors
Add execute in place to lar. Allows code to be run from the ROM.

Signed-off-by: Marc Jones <[EMAIL PROTECTED]>

Index: LinuxBIOSv3/include/lar.h
===================================================================
--- LinuxBIOSv3.orig/include/lar.h      2007-07-18 10:37:02.000000000 -0600
+++ LinuxBIOSv3/include/lar.h   2007-07-17 13:29:12.000000000 -0600
@@ -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 */
Index: LinuxBIOSv3/lib/lar.c
===================================================================
--- LinuxBIOSv3.orig/lib/lar.c  2007-07-18 10:37:12.000000000 -0600
+++ LinuxBIOSv3/lib/lar.c       2007-07-17 13:26:55.000000000 -0600
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2006-2007 coresystems GmbH
  * (Written by Stefan Reinauer <[EMAIL PROTECTED]> 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);
+}
\ No newline at end of file
-- 
linuxbios mailing list
linuxbios@linuxbios.org
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to