[OpenBIOS] [commit] r706 - in trunk/openbios-devel: config/xml include/kernel kernel

repository service svn at openbios.org
Thu Mar 25 22:14:00 CET 2010


Author: mcayland
Date: Thu Mar 25 22:14:00 2010
New Revision: 706
URL: http://tracker.coreboot.org/trac/openbios/changeset/706

Log:
Revert the parts of the last commit which changed the exception function to use an exception pointer as it isn't really 
required. Update forthstrap to add a new -c option that when specified will direct the Forth kernel console output to a file 
and integrate this into the build system. By default, when a dictionary is built using a base dictionary then a new log file 
called <dict>-console.log will be generated to help debugging if the build fails.

Also update the exception handler in kernel/bootstrap.c so that it matches the entire range of error codes in 
forth/bootstrap/interpreter.fs.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>

Modified:
   trunk/openbios-devel/config/xml/dictionary.xsl
   trunk/openbios-devel/include/kernel/kernel.h
   trunk/openbios-devel/kernel/bootstrap.c
   trunk/openbios-devel/kernel/forth.c
   trunk/openbios-devel/kernel/internal.c

Modified: trunk/openbios-devel/config/xml/dictionary.xsl
==============================================================================
--- trunk/openbios-devel/config/xml/dictionary.xsl	Wed Mar 24 12:49:41 2010	(r705)
+++ trunk/openbios-devel/config/xml/dictionary.xsl	Thu Mar 25 22:14:00 2010	(r706)
@@ -129,6 +129,7 @@
      <xsl:if test="$init!=''">
       <xsl:text> -d $(ODIR)/</xsl:text><xsl:value-of select="$init"/><xsl:text>.dict</xsl:text>
      </xsl:if>
+     <xsl:text> -c $@-console.log</xsl:text>
      <xsl:text> $(</xsl:text>
      <xsl:value-of select="@name"/>
      <xsl:text>-DICTIONARY),"  GEN   $(TARGET_DIR)$@")

</xsl:text>

Modified: trunk/openbios-devel/include/kernel/kernel.h
==============================================================================
--- trunk/openbios-devel/include/kernel/kernel.h	Wed Mar 24 12:49:41 2010	(r705)
+++ trunk/openbios-devel/include/kernel/kernel.h	Thu Mar 25 22:14:00 2010	(r706)
@@ -34,12 +34,13 @@
 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 );
 extern void		encode_file( const char *str );
 extern int		get_inputbyte( void );
+extern void		put_outputbyte( int c );
 #endif
 
 #ifndef BOOTSTRAP

Modified: trunk/openbios-devel/kernel/bootstrap.c
==============================================================================
--- trunk/openbios-devel/kernel/bootstrap.c	Wed Mar 24 12:49:41 2010	(r705)
+++ trunk/openbios-devel/kernel/bootstrap.c	Thu Mar 25 22:14:00 2010	(r706)
@@ -54,6 +54,9 @@
 
 static char *srcbasedict;
 
+/* console variables */
+static FILE *console;
+
 #ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
 unsigned long base_address;
 #endif
@@ -487,14 +490,42 @@
 
 
 /*
- * Common Forth exception handler
+ * Forth exception handler
  */
 
-static void exception_common(cell no)
+void exception(cell no)
 {
+	printk("%s:%d: ", srcfilenames[cursrc - 1], srclines[cursrc - 1]);
+
+	/* See also forth/bootstrap/interpreter.fs */
 	switch (no) {
+	case -1:
+	case -2:
+		printk("Aborted.\n");
+		break;
+	case -3:
+		printk("Stack Overflow.\n");
+		break;
+	case -4:
+		printk("Stack Underflow.\n");
+		break;
+	case -5:
+		printk("Return Stack Overflow.\n");
+		break;
+	case -6:
+		printk("Return Stack Underflow.\n");
+		break;
 	case -19:
-		printk(" undefined word.\n");
+		printk("undefined word.\n");
+		break;
+	case -21:
+		printk("out of memory.\n");
+		break;
+	case -33:
+		printk("undefined method.\n");
+		break;
+	case -34:
+		printk("no such device.\n");
 		break;
 	default:
 		printk("error %" FMT_CELL_d " occured.\n", no);
@@ -504,30 +535,6 @@
 
 
 /*
- * 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
  */
 
@@ -548,9 +555,6 @@
 		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
 	 */
@@ -731,7 +735,7 @@
 
 		if (*test != 0) {
 			/* what is it?? */
-			printk("%s:%d - %s is not defined.\n\n", srcfilenames[cursrc - 1], srclines[cursrc - 1], tib);
+			printk("%s:%d: %s is not defined.\n\n", srcfilenames[cursrc - 1], srclines[cursrc - 1], tib);
 			errors++;
 #ifdef CONFIG_DEBUG_INTERPRETER
 			continue;
@@ -844,14 +848,27 @@
 	}
 
 	tmp = getc( srcfiles[cursrc-1] );
-	if (tmp != EOF)
+
+	/* Update current line number */
+	if (tmp == '\n') {
+		srclines[cursrc - 1]++;
+	}
+
+	if (tmp != EOF) {
 		return tmp;
+	}
 
 	fclose(srcfiles[--cursrc]);
 
 	return get_inputbyte();
 }
 
+void put_outputbyte( int c )
+{
+	if (console)
+		fputc(c, console);
+}
+
 /*
  *  segmentation fault handler. linux specific?
  */
@@ -951,7 +968,7 @@
 }
 
 
