j
: Next unread message k
: Previous unread message j a
: Jump to all threads
j l
: Jump to MailingList overview
Author: mcayland Date: Wed Mar 24 12:49:41 2010 New Revision: 705 URL: http://tracker.coreboot.org/trac/openbios/changeset/705
Log: Change the sysdebug exception() callback so that it is now a function pointer, rather than a function. This enables us to setup an appropriate exception handler for the task in hand; in particular it allows us to distinguish between an error that occurs when attempting to execute a base dictionary, and an error that occurs when interpreting source.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@siriusit.co.uk
Modified: trunk/openbios-devel/include/kernel/kernel.h trunk/openbios-devel/kernel/bootstrap.c trunk/openbios-devel/kernel/internal.c
Modified: trunk/openbios-devel/include/kernel/kernel.h ============================================================================== --- trunk/openbios-devel/include/kernel/kernel.h Wed Mar 24 11:28:51 2010 (r704) +++ trunk/openbios-devel/include/kernel/kernel.h Wed Mar 24 12:49:41 2010 (r705) @@ -34,7 +34,7 @@ extern void modules_init( void );
/* arch kernel hooks */ -extern void exception(cell no); +extern void (*exception)(cell no);
#ifdef FCOMPILER extern void include_file( const char *str );
Modified: trunk/openbios-devel/kernel/bootstrap.c ============================================================================== --- trunk/openbios-devel/kernel/bootstrap.c Wed Mar 24 11:28:51 2010 (r704) +++ trunk/openbios-devel/kernel/bootstrap.c Wed Mar 24 12:49:41 2010 (r705) @@ -52,6 +52,8 @@ static int srclines[MAX_SRC_FILES]; static unsigned int cursrc = 0;
+static char *srcbasedict; + #ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH unsigned long base_address; #endif @@ -485,6 +487,47 @@
/* + * Common Forth exception handler + */ + +static void exception_common(cell no) +{ + switch (no) { + case -19: + printk(" undefined word.\n"); + break; + default: + printk("error %" FMT_CELL_d " occured.\n", no); + } + exit(1); +} + + +/* + * Exception handler for run_dictionary() + */ + +static void exception_run_dictionary(cell no) +{ + printk("Error executing base dictionary %s: ", srcbasedict); + + exception_common(no); +} + + +/* + * Exception handler for interpret_source() + */ + +static void exception_interpret_source(cell no) +{ + printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]); + + exception_common(no); +} + + +/* * This is the C version of the forth interpreter */
@@ -505,6 +548,9 @@ exit(1); }
+ /* Set up exception handler for this invocation (allows better error reporting) */ + exception = exception_interpret_source; + /* FIXME: We should read this file at * once. No need to get it char by char */ @@ -862,20 +908,6 @@ PUSH(pointer2cell(memory) + MEMORY_SIZE-1); }
-void exception(cell no) -{ - printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]); - - switch (no) { - case -19: - printk(" undefined word.\n"); - break; - default: - printk("error %" FMT_CELL_d " occured.\n", no); - } - exit(1); -} -
void include_file( const char *name ) @@ -927,8 +959,12 @@ read_dictionary(basedict); PC = (ucell)findword("initialize");
- if (!PC) + if (!PC) { + if (verbose) { + printk("Unable to find initialize word in dictionary %s; ignoring\n", basedict); + } return; + }
if(!srcfiles[0]) { cursrc = 1; @@ -940,7 +976,11 @@
init_memory(); if (verbose) - printk("Jumping to dictionary..."); + printk("Jumping to dictionary %s...\n", basedict); + + /* Set up exception handler for this invocation (allows better error reporting) */ + exception = exception_run_dictionary; + srcbasedict = basedict;
enterforth((xt_t)PC); }
Modified: trunk/openbios-devel/kernel/internal.c ============================================================================== --- trunk/openbios-devel/kernel/internal.c Wed Mar 24 11:28:51 2010 (r704) +++ trunk/openbios-devel/kernel/internal.c Wed Mar 24 12:49:41 2010 (r705) @@ -25,6 +25,10 @@ ucell PC; volatile int interruptforth = 0;
+#ifdef FCOMPILER +void (*exception)(cell no) = NULL; +#endif + #define DEBUG_MODE_NONE 0 #define DEBUG_MODE_STEP 1 #define DEBUG_MODE_TRACE 2