[coreboot] [FILO] r114 - in trunk/filo: . include/grub main/grub

repository service svn at coreboot.org
Fri Mar 26 12:57:35 CET 2010


Author: stepan
Date: Fri Mar 26 12:57:34 2010
New Revision: 114
URL: http://tracker.coreboot.org/trac/filo/changeset/114

Log:
grub interface update
- add support for "default" (aka grubonce) support through cmos
- add dumpmem command
- add isolinux parser

Signed-off-by: Stefan Reinauer <stepan at coresystems.de>

Modified:
   trunk/filo/Config.in
   trunk/filo/include/grub/shared.h
   trunk/filo/main/grub/builtins.c
   trunk/filo/main/grub/grub.c

Modified: trunk/filo/Config.in
==============================================================================
--- trunk/filo/Config.in	Fri Mar 26 12:55:18 2010	(r113)
+++ trunk/filo/Config.in	Fri Mar 26 12:57:34 2010	(r114)
@@ -79,6 +79,14 @@
 	help
 	  Time in second before booting AUTOBOOT_FILE
 
+config ISOLINUX_PARSER
+	bool "Support for parsing isolinux.cfg config files"
+	default n
+	depends on USE_GRUB
+	help
+	  If you enable this function, FILO will be able to parse isolinux.cfg
+	  config files in addition to filo.lst/menu.lst files.
+
 endmenu
 
 menu "Drivers"

Modified: trunk/filo/include/grub/shared.h
==============================================================================
--- trunk/filo/include/grub/shared.h	Fri Mar 26 12:55:18 2010	(r113)
+++ trunk/filo/include/grub/shared.h	Fri Mar 26 12:57:34 2010	(r114)
@@ -132,7 +132,6 @@
   MAX_ERR_NUM
 } grub_error_t;
 
-extern int saved_entryno;
 extern char config_file[];
 
 /* GUI interface variables. */

Modified: trunk/filo/main/grub/builtins.c
==============================================================================
--- trunk/filo/main/grub/builtins.c	Fri Mar 26 12:55:18 2010	(r113)
+++ trunk/filo/main/grub/builtins.c	Fri Mar 26 12:57:34 2010	(r114)
@@ -2,7 +2,7 @@
  * This file is part of FILO.
  *
  *  Copyright (C) 1999,2000,2001,2002,2004  Free Software Foundation, Inc.
- *  Copyright (C) 2005-2008 coresystems GmbH
+ *  Copyright (C) 2005-2010 coresystems GmbH
  *
  * 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
@@ -20,6 +20,8 @@
 
 #include <libpayload-config.h>
 #include <libpayload.h>
+#include <getopt.h>
+
 #include <config.h>
 #include <fs.h>
 #include <lib.h>
@@ -45,7 +47,6 @@
 // other..
 unsigned long install_partition = 0x20000;
 unsigned long boot_drive = 0;
-int saved_entryno = 0;
 char config_file[128] = "\0";
 
 kernel_t kernel_type;
@@ -336,6 +337,15 @@
 /* default */
 static int default_func(char *arg, int flags)
 {
+	unsigned char buf[1];
+	if (get_option(buf, "boot_default"))
+		buf[0] = 0xff;
+	
+	if ((unsigned char)buf[0] != 0xff) {
+		printf("Default override by CMOS.\n");
+		return 0;
+	}
+
 	if (!safe_parse_maxint(&arg, &default_entry))
 		return 1;
 
@@ -354,7 +364,47 @@
 };
 
 #if CONFIG_DEVELOPER_TOOLS
