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@amd.com Acked-by: Ronald G. Minnich rminnich@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@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); +}