there is an bug(at least in my eyes). /main/grub/grub.c line 937: plen=strrchr(CMDLINE_TMP,'/') -(CMDLINE_TMP+7) +1; function strrchr returns the pointer which is (char*), right?
2010/3/26 repository service <[email protected]> > 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 <[email protected]> > > 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); > > -- > coreboot mailing list: [email protected] > http://www.coreboot.org/mailman/listinfo/coreboot >
-- coreboot mailing list: [email protected] http://www.coreboot.org/mailman/listinfo/coreboot