-/* default */
+/* dumpmem */
+static int dumpmem_func(char *arg, int flags)
+{
+	int ret = string_to_args("dumpmem", arg);
+	unsigned int mem_base, mem_len;
+	void *i;
+
+	if(ret || (string_argc != 3)) {
+		errnum = ERR_BAD_ARGUMENT;
+		return 1;
+	}
+
+	// FIXME
+	if (!safe_parse_maxint(&string_argv[1], &mem_base))
+		return 1;
+	if (!safe_parse_maxint(&string_argv[2], &mem_len))
+		return 1;
+
+	grub_printf("Dumping memory at 0x%08x (0x%x bytes)\n",
+			mem_base, mem_len);
+
+	for (i=phys_to_virt(mem_base); i<phys_to_virt(mem_base + mem_len); i++) {
+		if (((unsigned long)i & 0x0f) == 0)
+			grub_printf("\n%08x:", i);
+		unsigned char val = *((unsigned char *)i);
+		grub_printf(" %02x", val);
+	}
+	grub_printf("\n");
+
+	return 0;
+}
+
+static struct builtin builtin_dumpmem = {
+	"dumpmem",
+	dumpmem_func,
+	BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
+	"dumpmem",
+	"Dump memory"
+};
+
+/* dumppm */
 static int dumppm_func(char *arg, int flags)
 {
 	u16 pmbase;
@@ -651,9 +701,16 @@
 	}
 
 	if (disk == -1) {
-		/* The user did specify a FILO name already */
-		// grub_printf("No drive.\n");
-		len = 0;	// just copy the drive name
+		int cnt = 0;
+		len = 0;
+		while ((arg[cnt] != 0) && (arg[cnt+1] != 0)) {
+			if (arg[cnt] == ':' && arg[cnt+1] == '/') {
+				/* The user did specify a FILO name already */
+				len = cnt;
+				break;
+			}
+			cnt++;
+		}
 	} else {
 		if (part == -1) {	// No partition
 			sprintf(devicename, "%s%c:", drivername, disk + 'a');
@@ -895,7 +952,7 @@
 
 			for (i=0; i<lspci_indent; i++)
 				grub_printf("|  ");
-			grub_printf("|- %x:%x.%x [%x:%x]\n", bus, slot, func,
+			grub_printf("|- %02x:%02x.%x [%04x:%04x]\n", bus, slot, func,
 					val & 0xffff, val >> 16);
 
 			/* If this is a bridge, then follow it. */
@@ -1704,6 +1761,7 @@
 	&builtin_configfile,
 	&builtin_default,
 #ifdef CONFIG_DEVELOPER_TOOLS
+	&builtin_dumpmem,
 	&builtin_dumppm,
 #endif
 #ifdef CONFIG_EXPERIMENTAL

Modified: trunk/filo/main/grub/grub.c
==============================================================================
--- trunk/filo/main/grub/grub.c	Fri Mar 26 12:55:18 2010	(r113)
+++ trunk/filo/main/grub/grub.c	Fri Mar 26 12:57:34 2010	(r114)
@@ -32,6 +32,9 @@
 char PASSWORD_BUF[PASSWORD_BUFLEN]; /* The buffer for the password.  */
 char DEFAULT_FILE_BUF[DEFAULT_FILE_BUFLEN]; /* THe buffer for the filename of "/boot/grub/default".  */
 char CMDLINE_BUF[CMDLINE_BUFLEN]; /* The buffer for the command-line.  */
+#ifdef CONFIG_ISOLINUX_PARSER
+char CMDLINE_TMP[CMDLINE_BUFLEN]; /* The buffer for the command-line.  */
+#endif
 char HISTORY_BUF[HISTORY_BUFLEN]; /* The history buffer for the command-line. */
 char COMPLETION_BUF[COMPLETION_BUFLEN]; /* The buffer for the completion.  */
 char UNIQUE_BUF[UNIQUE_BUFLEN]; /* The buffer for the unique string.  */
@@ -173,6 +176,12 @@
 				return;
 			if (probe_menulst(bootdevice, "/boot/menu.lst"))
 				return;
+#ifdef CONFIG_ISOLINUX_PARSER
+			if (probe_menulst(bootdevice, "/boot/isolinux/isolinux.cfg"))
+				return;
+			if (probe_menulst(bootdevice, "/isolinux/isolinux.cfg"))
+				return;
+#endif
 		}
 	} while (bootdevice);
 
@@ -871,6 +880,88 @@
 	return pos;
 }
 
+#ifdef CONFIG_ISOLINUX_PARSER
+static int rewrite_isolinux_config(void)
+{
+	/* TODO implement "default" */
+	/* TODO implement "timeout" */
+	if (!memcmp(CMDLINE_BUF, "LABEL ", 6) ||
+	    !memcmp(CMDLINE_BUF, "label ", 6)) {
+		strcpy(CMDLINE_TMP, "title ");
+		strlcat(CMDLINE_TMP, CMDLINE_BUF + 6, NEW_HEAPSIZE - 6);
+		memcpy(CMDLINE_BUF, CMDLINE_TMP, NEW_HEAPSIZE);
+	} else
+	if (!memcmp(CMDLINE_BUF, "KERNEL ", 7) ||
+	    !memcmp(CMDLINE_BUF, "kernel ", 7)) {
+		char *spos;
+		int pstart = 7, plen = 0;
+		strcpy(CMDLINE_TMP, "kernel ");
+
+		/* Find path of kernel */
+		if (strstr(CMDLINE_BUF, " /")) {
+			// Our kernel has an absolute path, so
+			// we only grab the device portion of the
+			// config file
+			
+			// (hd0,0)/configfile.cfg or hda1:/configfile.cfg
+			spos = strchr(config_file, '/');
+			if (!spos) {
+				// (hd0,0)configfile.cfg
+				spos = strchr(config_file, ')');
+				if (spos) spos++;
+			}
+			if (!spos) {
+				// hda1:configfile.cfg
+				spos = strchr(config_file, ':');
+				if (spos) spos++;
+			}
+		} else {
+			spos = strrchr(config_file, '/');
+			if (spos) spos++;
+		}
+
+		if (spos) {
+			char sback = spos[0];
+			spos[0]=0;
+			strlcat(CMDLINE_TMP, config_file, NEW_HEAPSIZE);
+			plen = strlen(CMDLINE_TMP) - pstart; // path name len
+			spos[0]=sback;
+		}
+
+		/* copy kernel name */
+		strlcat(CMDLINE_TMP, CMDLINE_BUF + 7, NEW_HEAPSIZE);
+
+		/* recalculate the new kernel path length,
+		 * we're going to need this for initrd
+		 */
+		plen = strrchr(CMDLINE_TMP, '/') - (CMDLINE_TMP + 7) + 1;
+
+		/* read APPEND line */
+		get_line_from_config(CMDLINE_BUF, NEW_HEAPSIZE, 1);
+		if (!memcmp(CMDLINE_BUF, "APPEND ", 7) ||
+		    !memcmp(CMDLINE_BUF, "append ", 7)) {
+			/* append APPEND line */
+			strlcat(CMDLINE_TMP, " ", NEW_HEAPSIZE);
+			strlcat(CMDLINE_TMP, CMDLINE_BUF + 7, NEW_HEAPSIZE);
+			spos = strstr(CMDLINE_TMP, "initrd=") + 7;
+			if (spos && plen) {
+				strncpy(spos, CMDLINE_TMP + pstart, plen);
+				spos[plen] = 0;
+				spos = strstr(CMDLINE_BUF, "initrd=") + 7;
+				strlcat(CMDLINE_TMP, spos, NEW_HEAPSIZE);
+			}
+		}
+
+		/* copy temp string to real string */
+		memcpy(CMDLINE_BUF, CMDLINE_TMP, NEW_HEAPSIZE);
+	} else {
+		// printf("skip: %s\n", CMDLINE_BUF);
+		return 1;
+	}
+	return 0;
+}
+#endif
+
 int is_opened = 0, is_preset = 0;
 
 /* This is the starting function in C.  */