-static void run_dictionary(char *basedict)
+static void run_dictionary(char *basedict, char *confile)
 {
 	if(!basedict)
 		return;
@@ -978,11 +995,17 @@
 	if (verbose)
 		printk("Jumping to dictionary %s...\n", basedict);
 
-	/* Set up exception handler for this invocation (allows better error reporting) */
-	exception = exception_run_dictionary;
+	/* If a console file has been specified, open it */
+	if (confile)
+		console = fopen(confile, "w");
+
 	srcbasedict = basedict;	
 
 	enterforth((xt_t)PC);
+
+	/* Close the console file */
+	if (console)
+		fclose(console);
 }
 
 static void new_dictionary(const char *source)
@@ -1015,6 +1038,8 @@
 		"			use this dictionary as base\n"	\
 		"   -D|--target-dictionary output.dict\n"		\
 		"			write to output.dict\n"		\
+		"   -c|--console output.log\n"		\
+		"			write kernel console output to log file\n"	\
 		"   -s|--segfault	install segfault handler\n\n"
 #else
 #define USAGE   "Usage: %s [options] [dictionary file|source file]\n\n" \
@@ -1026,6 +1051,8 @@
 		"		use this dictionary as base\n"	\
 		"   -D output.dict\n"				\
 		"		write to output.dict\n"		\
+		"   -c output.log\n"		\
+		"		write kernel console output to log file\n"	\
 		"   -s		install segfault handler\n\n"
 
 #endif
@@ -1037,11 +1064,12 @@
 	unsigned char *ressources=NULL; /* All memory used by us */
 	char *dictname = NULL;
 	char *basedict = NULL;
+	char *consolefile = NULL;
 
 	unsigned char *bootstrapdict[2];
 	int c, cnt;
 
-	const char *optstring = "VvhsI:d:D:?";
+	const char *optstring = "VvhsI:d:D:c:?";
 
 	while (1) {
 #ifdef __GLIBC__
@@ -1054,6 +1082,7 @@
 			{"include", 1, NULL, 'I'},
 			{"source-dictionary", 1, NULL, 'd'},
 			{"target-dictionary", 1, NULL, 'D'},
+			{"console", 1, NULL, 'c'},
 		};
 
 		/*
@@ -1093,11 +1122,17 @@
 			if (!basedict) {
 				basedict = optarg;
 			}
+			break;
 		case 'D':
 			if(!dictname) {
 				dictname = optarg;
 			}
 			break;
+		case 'c':
+			if (!consolefile) {
+				consolefile = optarg;
+			}
+			break;
 		default:
 			return 1;
 		}
@@ -1176,7 +1211,7 @@
 			for (c=argc-1; c>=optind; c--)
 				include_file(argv[c]);
 
-			run_dictionary(basedict);
+			run_dictionary(basedict, consolefile);
 		}
 		if(errors)
 			break;

Modified: trunk/openbios-devel/kernel/forth.c
==============================================================================
--- trunk/openbios-devel/kernel/forth.c	Wed Mar 24 12:49:41 2010	(r705)
+++ trunk/openbios-devel/kernel/forth.c	Thu Mar 25 22:14:00 2010	(r706)
@@ -860,11 +860,11 @@
 
 static void emit(void)
 {
-#ifndef FCOMPILER
 	cell tmp = POP();
+#ifndef FCOMPILER
 	putchar(tmp);
 #else
-        (void) POP();
+       	put_outputbyte(tmp);
 #endif
 }
 

Modified: trunk/openbios-devel/kernel/internal.c
==============================================================================
--- trunk/openbios-devel/kernel/internal.c	Wed Mar 24 12:49:41 2010	(r705)
+++ trunk/openbios-devel/kernel/internal.c	Thu Mar 25 22:14:00 2010	(r706)
@@ -25,10 +25,6 @@
 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



More information about the OpenBIOS mailing list