okay peter how's this?
ron
This change allows code to pass a single void * parameter to an XIP function.
It is needed for a proposed fix for the disable_car() changes.
Signed-off-by: Ronald G. Minnich <[EMAIL PROTECTED]>
Index: lib/lar.c
===================================================================
--- lib/lar.c (revision 542)
+++ lib/lar.c (working copy)
@@ -32,17 +32,19 @@
#endif
/**
- * run_address is passed the address of a function taking no parameters and
- * jumps to it, returning the result.
- * @param v the address to call as a function.
+ * run_address is passed the address of a function taking a single void * parameter
+ * jumps to it, returning the result. Note that there is no requirement that the called
+ * function ever return.
+ * @param f The function to call
+ * @param parameter An opaque parameter, passed as a void *, usually NULL
* returns value returned by the function.
*/
-int run_address(void *f)
+int run_address(void *f, void *parameter)
{
- int (*v) (void);
+ int (*v) (void *);
v = f;
- return v();
+ return v(parameter);
}
/**
@@ -123,7 +125,7 @@
result->entry = (void *)ntohl((u32)header->entry);
result->loadaddress = (void *)ntohl((u32)header->loadaddress);
printk(BIOS_SPEW,
- "start %p len %d reallen %d compression %x entry %p loadaddress %p\n",
+ "FOUND: start %p len %d reallen %d compression %x entry %p loadaddress %p\n",
result->start, result->len, result->reallen,
result->compression, result->entry, result->loadaddress);
return 0;
@@ -263,9 +265,10 @@
* Given a file name in the LAR , search for it, and execute it in place.
* @param archive A descriptor for current archive.
* @param filename filename to find
+ * @param parameter An opaque parameter, passed as a void *, usually NULL
* returns 0 on success, -1 otherwise
*/
-int execute_in_place(const struct mem_file *archive, const char *filename)
+int execute_in_place(const struct mem_file *archive, const char *filename, void *parameter)
{
struct mem_file result;
int ret;
@@ -283,7 +286,7 @@
}
where = result.start + (u32)result.entry;
printk(BIOS_SPEW, "Entry point is %p\n", where);
- ret = run_address(where);
+ ret = run_address(where, parameter);
printk(BIOS_SPEW, "run_file returns with %d\n", ret);
return ret;
}
Index: include/lar.h
===================================================================
--- include/lar.h (revision 542)
+++ include/lar.h (working copy)
@@ -85,8 +85,8 @@
int find_file(const struct mem_file *archive, const char *filename, struct mem_file *result);
int copy_file(const struct mem_file *archive, const char *filename, void *where);
int run_file(const struct mem_file *archive, const char *filename, void *where);
-int execute_in_place(const struct mem_file *archive, const char *filename);
-int run_address(void *f);
+int execute_in_place(const struct mem_file *archive, const char *filename, void *parameter);
+int run_address(void *f, void *parameter);
void *load_file(const struct mem_file *archive, const char *filename);
void *load_file_segments(const struct mem_file *archive, const char *filename);
#endif /* LAR_H */
--
linuxbios mailing list
[email protected]
http://www.linuxbios.org/mailman/listinfo/linuxbios