attached. I need an ack, we have discussed these already.
ron
Add a banner function and modify die() to be more JTAG-friendly.
Add a void * parameter to the LAR run functions; needed for some cases,
in particular CAR.
Signed-off-by: Ronald G. Minnich <[EMAIL PROTECTED]>
Index: lib/console.c
===================================================================
--- lib/console.c (revision 542)
+++ lib/console.c (working copy)
@@ -46,6 +46,18 @@
return i;
}
+/**
+ * Print a nice banner so we know what step we died on.
+ *
+ * @param level The printk level (e.g. BIOS_EMERG)
+ * @param s String to put in the middle of the banner
+ */
+
+void banner(int level, char *s)
+{
+ printk(level, "===========================%s===========================\n", s);
+}
+
void console_init(void)
{
static const char console_test[] =
@@ -59,9 +71,31 @@
printk(BIOS_INFO, console_test);
}
+/**
+ * Halt and loop due to a fatal error.
+ * There have been several iterations of this function.
+ * The first simply did a hlt(). Doing a hlt() can make jtag debugging
+ * very difficult as one can not break into a hlt instruction on some CPUs.
+ * Second was to do a console_tx_byte of a NULL character.
+ * A number of concerns were raised about doing this idea.
+ * Third idea was to do an inb from port 0x80, the POST port. That design
+ * makes us very CPU-specific.
+ * The fourth idea was just POSTING the same
+ * code over and over. That would erase the most recent POST code,
+ * hindering diagnosis.
+ *
+ * For now, for lack of a good alternative,
+ * we will continue to call console_tx_byte. We call with a NULL since
+ * it will clear any FIFOs in the path and won't clutter up the output,
+ * since NULL doesn't print a visible character on most terminal
+ * emulators.
+ *
+ * @param str A string to print for the error
+ *
+ */
void die(const char *str)
{
printk(BIOS_EMERG, str);
while (1)
- hlt();
+ console_tx_byte(0, (void *)0);
}
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;
}
--
linuxbios mailing list
[email protected]
http://www.linuxbios.org/mailman/listinfo/linuxbios