@@ -912,6 +1003,7 @@
 
 	/* Never return.  */
 	for (;;) {
+		char buf[10];	/* This is good enough.  */
 		char *default_file = (char *) DEFAULT_FILE_BUF;
 		int i;
 
@@ -920,34 +1012,41 @@
 		/* Here load the configuration file.  */
 
 		/* Get a saved default entry if possible.  */
-		saved_entryno = 0;
 		*default_file = 0;
 
-		strncat(default_file, config_file, DEFAULT_FILE_BUFLEN);
-		for (i = strlen(default_file); i >= 0; i--)
-			if (default_file[i] == '/') {
-				i++;
-				break;
-			}
-		default_file[i] = 0;
-		strncat(default_file + i, "default", DEFAULT_FILE_BUFLEN - i);
-		if (file_open(default_file)) {
-			char buf[10];	/* This is good enough.  */
-			char *p = buf;
-			int len;
-
-			len = file_read(buf, sizeof(buf));
-			if (len > 0) {
-				buf[sizeof(buf) - 1] = 0;
-				safe_parse_maxint(&p, &saved_entryno);
-			}
+		/* Look into CMOS first */
+		if (!get_option(buf, "boot_default")) {
+			default_entry = ((unsigned char)buf[0] != 0xff) ?
+				(unsigned char)buf[0] : 0;
+		} else {
+			strncat(default_file, config_file, DEFAULT_FILE_BUFLEN);
+			for (i = strlen(default_file); i >= 0; i--)
+				if (default_file[i] == '/') {
+					i++;
+					break;
+				}
+			default_file[i] = 0;
+			strncat(default_file + i, "default", DEFAULT_FILE_BUFLEN - i);
+			if (file_open(default_file)) {
+				char *p = buf;
+				int len;
+
+				len = file_read(buf, sizeof(buf));
+				if (len > 0) {
+					buf[sizeof(buf) - 1] = 0;
+					safe_parse_maxint(&p, &default_entry);
+				}
 
-			file_close();
+				file_close();
+			}
 		}
 
 		errnum = ERR_NONE;
 
 		do {
+#ifdef CONFIG_ISOLINUX_PARSER
+			int isolinux_cfg = 0;
+#endif
 			/* STATE 0:  Before any title command.
 			   STATE 1:  In a title command.
 			   STATE >1: In a entry after a title command.  */
@@ -960,6 +1059,12 @@
 			if (!is_opened) {
 				is_opened = file_open(config_file);
 				errnum = ERR_NONE;
+#ifdef CONFIG_ISOLINUX_PARSER
+				if (strstr(config_file, "isolinux.cfg")) {
+					printf("detected isolinux.cfg\n");
+					isolinux_cfg = 1;
+				}
+#endif
 			}
 
 			if (!is_opened) {
@@ -975,6 +1080,12 @@
 			cmdline = (char *) CMDLINE_BUF;
 			while (get_line_from_config(cmdline, NEW_HEAPSIZE, !is_preset)) {
 				struct builtin *builtin;
+#ifdef CONFIG_ISOLINUX_PARSER
+				if (isolinux_cfg) {
+					if (rewrite_isolinux_config())
+						continue;
+				}
+#endif
 
 				/* Get the pointer to the builtin structure.  */
 				builtin = find_command(cmdline);




More information about the coreboot mailing list