Author: stepan
Date: 2008-09-11 19:51:27 +0200 (Thu, 11 Sep 2008)
New Revision: 60
Added:
trunk/filo/main/grub/grub.c
Removed:
trunk/filo/fs/shared.h
trunk/filo/include/grub/config.h
trunk/filo/main/grub.c
trunk/filo/main/grub/asmstub.c
Modified:
trunk/filo/Config.in
trunk/filo/Makefile
trunk/filo/configs/defconfig
trunk/filo/drivers/newusb/usb.c
trunk/filo/fs/blockdev.c
trunk/filo/fs/filesys.h
trunk/filo/fs/fsys_aboot.c
trunk/filo/fs/fsys_cramfs.c
trunk/filo/fs/fsys_ext2fs.c
trunk/filo/fs/fsys_fat.c
trunk/filo/fs/fsys_iso9660.c
trunk/filo/fs/fsys_jfs.c
trunk/filo/fs/fsys_minix.c
trunk/filo/fs/fsys_reiserfs.c
trunk/filo/fs/fsys_squashfs.c
trunk/filo/fs/fsys_xfs.c
trunk/filo/fs/vfs.c
trunk/filo/include/fs.h
trunk/filo/include/grub/serial.h
trunk/filo/include/grub/shared.h
trunk/filo/main/Makefile.inc
trunk/filo/main/filo.c
trunk/filo/main/grub/Makefile.inc
trunk/filo/main/grub/builtins.c
trunk/filo/main/grub/char_io.c
trunk/filo/main/grub/serial.c
trunk/filo/main/grub/stage2.c
Log:
mostly cleanups to filo.
-?\195?\130?\194?\160drop a couple of obsolete files, macros, prototypes, etc
- add an experimental configfile command to the grub interface
- adapt usb driver to libpayload changes
- use LIBPAYLOAD_PREFIX
Modified: trunk/filo/Config.in
===================================================================
--- trunk/filo/Config.in 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/Config.in 2008-09-11 17:51:27 UTC (rev 60)
@@ -281,6 +281,7 @@
select DEBUG_SEGMENT
select DEBUG_SYS_INFO
select DEBUG_BLOCKDEV
+ select DEBUG_VFS
select DEBUG_FSYS_EXT2FS
select DEBUG_PCI
select DEBUG_VIA_SOUND
@@ -312,6 +313,10 @@
bool "DEBUG_BLOCKDEV"
default n
+config DEBUG_VFS
+ bool "DEBUG_VFS"
+ default n
+
config DEBUG_FSYS_EXT2FS
bool "DEBUG_FSYS_EXT2FS"
depends on FSYS_EXT2FS
Modified: trunk/filo/Makefile
===================================================================
--- trunk/filo/Makefile 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/Makefile 2008-09-11 17:51:27 UTC (rev 60)
@@ -69,13 +69,13 @@
include $(PLATFORM-y) $(BUILD-y)
-LIBPAYLOAD = libpayload/lib/libpayload.a
-INCPAYLOAD = libpayload/include
-INCPAYLOADDRIVERS = libpayload/drivers
+LIBPAYLOAD_PREFIX ?= libpayload
+LIBPAYLOAD = $(LIBPAYLOAD_PREFIX)/lib/libpayload.a
+INCPAYLOAD = $(LIBPAYLOAD_PREFIX)/include
LIBGCC = $(shell $(CC) -print-libgcc-file-name)
OBJS := $(patsubst %,$(obj)/%,$(TARGETS-y))
-INCLUDES := -I$(INCPAYLOAD) -I$(INCPAYLOADDRIVERS) -Iinclude -I$(ARCHDIR-y)/include -Ibuild
+INCLUDES := -I$(INCPAYLOAD) -Iinclude -I$(ARCHDIR-y)/include -Ibuild
INCLUDES += -I$(shell $(CC) -print-search-dirs | head -n 1 | cut -d' ' -f2)include
try-run= $(shell set -e; \
Modified: trunk/filo/configs/defconfig
===================================================================
--- trunk/filo/configs/defconfig 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/configs/defconfig 2008-09-11 17:51:27 UTC (rev 60)
@@ -22,7 +22,7 @@
CONFIG_IDE_DISK_POLL_DELAY=0
# CONFIG_SLOW_SATA is not set
# CONFIG_PCMCIA_CF is not set
-# CONFIG_USB_NEW_DISK is not set
+CONFIG_USB_NEW_DISK=y
# CONFIG_USB_DISK is not set
# CONFIG_FLASH_DISK is not set
CONFIG_SUPPORT_PCI=y
Modified: trunk/filo/drivers/newusb/usb.c
===================================================================
--- trunk/filo/drivers/newusb/usb.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/drivers/newusb/usb.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -16,8 +16,8 @@
*/
#include <fs.h>
-#include "usb/usb.h"
-#include "usb/usbmsc.h"
+#include <usb/usb.h>
+#include <usb/usbmsc.h>
static usbdev_t* devs[4]; // FIXME: only 4 devices
@@ -43,17 +43,14 @@
this would be a nice place, but the usb disk handling
must be more clever for that.
*/
+ usb_poll();
if (count >= drive) return drive;
return -1;
}
-int usb_new_read(int drive, sector_t sector, void *buffer)
+int usb_new_read(const int drive, const sector_t sector, const int size, void *buffer)
{
if (count < drive) return -1;
- /* FIXME: only one sector at a time :-(
- This must happen some layers further up
- */
- const int size = 1;
int result = -readwrite_blocks(devs[drive], sector, size, cbw_direction_data_in, buffer);
return result;
}
Modified: trunk/filo/fs/blockdev.c
===================================================================
--- trunk/filo/fs/blockdev.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/blockdev.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -1,6 +1,9 @@
/*
* This file is part of FILO.
*
+ * Copyright (C) 2003 SONE Takeshi <ts1(a)tsn.or.jp>
+ * Copyright (C) 2005-2008 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
* the Free Software Foundation; version 2 of the License.
@@ -37,312 +40,317 @@
static inline int has_pc_part_magic(unsigned char *sect)
{
- return sect[510]==0x55 && sect[511]==0xAA;
+ return sect[510] == 0x55 && sect[511] == 0xAA;
}
static inline int is_pc_extended_part(unsigned char type)
{
- return type==5 || type==0xf || type==0x85;
+ return type == 5 || type == 0xf || type == 0x85;
}
/* IBM-PC/MS-DOS style partitioning scheme */
static int open_pc_partition(int part, unsigned long *start_p,
- unsigned long *length_p)
+ unsigned long *length_p)
{
- /* Layout of PC partition table */
- struct pc_partition {
- unsigned char boot;
- unsigned char head;
- unsigned char sector;
- unsigned char cyl;
- unsigned char type;
- unsigned char e_head;
- unsigned char e_sector;
- unsigned char e_cyl;
- unsigned char start_sect[4]; /* unaligned little endian */
- unsigned char nr_sects[4]; /* ditto */
- } *p;
- unsigned char buf[DEV_SECTOR_SIZE];
+ /* Layout of PC partition table */
+ struct pc_partition {
+ unsigned char boot;
+ unsigned char head;
+ unsigned char sector;
+ unsigned char cyl;
+ unsigned char type;
+ unsigned char e_head;
+ unsigned char e_sector;
+ unsigned char e_cyl;
+ unsigned char start_sect[4]; /* unaligned little endian */
+ unsigned char nr_sects[4]; /* ditto */
+ } *p;
+ unsigned char buf[DEV_SECTOR_SIZE];
- /* PC partition probe */
- if (!devread(0, 0, sizeof(buf), buf)) {
- debug("device read failed\n");
- return 0;
- }
- if (!has_pc_part_magic(buf)) {
- debug("pc partition magic number not found\n");
- //debug_hexdump(buf, DEV_SECTOR_SIZE);
- return PARTITION_UNKNOWN;
- }
- p = (struct pc_partition *) (buf + 0x1be);
- if (part < 4) {
- /* Primary partition */
- p += part;
- if (p->type==0 || is_pc_extended_part(p->type)) {
- printf("Partition %d does not exist\n", part+1);
- return 0;
+ /* PC partition probe */
+ if (!devread(0, 0, sizeof(buf), buf)) {
+ debug("device read failed.\n");
+ return 0;
}
- *start_p = cpu_to_le32(*(u32 *)(p->start_sect));
- *length_p = cpu_to_le32(*(u32 *)(p->nr_sects));
- return 1;
- } else {
- /* Extended partition */
- int i;
- int cur_part;
- unsigned long ext_start, cur_table;
- /* Search for the extended partition
- * which contains logical partitions */
- for (i = 0; i < 4; i++) {
- if (is_pc_extended_part(p[i].type))
- break;
+ if (!has_pc_part_magic(buf)) {
+ debug("PC partition table magic number not found.\n");
+ //debug_hexdump(buf, DEV_SECTOR_SIZE);
+ return PARTITION_UNKNOWN;
}
- if (i >= 4) {
- printf("Extended partition not found\n");
- return 0;
- }
- debug("Extended partition at %d\n", i+1);
- /* Visit each logical partition labels */
- ext_start = cpu_to_le32(*(u32*)(p[i].start_sect));
- cur_table = ext_start;
- cur_part = 4;
- for (;;) {
- debug("cur_part=%d at %lu\n", cur_part, cur_table);
- if (!devread(cur_table, 0, sizeof(buf), buf))
- return 0;
- if (!has_pc_part_magic(buf)) {
- debug("no magic\n");
- break;
- }
-
- p = (struct pc_partition *) (buf + 0x1be);
- /* First entry is the logical partition */
- if (cur_part == part) {
- if (p->type==0) {
- printf("Partition %d is empty\n", part+1);
- return 0;
+ p = (struct pc_partition *) (buf + 0x1be);
+ if (part < 4) {
+ /* Primary partition */
+ p += part;
+ if (p->type == 0 || is_pc_extended_part(p->type)) {
+ printf("Partition %d does not exist.\n", part + 1);
+ return 0;
}
- *start_p = cur_table + cpu_to_le32(*(u32*)(p->start_sect));
- *length_p = cpu_to_le32(*(u32*)(p->nr_sects));
+ *start_p = cpu_to_le32(*(u32 *) (p->start_sect));
+ *length_p = cpu_to_le32(*(u32 *) (p->nr_sects));
return 1;
- }
- /* Second entry is link to next partition */
- if (!is_pc_extended_part(p[1].type)) {
- debug("no link\n");
- break;
- }
- cur_table = ext_start + cpu_to_le32(*(u32*)(p[1].start_sect));
+ } else {
+ /* Extended partition */
+ int i;
+ int cur_part;
+ unsigned long ext_start, cur_table;
+ /* Search for the extended partition
+ * which contains logical partitions */
+ for (i = 0; i < 4; i++) {
+ if (is_pc_extended_part(p[i].type))
+ break;
+ }
+ if (i >= 4) {
+ printf("No extended partition found.\n");
+ return 0;
+ }
+ debug("Extended partition at %d.\n", i + 1);
+ /* Visit each logical partition labels */
+ ext_start = cpu_to_le32(*(u32 *) (p[i].start_sect));
+ cur_table = ext_start;
+ cur_part = 4;
+ for (;;) {
+ debug("cur_part=%d at %lu\n", cur_part, cur_table);
+ if (!devread(cur_table, 0, sizeof(buf), buf))
+ return 0;
+ if (!has_pc_part_magic(buf)) {
+ debug("PC partition table magic number not found.\n");
+ break;
+ }
- cur_part++;
+ p = (struct pc_partition *) (buf + 0x1be);
+ /* First entry is the logical partition */
+ if (cur_part == part) {
+ if (p->type == 0) {
+ printf("Partition %d is empty.\n", part + 1);
+ return 0;
+ }
+ *start_p = cur_table + cpu_to_le32(*(u32 *) (p->start_sect));
+ *length_p = cpu_to_le32(*(u32 *) (p->nr_sects));
+ return 1;
+ }
+ /* Second entry is link to next partition */
+ if (!is_pc_extended_part(p[1].type)) {
+ debug("no link\n");
+ break;
+ }
+ cur_table = ext_start + cpu_to_le32(*(u32 *) (p[1].start_sect));
+
+ cur_part++;
+ }
+ printf("Logical partition %d does not exist.\n", part + 1);
+ return 0;
}
- printf("Logical partition %d not exist\n", part+1);
- return 0;
- }
}
static void flush_cache(void)
{
- int i;
- for (i = 0; i < NUM_CACHE; i++)
- cache_sect[i] = (unsigned long) -1;
+ int i;
+ for (i = 0; i < NUM_CACHE; i++)
+ cache_sect[i] = (unsigned long) -1;
}
static int parse_device_name(const char *name, int *type, int *drive,
- int *part, uint64_t *offset, uint64_t *length)
+ int *part, uint64_t * offset,
+ uint64_t * length)
{
- *offset = *length = 0;
+ *offset = *length = 0;
- if (memcmp(name, "hd", 2) == 0) {
- *type = DISK_IDE;
- name += 2;
- if (*name < 'a' || *name > 'z') {
- printf("Invalid drive\n");
- return 0;
+ if (memcmp(name, "hd", 2) == 0) {
+ *type = DISK_IDE;
+ name += 2;
+ if (*name < 'a' || *name > 'z') {
+ printf("Invalid drive\n");
+ return 0;
+ }
+ *drive = *name - 'a';
+ name++;
+ } else if (memcmp(name, "ud", 2) == 0) {
+ *type = DISK_NEW_USB;
+ name += 2;
+ if (*name < 'a' || *name > 'z') {
+ printf("Invalid drive\n");
+ return 0;
+ }
+ *drive = *name - 'a';
+ name++;
+ } else if (memcmp(name, "flash", 5) == 0) {
+ *type = DISK_FLASH;
+ name += 5;
+ if (*name < 'a' || *name > 'z') {
+ printf("Invalid flash chip\n");
+ return 0;
+ }
+ *drive = *name - 'a';
+ name++;
+ } else if (memcmp(name, "mem", 3) == 0) {
+ *type = DISK_MEM;
+ name += 3;
+ *drive = 0;
+ } else {
+ printf("Unknown device type\n");
+ return 0;
}
- *drive = *name - 'a';
- name++;
- } else if (memcmp(name, "ud", 2) == 0) {
- *type = DISK_NEW_USB;
- name += 2;
- if (*name < 'a' || *name > 'z') {
- printf("Invalid drive\n");
- return 0;
- }
- *drive = *name - 'a';
- name++;
- }
- else if (memcmp(name, "flash", 5) == 0) {
- *type = DISK_FLASH;
- name += 5;
- if (*name < 'a' || *name > 'z') {
- printf("Invalid flash chip\n");
- return 0;
- }
- *drive = *name - 'a';
- name++;
- } else if (memcmp(name, "mem", 3) == 0) {
- *type = DISK_MEM;
- name += 3;
- *drive = 0;
- } else {
- printf("Unknown device type\n");
- return 0;
- }
- *part = (int) simple_strtoull(name, (char **)&name, 0);
+ *part = (int) simple_strtoull(name, (char **) &name, 0);
- if (*name == '@') {
- name++;
- *offset = strtoull_with_suffix(name, (char **)&name, 0);
- if (*name == ',')
- *length = strtoull_with_suffix(name+1, (char **)&name, 0);
- debug("offset=%#Lx length=%#Lx\n", *offset, *length);
- }
+ if (*name == '@') {
+ name++;
+ *offset = strtoull_with_suffix(name, (char **) &name, 0);
+ if (*name == ',')
+ *length =
+ strtoull_with_suffix(name + 1, (char **) &name,
+ 0);
+ debug("offset=%#Lx length=%#Lx\n", *offset, *length);
+ }
- if (*name != '\0') {
- printf("Can't parse device name\n");
- return 0;
- }
+ if (*name != '\0') {
+ printf("Can't parse device name\n");
+ return 0;
+ }
- return 1;
+ return 1;
}
int devopen(const char *name, int *reopen)
{
- int type, drive, part;
- uint64_t offset, length;
- uint32_t disk_size = 0;
+ int type, drive, part;
+ uint64_t offset, length;
+ uint32_t disk_size = 0;
- /* Don't re-open the device that's already open */
- if (strcmp(name, dev_name) == 0 && dev_type != -1 ) {
- debug("already open\n");
- *reopen = 1;
- return 1;
- }
- *reopen = 0;
+ /* Don't re-open the device that's already open */
+ if (strcmp(name, dev_name) == 0 && dev_type != -1) {
+ debug("already open\n");
+ *reopen = 1;
+ return 1;
+ }
+ *reopen = 0;
- if (!parse_device_name(name, &type, &drive, &part, &offset, &length)) {
- debug("failed to parse device name: %s\n", name);
- return 0;
- }
-
- /* If we have another dev open, close it first! */
- if (dev_type != type && dev_type != -1)
- devclose();
+ if (!parse_device_name
+ (name, &type, &drive, &part, &offset, &length)) {
+ debug("failed to parse device name: %s\n", name);
+ return 0;
+ }
- /* Do simple sanity check first */
- if (offset & DEV_SECTOR_MASK) {
- printf("Device offset must be multiple of %d\n", DEV_SECTOR_SIZE);
- return 0;
- }
- if (length & DEV_SECTOR_MASK) {
- printf("WARNING: length is rounded up to multiple of %d\n", DEV_SECTOR_SIZE);
- length = (length + DEV_SECTOR_MASK) & ~DEV_SECTOR_MASK;
- }
+ /* If we have another dev open, close it first! */
+ if (dev_type != type && dev_type != -1)
+ devclose();
- switch (type) {
+ /* Do simple sanity check first */
+ if (offset & DEV_SECTOR_MASK) {
+ printf("Device offset must be a multiple of %d.\n", DEV_SECTOR_SIZE);
+ return 0;
+ }
+ if (length & DEV_SECTOR_MASK) {
+ printf("WARNING: length is rounded up to multiple of %d.\n", DEV_SECTOR_SIZE);
+ length = (length + DEV_SECTOR_MASK) & ~DEV_SECTOR_MASK;
+ }
+
+ switch (type) {
#ifdef CONFIG_IDE_DISK
- case DISK_IDE:
- if (ide_probe(drive) != 0) {
- debug("failed to open ide\n");
- return 0;
- }
- disk_size = (uint32_t) -1; /* FIXME */
- break;
+ case DISK_IDE:
+ if (ide_probe(drive) != 0) {
+ debug("Failed to open IDE.\n");
+ return 0;
+ }
+ disk_size = (uint32_t) - 1; /* FIXME */
+ break;
#endif
-
#ifdef CONFIG_USB_NEW_DISK
- case DISK_NEW_USB:
- if (usb_new_probe(drive) != 0) {
- debug("failed to open usb\n");
- return 0;
- }
- disk_size = (uint32_t) -1; /* FIXME */
- break;
+ case DISK_NEW_USB:
+ if (usb_new_probe(drive) != 0) {
+ debug("Failed to open USB.\n");
+ return 0;
+ }
+ disk_size = (uint32_t) - 1; /* FIXME */
+ break;
#endif
#ifdef CONFIG_USB_DISK
- case DISK_USB:
- if (usb_probe(drive) != 0) {
- debug("failed to open usb\n");
- return 0;
- }
- disk_size = (uint32_t) -1; /* FIXME */
- break;
+ case DISK_USB:
+ if (usb_probe(drive) != 0) {
+ debug("Failed to open USB.\n");
+ return 0;
+ }
+ disk_size = (uint32_t) - 1; /* FIXME */
+ break;
#endif
#ifdef CONFIG_FLASH_DISK
case DISK_FLASH:
- if(flash_probe(drive) != 0)
- {
- debug("failed to open flash\n");
+ if (flash_probe(drive) != 0) {
+ debug("Failed to open FLASH.\n");
return 0;
}
- disk_size = (uint32_t) -1; /* FIXME */
+ disk_size = (uint32_t) - 1; /* FIXME */
break;
#endif
case DISK_MEM:
- disk_size = 1 << (32 - DEV_SECTOR_BITS); /* 4GB/512-byte */
- break;
+ disk_size = 1 << (32 - DEV_SECTOR_BITS); /* 4GB/512-byte */
+ break;
default:
- printf("Unknown device type %d\n", type);
- return 0;
- }
+ printf("Unknown device type %d.\n", type);
+ return 0;
+ }
- if (dev_type != type || dev_drive != drive)
- flush_cache();
+ if (dev_type != type || dev_drive != drive)
+ flush_cache();
- /* start with whole disk */
- dev_type = type;
- dev_drive = drive;
- part_start = 0;
- part_length = disk_size;
- using_devsize = 1;
+ /* start with whole disk */
+ dev_type = type;
+ dev_drive = drive;
+ part_start = 0;
+ part_length = disk_size;
+ using_devsize = 1;
- if (part != 0) {
- /* partition is specified */
- int ret;
- ret = open_pc_partition(part - 1, &part_start, &part_length);
- if (ret == PARTITION_UNKNOWN) {
- ret = open_eltorito_image(part - 1, &part_start, &part_length);
- if (ret == PARTITION_UNKNOWN) {
- printf("Unrecognized partitioning scheme\n");
- return 0;
- }
+ if (part != 0) {
+ /* partition is specified */
+ int ret;
+ ret =
+ open_pc_partition(part - 1, &part_start, &part_length);
+ if (ret == PARTITION_UNKNOWN) {
+ ret =
+ open_eltorito_image(part - 1, &part_start,
+ &part_length);
+ if (ret == PARTITION_UNKNOWN) {
+ printf("Unrecognized partitioning scheme.\n");
+ return 0;
+ }
+ }
+ if (ret == 0) {
+ debug("Can't open partition %d.\n", part);
+ return 0;
+ }
+
+ debug("Partition %d start %lu length %lu\n", part,
+ part_start, part_length);
}
- if (ret == 0) {
- debug("can't open partition %d\n", part);
- return 0;
- }
- debug("Partition %d start %lu length %lu\n", part,
- part_start, part_length);
- }
-
- if (offset) {
- if (offset >= (uint64_t) part_length << DEV_SECTOR_BITS) {
- printf("Device offset is too high\n");
- return 0;
+ if (offset) {
+ if (offset >= (uint64_t) part_length << DEV_SECTOR_BITS) {
+ printf("Device offset is too high.\n");
+ return 0;
+ }
+ part_start += offset >> DEV_SECTOR_BITS;
+ part_length -= offset >> DEV_SECTOR_BITS;
+ debug("after offset: start %lu, length %lu\n", part_start,
+ part_length);
}
- part_start += offset >> DEV_SECTOR_BITS;
- part_length -= offset >> DEV_SECTOR_BITS;
- debug("after offset: start %lu, length %lu\n", part_start, part_length);
- }
- if (length) {
- if (length > (uint64_t) part_length << DEV_SECTOR_BITS) {
- printf("Specified length exceeds the size of device\n");
- return 0;
+ if (length) {
+ if (length > (uint64_t) part_length << DEV_SECTOR_BITS) {
+ printf ("Specified length exceeds the size of device.\n");
+ return 0;
+ }
+ part_length = length >> DEV_SECTOR_BITS;
+ debug("after length: length %lu\n", part_length);
+ using_devsize = 0;
}
- part_length = length >> DEV_SECTOR_BITS;
- debug("after length: length %lu\n", part_length);
- using_devsize = 0;
- }
- strncpy(dev_name, name, sizeof(dev_name)-1);
+ strncpy(dev_name, name, sizeof(dev_name) - 1);
- return 1;
+ return 1;
}
void devclose(void)
@@ -352,102 +360,107 @@
if (dev_type == DISK_FLASH)
NAND_close();
#endif
-
+
dev_type = -1;
}
/* Read a sector from opened device with simple/stupid buffer cache */
static void *read_sector(unsigned long sector)
{
- unsigned int hash;
- void *buf;
+ unsigned int hash;
+ void *buf;
- /* If reading memory, just return the memory as the buffer */
- if (dev_type == DISK_MEM) {
- unsigned long phys = sector << DEV_SECTOR_BITS;
- //debug("mem: %#lx\n", phys);
- return phys_to_virt(phys);
- }
+ /* If reading memory, just return the memory as the buffer */
+ if (dev_type == DISK_MEM) {
+ unsigned long phys = sector << DEV_SECTOR_BITS;
+ //debug("mem: %#lx\n", phys);
+ return phys_to_virt(phys);
+ }
- /* Search in the cache */
- hash = sector % NUM_CACHE;
- buf = buf_cache[hash];
- if (cache_sect[hash] != sector) {
- cache_sect[hash] = (unsigned long) -1;
- switch (dev_type) {
+ /* Search in the cache */
+ hash = sector % NUM_CACHE;
+ buf = buf_cache[hash];
+ if (cache_sect[hash] != sector) {
+ cache_sect[hash] = (unsigned long) -1;
+ switch (dev_type) {
#ifdef CONFIG_IDE_DISK
- case DISK_IDE:
- if (ide_read(dev_drive, sector, buf) != 0)
- goto readerr;
- break;
+ case DISK_IDE:
+ if (ide_read(dev_drive, sector, buf) != 0)
+ goto readerr;
+ break;
#endif
#ifdef CONFIG_USB_NEW_DISK
- case DISK_NEW_USB:
- if (usb_new_read(dev_drive, sector, buf) != 0)
- goto readerr;
- break;
+ case DISK_NEW_USB:
+ {
+ int count = (NUM_CACHE-hash>8)?8:(NUM_CACHE-hash);
+ if (usb_new_read(dev_drive, sector, count, buf) != 0)
+ goto readerr;
+ while (--count>0) {
+ cache_sect[hash+count] = sector + count;
+ }
+ break;
+ }
#endif
#ifdef CONFIG_USB_DISK
- case DISK_USB:
- if (usb_read(dev_drive, sector, buf) != 0)
- goto readerr;
- break;
+ case DISK_USB:
+ if (usb_read(dev_drive, sector, buf) != 0)
+ goto readerr;
+ break;
#endif
#ifdef CONFIG_FLASH_DISK
- case DISK_FLASH:
- if (flash_read(dev_drive, sector, buf) != 0)
- return 0;
- break;
+ case DISK_FLASH:
+ if (flash_read(dev_drive, sector, buf) != 0)
+ return 0;
+ break;
#endif
- default:
- printf("read_sector: device not open\n");
- return 0;
+ default:
+ printf("read_sector: device not open\n");
+ return 0;
+ }
+ cache_sect[hash] = sector;
}
- cache_sect[hash] = sector;
- }
- return buf;
+ return buf;
-readerr:
- printf("Disk read error dev=%d drive=%d sector=%lu\n",
- dev_type, dev_drive, sector);
- dev_name[0] = '\0'; /* force re-open the device next time */
- return 0;
+ readerr:
+ printf("Disk read error dev=%d drive=%d sector=%lu\n",
+ dev_type, dev_drive, sector);
+ dev_name[0] = '\0'; /* force re-open the device next time */
+ return 0;
}
int devread(unsigned long sector, unsigned long byte_offset,
- unsigned long byte_len, void *buf)
+ unsigned long byte_len, void *buf)
{
- char *sector_buffer;
- char *dest = buf;
- unsigned long len;
+ char *sector_buffer;
+ char *dest = buf;
+ unsigned long len;
- sector += byte_offset >> 9;
- byte_offset &= 0x1ff;
+ sector += byte_offset >> 9;
+ byte_offset &= 0x1ff;
- if (sector + ((byte_len + 0x1ff) >> 9) > part_length) {
- printf("Attempt to read out of device/partition\n");
- debug("sector=%lu part_length=%lu byte_len=%lu\n",
- sector, part_length, byte_len);
- return 0;
- }
+ if (sector + ((byte_len + 0x1ff) >> 9) > part_length) {
+ printf("Attempt to read beyond device/partition.\n");
+ debug("sector=%lu part_length=%lu byte_len=%lu\n",
+ sector, part_length, byte_len);
+ return 0;
+ }
- while (byte_len > 0) {
- sector_buffer = read_sector(part_start + sector);
- if (!sector_buffer) {
- debug("read sector failed\n");
- return 0;
+ while (byte_len > 0) {
+ sector_buffer = read_sector(part_start + sector);
+ if (!sector_buffer) {
+ debug("Couldn't read sector.\n");
+ return 0;
+ }
+ len = 512 - byte_offset;
+ if (len > byte_len)
+ len = byte_len;
+ memcpy(dest, sector_buffer + byte_offset, len);
+ sector++;
+ byte_offset = 0;
+ byte_len -= len;
+ dest += len;
}
- len = 512 - byte_offset;
- if (len > byte_len)
- len = byte_len;
- memcpy(dest, sector_buffer + byte_offset, len);
- sector++;
- byte_offset = 0;
- byte_len -= len;
- dest += len;
- }
- return 1;
+ return 1;
}
-
Modified: trunk/filo/fs/filesys.h
===================================================================
--- trunk/filo/fs/filesys.h 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/filesys.h 2008-09-11 17:51:27 UTC (rev 60)
@@ -23,9 +23,6 @@
#include <config.h>
#include <fs.h>
-/* This disables some portion of code */
-#define STAGE1_5 1
-
#if defined(__i386__)
/*
* ffz = Find First Zero in word. Undefined if no zero exists,
@@ -153,7 +150,8 @@
#define FSYS_BUFLEN 0x8000
extern char FSYS_BUF[FSYS_BUFLEN];
-#define print_possibilities 0
+extern int print_possibilities;
+void print_a_completion (char *filename);
#define SECTOR_SIZE 512
#define SECTOR_BITS 9
Modified: trunk/filo/fs/fsys_aboot.c
===================================================================
--- trunk/filo/fs/fsys_aboot.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_aboot.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -26,7 +26,6 @@
#include <fs.h>
#include "artecboot.h"
-#include "shared.h"
#include "filesys.h"
#define DEBUG_THIS CONFIG_DEBUG_ARTECBOOT
Modified: trunk/filo/fs/fsys_cramfs.c
===================================================================
--- trunk/filo/fs/fsys_cramfs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_cramfs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -20,7 +20,6 @@
/* fsys_minix.c used as a skeleton, cramfs code in kernel used as
* documentation and some code */
-#include "shared.h"
#include "filesys.h"
#include "mini_inflate.h"
@@ -30,16 +29,6 @@
# define debug_cramfs(str, args...) do {;} while(0)
#endif
-#if 0
-/* include/asm-i386/type.h */
-typedef __signed__ char s8;
-typedef unsigned char u8;
-typedef __signed__ short s16;
-typedef unsigned short u16;
-typedef __signed__ int s32;
-typedef unsigned int u32;
-#endif
-
#define BLOCK_SIZE SECTOR_SIZE
#define CRAMFS_MAGIC 0x28cd3d45 /* some random number */
Modified: trunk/filo/fs/fsys_ext2fs.c
===================================================================
--- trunk/filo/fs/fsys_ext2fs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_ext2fs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -17,7 +17,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "shared.h"
#include "filesys.h"
static int mapblock1, mapblock2;
Modified: trunk/filo/fs/fsys_fat.c
===================================================================
--- trunk/filo/fs/fsys_fat.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_fat.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -17,7 +17,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "shared.h"
#include "filesys.h"
#include "fat.h"
Modified: trunk/filo/fs/fsys_iso9660.c
===================================================================
--- trunk/filo/fs/fsys_iso9660.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_iso9660.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -34,7 +34,6 @@
* 2003-10 by SONE Takeshi
*/
-#include "shared.h"
#include "filesys.h"
#include "iso9660.h"
#define DEBUG_THIS CONFIG_DEBUG_ISO9660
@@ -175,8 +174,7 @@
if (rr_ptr.rr->version != 1)
{
#ifndef STAGE1_5
- if (debug)
- printf(
+ debug(
"Non-supported version (%d) RockRidge chunk "
"`%c%c'\n", rr_ptr.rr->version,
rr_ptr.rr->signature & 0xFF,
@@ -272,7 +270,7 @@
print_possibilities = -print_possibilities;
memcpy(NAME_BUF, name, name_len);
NAME_BUF[name_len] = '\0';
- print_a_completion (NAME_BUF);
+ print_a_completion ((char *)NAME_BUF);
#endif
}
}
Modified: trunk/filo/fs/fsys_jfs.c
===================================================================
--- trunk/filo/fs/fsys_jfs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_jfs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -18,7 +18,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "shared.h"
#include "filesys.h"
#include "jfs.h"
Modified: trunk/filo/fs/fsys_minix.c
===================================================================
--- trunk/filo/fs/fsys_minix.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_minix.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -23,7 +23,6 @@
mkfs.minix -c DEVICE
*/
-#include "shared.h"
#include "filesys.h"
#define DEBUG_MINIX CONFIG_DEBUG_MINIX
Modified: trunk/filo/fs/fsys_reiserfs.c
===================================================================
--- trunk/filo/fs/fsys_reiserfs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_reiserfs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -18,7 +18,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "shared.h"
#include "filesys.h"
#undef REISERDEBUG
Modified: trunk/filo/fs/fsys_squashfs.c
===================================================================
--- trunk/filo/fs/fsys_squashfs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_squashfs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -18,7 +18,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "shared.h"
#include "filesys.h"
#include "squashfs_fs.h"
#include "squashfs_zlib.h"
Modified: trunk/filo/fs/fsys_xfs.c
===================================================================
--- trunk/filo/fs/fsys_xfs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/fsys_xfs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -18,7 +18,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "shared.h"
#include "filesys.h"
#include "xfs.h"
Deleted: trunk/filo/fs/shared.h
===================================================================
--- trunk/filo/fs/shared.h 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/shared.h 2008-09-11 17:51:27 UTC (rev 60)
@@ -1 +0,0 @@
-/* Sorry, nothing is shared here ;) Just for GRUB compatibility. */
Modified: trunk/filo/fs/vfs.c
===================================================================
--- trunk/filo/fs/vfs.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/fs/vfs.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -1,6 +1,9 @@
/*
* This file is part of FILO.
*
+ * Copyright (C) 2003 SONE Takeshi <ts1(a)tsn.or.jp>
+ * Copyright (C) 2005-2008 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
* the Free Software Foundation; version 2 of the License.
@@ -32,190 +35,201 @@
void (*disk_read_func) (int, int, int);
char FSYS_BUF[FSYS_BUFLEN];
int fsmax;
+int print_possibilities = 0;
struct fsys_entry {
- char *name;
- int (*mount_func) (void);
- int (*read_func) (char *buf, int len);
- int (*dir_func) (char *dirname);
- void (*close_func) (void);
- int (*embed_func) (int *start_sector, int needed_sectors);
+ char *name;
+ int (*mount_func) (void);
+ int (*read_func) (char *buf, int len);
+ int (*dir_func) (char *dirname);
+ void (*close_func) (void);
+ int (*embed_func) (int *start_sector, int needed_sectors);
};
struct fsys_entry fsys_table[] = {
# ifdef CONFIG_FSYS_FAT
- {"FAT filesystem", fat_mount, fat_read, fat_dir, 0, 0},
+ {"FAT filesystem", fat_mount, fat_read, fat_dir, 0, 0},
# endif
# ifdef CONFIG_FSYS_EXT2FS
- {"EXT2 filesystem", ext2fs_mount, ext2fs_read, ext2fs_dir, 0, 0},
+ {"EXT2 filesystem", ext2fs_mount, ext2fs_read, ext2fs_dir, 0, 0},
# endif
# ifdef CONFIG_FSYS_MINIX
- {"MINIX filesystem", minix_mount, minix_read, minix_dir, 0, 0},
+ {"MINIX filesystem", minix_mount, minix_read, minix_dir, 0, 0},
# endif
# ifdef CONFIG_FSYS_REISERFS
- {"REISERFS filesystem", reiserfs_mount, reiserfs_read, reiserfs_dir, 0,
- reiserfs_embed},
+ {"REISERFS filesystem", reiserfs_mount, reiserfs_read, reiserfs_dir, 0, reiserfs_embed},
# endif
# ifdef CONFIG_FSYS_JFS
- {"JFS filesystem", jfs_mount, jfs_read, jfs_dir, 0, jfs_embed},
+ {"JFS filesystem", jfs_mount, jfs_read, jfs_dir, 0, jfs_embed},
# endif
# ifdef CONFIG_FSYS_XFS
- {"XFS filesystem", xfs_mount, xfs_read, xfs_dir, 0, 0},
+ {"XFS filesystem", xfs_mount, xfs_read, xfs_dir, 0, 0},
# endif
# ifdef CONFIG_FSYS_ISO9660
- {"ISO9660 filesystem", iso9660_mount, iso9660_read, iso9660_dir, 0, 0},
+ {"ISO9660 filesystem", iso9660_mount, iso9660_read, iso9660_dir, 0, 0},
# endif
# ifdef CONFIG_FSYS_CRAMFS
- {"CRAM filesystem", cramfs_mount, cramfs_read, cramfs_dir, 0, 0},
+ {"CRAM filesystem", cramfs_mount, cramfs_read, cramfs_dir, 0, 0},
# endif
# ifdef CONFIG_FSYS_SQUASHFS
- {"SQUASH filesystem", squashfs_mount, squashfs_read, squashfs_dir, 0, 0},
+ {"SQUASH filesystem", squashfs_mount, squashfs_read, squashfs_dir, 0, 0},
# endif
# ifdef CONFIG_ARTEC_BOOT
- {"Artecboot Virtual Filesystem", aboot_mount, aboot_read, aboot_dir, 0, 0},
+ {"Artecboot Virtual Filesystem", aboot_mount, aboot_read, aboot_dir, 0, 0},
# endif
-
};
/* NULLFS is used to read images from raw device */
static int nullfs_dir(char *name)
{
- uint64_t dev_size;
+ uint64_t dev_size;
- if (name) {
- debug("can't have a named file\n");
- return 0;
- }
+ if (name) {
+ debug("Can't have a named file.\n");
+ return 0;
+ }
- dev_size = (uint64_t) part_length << 9;
- /* GRUB code doesn't like 2GB or bigger files */
- if (dev_size > 0x7fffffff)
- dev_size = 0x7fffffff;
- filemax = dev_size;
- return 1;
+ dev_size = (uint64_t) part_length << 9;
+
+ /* GRUB code doesn't like 2GB or bigger files */
+ if (dev_size > 0x7fffffff) {
+ dev_size = 0x7fffffff;
+ }
+
+ filemax = dev_size;
+
+ return 1;
}
static int nullfs_read(char *buf, int len)
{
- if (devread(filepos>>9, filepos&0x1ff, len, buf)) {
- filepos += len;
- return len;
- } else
- return 0;
+ if (devread(filepos >> 9, filepos & 0x1ff, len, buf)) {
+ filepos += len;
+ return len;
+ } else {
+ return 0;
+ }
}
-static struct fsys_entry nullfs =
- {"nullfs", 0, nullfs_read, nullfs_dir, 0, 0};
+static struct fsys_entry nullfs = { "nullfs", 0, nullfs_read, nullfs_dir, 0, 0 };
static struct fsys_entry *fsys;
int mount_fs(void)
{
- int i;
+ int i;
- for (i = 0; i < sizeof(fsys_table)/sizeof(fsys_table[0]); i++) {
- if (fsys_table[i].mount_func()) {
- fsys = &fsys_table[i];
- printf("Mounted %s\n", fsys->name);
- return 1;
+ for (i = 0; i < sizeof(fsys_table) / sizeof(fsys_table[0]); i++) {
+ if (!fsys_table[i].mount_func())
+ continue;
+
+ fsys = &fsys_table[i];
+ printf("Mounted %s\n", fsys->name);
+ return 1;
}
- }
- fsys = 0;
- printf("Unknown filesystem type\n");
- return 0;
+ fsys = 0;
+
+ printf("Unknown filesystem type.\n");
+ return 0;
}
int file_open(const char *filename)
{
- char *dev = 0;
- const char *path;
- int len;
- int retval = 0;
- int reopen;
+ char *dev = 0;
+ const char *path;
+ int len;
+ int retval = 0;
+ int reopen;
- path = strchr(filename, ':');
- if (path) {
- len = path - filename;
- path++;
- dev = malloc(len + 1);
- memcpy(dev, filename, len);
- dev[len] = '\0';
- } else {
- /* No colon is given. Is this device or filename? */
- if (filename[0] == '/') {
- /* Anything starts with '/' must be a filename */
- dev = 0;
- path = filename;
+ path = strchr(filename, ':');
+ if (path) {
+ len = path - filename;
+ path++;
+ dev = malloc(len + 1);
+ memcpy(dev, filename, len);
+ dev[len] = '\0';
} else {
- dev = strdup(filename);
- path = 0;
+ /* No colon is given. Is this device or filename? */
+ if (filename[0] == '/') {
+ /* Anything starts with '/' must be a filename */
+ dev = 0;
+ path = filename;
+ } else {
+ dev = strdup(filename);
+ path = 0;
+ }
}
- }
- debug("dev=%s, path=%s\n", dev, path);
+ debug("dev=%s, path=%s\n", dev, path);
- if (dev && dev[0]) {
- if (!devopen(dev, &reopen)) {
- fsys = 0;
- goto out;
+ if (dev && dev[0]) {
+ if (!devopen(dev, &reopen)) {
+ fsys = 0;
+ goto out;
+ }
+ if (!reopen)
+ fsys = 0;
}
- if (!reopen)
- fsys = 0;
- }
- if (path) {
- if (!fsys || fsys==&nullfs) {
- if (!mount_fs())
+ if (path) {
+ if (!fsys || fsys == &nullfs) {
+ if (!mount_fs())
+ goto out;
+ }
+ using_devsize = 0;
+ if (!path[0]) {
+ printf("No filename is given.\n");
+ goto out;
+ }
+ } else {
+ fsys = &nullfs;
+ }
+
+ filepos = 0;
+ errnum = 0;
+ if (!fsys->dir_func((char *) path)) {
+ printf("File not found.\n");
goto out;
}
- using_devsize = 0;
- if (!path[0]) {
- printf("No filename is given\n");
- goto out;
- }
- } else
- fsys = &nullfs;
+ retval = 1;
- filepos = 0;
- errnum = 0;
- if (!fsys->dir_func((char *) path)) {
- printf("File not found\n");
- goto out;
- }
- retval = 1;
out:
- if (dev)
- free(dev);
- return retval;
+ if (dev)
+ free(dev);
+
+ return retval;
}
int file_read(void *buf, unsigned long len)
{
- if (filepos < 0 || filepos > filemax)
- filepos = filemax;
- if (len < 0 || len > filemax-filepos)
- len = filemax - filepos;
- errnum = 0;
+ if (filepos < 0 || filepos > filemax)
+ filepos = filemax;
+ if (len < 0 || len > filemax - filepos)
+ len = filemax - filepos;
+
+ errnum = 0;
+
debug("reading %d bytes, offset 0x%x\n", len, filepos);
return fsys->read_func(buf, len);
}
-int file_seek(unsigned long offset)
+unsigned long file_seek(unsigned long offset)
{
debug("seeking to 0x%x\n", offset);
- filepos = offset;
- return filepos;
+ filepos = offset;
+ return filepos;
}
unsigned long file_size(void)
{
- return filemax;
+ return filemax;
}
void file_set_size(unsigned long size)
{
debug("updating file size to %d bytes\n", size);
- filemax = size;
+
+ filemax = size;
using_devsize = 0;
}
@@ -223,4 +237,3 @@
{
devclose();
}
-
Modified: trunk/filo/include/fs.h
===================================================================
--- trunk/filo/include/fs.h 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/include/fs.h 2008-09-11 17:51:27 UTC (rev 60)
@@ -39,7 +39,7 @@
#ifdef CONFIG_USB_NEW_DISK
int usb_new_probe(int drive);
-int usb_new_read(int drive, sector_t sector, void *buffer);
+int usb_new_read(const int drive, const sector_t sector, const int size, void *buffer);
#endif
#ifdef CONFIG_FLASH_DISK
@@ -63,7 +63,7 @@
int file_open(const char *filename);
int file_read(void *buf, unsigned long len);
-int file_seek(unsigned long offset);
+unsigned long file_seek(unsigned long offset);
unsigned long file_size(void);
void file_set_size(unsigned long size);
void file_close(void);
Deleted: trunk/filo/include/grub/config.h
===================================================================
--- trunk/filo/include/grub/config.h 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/include/grub/config.h 2008-09-11 17:51:27 UTC (rev 60)
@@ -1,107 +0,0 @@
-/* config.h. Generated by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define if an absolute indirect call/jump must NOT be prefixed with `*' */
-/* #undef ABSOLUTE_WITHOUT_ASTERISK */
-
-/* Define it to \"addr32\" or \"addr32;\" to make GAS happy */
-#define ADDR32 addr32
-
-/* Define if you don't want to pass the mem= option to Linux */
-#define AUTO_LINUX_MEM_OPT 1
-
-/* Define it to \"data32\" or \"data32;\" to make GAS happy */
-#define DATA32 data32
-
-/* Define if C symbols get an underscore after compilation */
-/* #undef HAVE_ASM_USCORE */
-
-/* Define to 1 if you have the <curses.h> header file. */
-#define HAVE_CURSES_H 1
-
-/* Define if edata is defined */
-#define HAVE_EDATA_SYMBOL 1
-
-/* Define if end is defined */
-#define HAVE_END_SYMBOL 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define if you have a curses library */
-#define HAVE_LIBCURSES 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <ncurses/curses.h> header file. */
-/* #undef HAVE_NCURSES_CURSES_H */
-
-/* Define to 1 if you have the <ncurses.h> header file. */
-#define HAVE_NCURSES_H 1
-
-/* Define if opendisk() in -lutil can be used */
-/* #undef HAVE_OPENDISK */
-
-/* Define if start is defined */
-/* #undef HAVE_START_SYMBOL */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define if _edata is defined */
-#define HAVE_USCORE_EDATA_SYMBOL 1
-
-/* Define if end is defined */
-#define HAVE_USCORE_END_SYMBOL 1
-
-/* Define if _start is defined */
-#define HAVE_USCORE_START_SYMBOL 1
-
-/* Define if __bss_start is defined */
-#define HAVE_USCORE_USCORE_BSS_START_SYMBOL 1
-
-/* Name of package */
-#define PACKAGE "grub"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bug-grub(a)gnu.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "GRUB"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GRUB 0.97"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "grub"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "0.97"
-
-/* Define if there is user specified preset menu string */
-/* #undef PRESET_MENU_STRING */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Version number of package */
-#define VERSION "0.97"
Modified: trunk/filo/include/grub/serial.h
===================================================================
--- trunk/filo/include/grub/serial.h 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/include/grub/serial.h 2008-09-11 17:51:27 UTC (rev 60)
@@ -84,10 +84,4 @@
int serial_hw_init (unsigned short port, unsigned int speed,
int word_len, int parity, int stop_bit_len);
-#ifdef GRUB_UTIL
-/* Set the file name of a serial device (or a pty device). This is a
- function specific to the grub shell. */
-void serial_set_device (const char *device);
-#endif /* GRUB_UTIL */
-
#endif /* ! GRUB_SERIAL_HEADER */
Modified: trunk/filo/include/grub/shared.h
===================================================================
--- trunk/filo/include/grub/shared.h 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/include/grub/shared.h 2008-09-11 17:51:27 UTC (rev 60)
@@ -25,24 +25,11 @@
#ifndef GRUB_SHARED_HEADER
#define GRUB_SHARED_HEADER 1
-#include <grub/config.h>
+void grub_main(void);
-/* Add an underscore to a C symbol in assembler code if needed. */
-#ifdef HAVE_ASM_USCORE
-# define EXT_C(sym) _ ## sym
-#else
-# define EXT_C(sym) sym
-#endif
-
/* Maybe redirect memory requests through grub_scratch_mem. */
-#ifdef GRUB_UTIL
-extern char *grub_scratch_mem;
-# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem)
-# define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4)
-#else
# define RAW_ADDR(x) (x)
# define RAW_SEG(x) (x)
-#endif
/*
* Integer sizes
@@ -215,33 +202,7 @@
#define STAGE2_ID_ISO9660_STAGE1_5 9
#define STAGE2_ID_UFS2_STAGE1_5 10
-#ifndef STAGE1_5
# define STAGE2_ID STAGE2_ID_STAGE2
-#else
-# if defined(FSYS_FFS)
-# define STAGE2_ID STAGE2_ID_FFS_STAGE1_5
-# elif defined(FSYS_EXT2FS)
-# define STAGE2_ID STAGE2_ID_E2FS_STAGE1_5
-# elif defined(FSYS_FAT)
-# define STAGE2_ID STAGE2_ID_FAT_STAGE1_5
-# elif defined(FSYS_MINIX)
-# define STAGE2_ID STAGE2_ID_MINIX_STAGE1_5
-# elif defined(FSYS_REISERFS)
-# define STAGE2_ID STAGE2_ID_REISERFS_STAGE1_5
-# elif defined(FSYS_VSTAFS)
-# define STAGE2_ID STAGE2_ID_VSTAFS_STAGE1_5
-# elif defined(FSYS_JFS)
-# define STAGE2_ID STAGE2_ID_JFS_STAGE1_5
-# elif defined(FSYS_XFS)
-# define STAGE2_ID STAGE2_ID_XFS_STAGE1_5
-# elif defined(FSYS_ISO9660)
-# define STAGE2_ID STAGE2_ID_ISO9660_STAGE1_5
-# elif defined(FSYS_UFS2)
-# define STAGE2_ID STAGE2_ID_UFS2_STAGE1_5
-# else
-# error "unknown Stage 2"
-# endif
-#endif
/*
* defines for use when switching between real and protected mode
@@ -257,17 +218,6 @@
#define PROTSTACKINIT (FSYS_BUF - 0x10)
-/*
- * Assembly code defines
- *
- * "EXT_C" is assumed to be defined in the Makefile by the configure
- * command.
- */
-
-#define ENTRY(x) .globl EXT_C(x) ; EXT_C(x):
-#define VARIABLE(x) ENTRY(x)
-
-
#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
#define K_STATUS 0x64 /* keyboard status */
#define K_CMD 0x64 /* keybd ctlr command (write-only) */
@@ -284,7 +234,10 @@
/* Codes for getchar. */
#define ASCII_CHAR(x) ((x) & 0xFF)
-#if !defined(GRUB_UTIL) || !defined(HAVE_LIBCURSES)
+
+#warning "CURSES keys fundamentally different from libpayload's"
+// And that's why we can't just do
+// # include <curses.h>
# define KEY_LEFT 0x4B00
# define KEY_RIGHT 0x4D00
# define KEY_UP 0x4800
@@ -298,13 +251,6 @@
# define KEY_PPAGE 0x4900
# define A_NORMAL 0x7
# define A_REVERSE 0x70
-#elif defined(HAVE_NCURSES_CURSES_H)
-# include <ncurses/curses.h>
-#elif defined(HAVE_NCURSES_H)
-# include <ncurses.h>
-#elif defined(HAVE_CURSES_H)
-# include <curses.h>
-#endif
/* In old BSD curses, A_NORMAL and A_REVERSE are not defined, so we
define them here if they are undefined. */
@@ -358,21 +304,8 @@
/* Remap some libc-API-compatible function names so that we prevent
circularararity. */
#ifndef WITHOUT_LIBC_STUBS
-//#define memmove grub_memmove
-//#define memcpy grub_memmove /* we don't need a separate memcpy */
-//#define memset grub_memset
-//#define isspace grub_isspace
-// #define printf grub_printf
-//#define sprintf grub_sprintf
#undef putchar
#define putchar grub_putchar
-//#define strncat grub_strncat
-//#define strstr grub_strstr
-//#define memcmp grub_memcmp
-//#define strcmp grub_strcmp
-//#define tolower grub_tolower
-//#define strlen grub_strlen
-//#define strcpy grub_strcpy
/* Instead, for FILO we map the grub_ functions to
* "normal" functions:
@@ -583,32 +516,6 @@
extern char *linux_data_tmp_addr;
extern char *linux_data_real_addr;
-#ifdef GRUB_UTIL
-/* If not using config file, this variable is set to zero,
- otherwise non-zero. */
-extern int use_config_file;
-/* If using the preset menu, this variable is set to non-zero,
- otherwise zero. */
-extern int use_preset_menu;
-/* If not using curses, this variable is set to zero, otherwise non-zero. */
-extern int use_curses;
-/* The flag for verbose messages. */
-extern int verbose;
-/* The flag for read-only. */
-extern int read_only;
-/* The number of floppies to be probed. */
-extern int floppy_disks;
-/* The map between BIOS drives and UNIX device file names. */
-extern char **device_map;
-/* The filename which stores the information about a device map. */
-extern char *device_map_file;
-/* The array of geometries. */
-extern struct geometry *disks;
-/* Assign DRIVE to a device name DEVICE. */
-extern void assign_device_name (int drive, const char *device);
-#endif
-
-#ifndef STAGE1_5
/* GUI interface variables. */
# define MAX_FALLBACK_ENTRIES 8
extern int fallback_entries[MAX_FALLBACK_ENTRIES];
@@ -634,7 +541,6 @@
extern int max_lines;
extern int count_lines;
extern int use_pager;
-#endif
#ifndef NO_DECOMPRESSION
extern int no_decompression;
@@ -645,11 +551,6 @@
extern void (*disk_read_hook) (int, int, int);
extern void (*disk_read_func) (int, int, int);
-#ifndef STAGE1_5
-/* The flag for debug mode. */
-extern int debug;
-#endif /* STAGE1_5 */
-
extern unsigned long current_drive;
extern unsigned long current_partition;
@@ -695,10 +596,8 @@
extern unsigned long saved_drive;
extern unsigned long saved_partition;
extern unsigned long cdrom_drive;
-#ifndef STAGE1_5
extern unsigned long saved_mem_upper;
extern unsigned long extended_memory;
-#endif
/*
* Error variables.
@@ -833,7 +732,6 @@
void stop_floppy (void);
/* Command-line interface functions. */
-#ifndef STAGE1_5
/* The flags for the builtins. */
#define BUILTIN_CMDLINE 0x1 /* Run in the command-line. */
@@ -891,44 +789,10 @@
#define CMDLINE_EDIT_MODE 0x2
void print_cmdline_message (int type);
-#endif
/* C library replacement functions with identical semantics. */
void grub_printf (const char *format,...);
-//int grub_sprintf (char *buffer, const char *format, ...);
-//int grub_tolower (int c);
-//int grub_isspace (int c);
-//int grub_strncat (char *s1, const char *s2, int n);
-//void *grub_memmove (void *to, const void *from, int len);
-//void *grub_memset (void *start, int c, int len);
-//int grub_strncat (char *s1, const char *s2, int n);
-//char *grub_strstr (const char *s1, const char *s2);
-//int grub_memcmp (const char *s1, const char *s2, int n);
-//int grub_strcmp (const char *s1, const char *s2);
-//int grub_strlen (const char *str);
-//char *grub_strcpy (char *dest, const char *src);
-#ifndef GRUB_UTIL
-typedef unsigned long grub_jmp_buf[6];
-#else
-/* In the grub shell, use the libc jmp_buf instead. */
-# include <setjmp.h>
-# define grub_jmp_buf jmp_buf
-#endif
-
-#ifdef GRUB_UTIL
-# define grub_setjmp setjmp
-# define grub_longjmp longjmp
-#else /* ! GRUB_UTIL */
-int grub_setjmp (grub_jmp_buf env);
-void grub_longjmp (grub_jmp_buf env, int val);
-#endif /* ! GRUB_UTIL */
-
-/* The environment for restarting Stage 2. */
-extern grub_jmp_buf restart_env;
-/* The environment for restarting the command-line interface. */
-extern grub_jmp_buf restart_cmdline_env;
-
/* misc */
void init_page (void);
void print_error (void);
@@ -948,11 +812,6 @@
int gunzip_read (char *buf, int len);
#endif /* NO_DECOMPRESSION */
-int rawread (int drive, int sector, int byte_offset, int byte_len, char *buf);
-int devread (int sector, int byte_offset, int byte_len, char *buf);
-int rawwrite (int drive, int sector, char *buf);
-int devwrite (int sector, int sector_len, char *buf);
-
/* Parse a device string and initialize the global parameters. */
char *set_device (char *device);
int open_device (void);
@@ -970,22 +829,6 @@
/* Set or clear the current root partition's hidden flag. */
int set_partition_hidden_flag (int hidden);
-#if 0
-/* Open a file or directory on the active device, using GRUB's
- internal filesystem support. */
-int grub_open (char *filename);
-
-/* Read LEN bytes into BUF from the file that was opened with
- GRUB_OPEN. If LEN is -1, read all the remaining data in the file. */
-int grub_read (char *buf, int len);
-
-/* Reposition a file offset. */
-int grub_seek (int offset);
-
-/* Close a file. */
-void grub_close (void);
-#endif
-
/* List the contents of the directory that was opened with GRUB_OPEN,
printing all completions. */
int dir (char *dirname);
@@ -1002,7 +845,6 @@
/* Copies the current partition data to the desired address. */
void copy_current_part_entry (char *buf);
-#ifndef STAGE1_5
void bsd_boot (kernel_t type, int bootdev, char *arg)
__attribute__ ((noreturn));
@@ -1017,7 +859,6 @@
int load_initrd (char *initrd);
int check_password(char *entered, char* expected, password_t type);
-#endif
void init_bios_info (void);
Modified: trunk/filo/main/Makefile.inc
===================================================================
--- trunk/filo/main/Makefile.inc 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/Makefile.inc 2008-09-11 17:51:27 UTC (rev 60)
@@ -18,5 +18,4 @@
TARGETS-y += main/filo.o main/elfload.o main/elfnote.o main/ipchecksum.o main/strtox.o
TARGETS-$(CONFIG_SUPPORT_SOUND) += main/sound.o
-TARGETS-$(CONFIG_USE_GRUB) += main/grub.o
Modified: trunk/filo/main/filo.c
===================================================================
--- trunk/filo/main/filo.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/filo.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -187,4 +187,9 @@
return 0;
}
+void print_a_completion (char *name)
+{
+ // Nothing yet.
+}
+
#endif /* CONFIG_USE_GRUB */
Modified: trunk/filo/main/grub/Makefile.inc
===================================================================
--- trunk/filo/main/grub/Makefile.inc 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub/Makefile.inc 2008-09-11 17:51:27 UTC (rev 60)
@@ -21,6 +21,7 @@
TARGETS-$(CONFIG_USE_GRUB) += main/grub/cmdline.o main/grub/char_io.o
TARGETS-$(CONFIG_USE_GRUB) += main/grub/grubcons.o main/grub/serial.o
TARGETS-$(CONFIG_USE_GRUB) += main/grub/terminfo.o main/grub/tparm.o
-TARGETS-$(CONFIG_USE_GRUB) += main/grub/asmstub.o main/grub/completions.o
+TARGETS-$(CONFIG_USE_GRUB) += main/grub/completions.o
+TARGETS-$(CONFIG_USE_GRUB) += main/grub/grub.o
TARGETS-$(CONFIG_USE_MD5_PASSWORDS) += main/grub/md5.o
Deleted: trunk/filo/main/grub/asmstub.c
===================================================================
--- trunk/filo/main/grub/asmstub.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub/asmstub.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -1,24 +0,0 @@
-/*
- * This file is part of FILO.
- *
- * 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
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-unsigned long install_partition = 0x20000;
-unsigned long boot_drive = 0;
-int saved_entryno = 0;
-char version_string[] = "1.0";
-char config_file[128] = "\0";
-
Modified: trunk/filo/main/grub/builtins.c
===================================================================
--- trunk/filo/main/grub/builtins.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub/builtins.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -21,6 +21,7 @@
#include <libpayload.h>
#include <config.h>
+#include <fs.h>
#include <grub/shared.h>
#include <grub/term.h>
#include <grub/terminfo.h>
@@ -41,8 +42,12 @@
unsigned long saved_drive;
unsigned long saved_partition;
unsigned long saved_mem_upper;
+// other..
+unsigned long install_partition = 0x20000;
+unsigned long boot_drive = 0;
+int saved_entryno = 0;
+char config_file[128] = "\0";
-
kernel_t kernel_type;
/* The fallback entry. */
@@ -257,6 +262,44 @@
" \"blink-\" to FG if you want a blinking foreground color."
};
+/* configfile */
+static int
+configfile_func (char *arg, int flags)
+{
+ char *new_config = config_file;
+
+ /* Check if the file ARG is present. */
+ if (! grub_open (arg))
+ return 1;
+
+ grub_close ();
+
+ /* Copy ARG to CONFIG_FILE. */
+ while ((*new_config++ = *arg++) != 0)
+ ;
+
+ /* Force to load the configuration file. */
+ // use_config_file = 1;
+
+ /* Make sure that the user will not be authoritative. */
+ auth = 0;
+
+ /* Restart cmain. */
+ grub_main();
+
+ /* Never reach here. */
+ return 0;
+}
+
+static struct builtin builtin_configfile =
+{
+ "configfile",
+ configfile_func,
+ BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
+ "configfile FILE",
+ "Load FILE as the configuration file."
+};
+
/* default */
static int
default_func (char *arg, int flags)
@@ -952,22 +995,6 @@
return 1;
}
}
-# ifdef GRUB_UTIL
- /* In the grub shell, don't use any port number but open a tty
- device instead. */
- else if (grub_memcmp (arg, "--device=", sizeof ("--device=") - 1) == 0)
- {
- char *p = arg + sizeof ("--device=") - 1;
- char dev[256]; /* XXX */
- char *q = dev;
-
- while (*p && ! grub_isspace (*p))
- *q++ = *p++;
-
- *q = 0;
- serial_set_device (dev);
- }
-# endif /* GRUB_UTIL */
else
break;
@@ -1337,6 +1364,7 @@
{
&builtin_boot,
&builtin_color,
+ &builtin_configfile,
&builtin_default,
#ifdef CONFIG_EXPERIMENTAL
&builtin_find,
Modified: trunk/filo/main/grub/char_io.c
===================================================================
--- trunk/filo/main/grub/char_io.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub/char_io.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -67,7 +67,6 @@
-#ifndef STAGE1_5
struct term_entry term_table[] =
{
#if CONFIG_VGA_CONSOLE == 1 && CONFIG_PC_KEYBOARD ==1
@@ -115,18 +114,12 @@
int max_lines = 24;
int count_lines = -1;
int use_pager = 1;
-#endif
void
print_error (void)
{
if (errnum > ERR_NONE && errnum < MAX_ERR_NUM)
-#ifndef STAGE1_5
- /* grub_printf("\7\n %s\n", err_list[errnum]); */
grub_printf ("\nError %u: %s\n", errnum, err_list[errnum]);
-#else /* STAGE1_5 */
- grub_printf ("Error %u\n", errnum);
-#endif /* STAGE1_5 */
}
char *
@@ -135,7 +128,6 @@
unsigned long num = *((&c) + 1), mult = 10;
char *ptr = buf;
-#ifndef STAGE1_5
if (c == 'x' || c == 'X')
mult = 16;
@@ -145,7 +137,6 @@
*(ptr++) = '-';
buf++;
}
-#endif
do
{
@@ -193,17 +184,14 @@
else
switch (c = *(format++))
{
-#ifndef STAGE1_5
case 'd':
case 'x':
case 'X':
-#endif
case 'u':
*convert_to_ascii (str, c, *((unsigned long *) dataptr++)) = 0;
grub_putstr (str);
break;
-#ifndef STAGE1_5
case 'c':
grub_putchar ((*(dataptr++)) & 0xff);
break;
@@ -211,12 +199,10 @@
case 's':
grub_putstr ((char *) *(dataptr++));
break;
-#endif
}
}
}
-#ifndef STAGE1_5
void
init_page (void)
{
@@ -882,7 +868,6 @@
return 1;
}
-#endif /* STAGE1_5 */
/* Wait for a keypress and return its code. */
int
Added: trunk/filo/main/grub/grub.c
===================================================================
--- trunk/filo/main/grub/grub.c (rev 0)
+++ trunk/filo/main/grub/grub.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -0,0 +1,116 @@
+/*
+ * This file is part of FILO.
+ *
+ * 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
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <libpayload.h>
+#include <config.h>
+#include <lib.h>
+#include <fs.h>
+#include <arch/timer.h>
+
+extern char config_file[];
+
+#define ENTER '\r'
+#define ESCAPE '\x1b'
+
+#ifndef CONFIG_MENULST_TIMEOUT
+#define CONFIG_MENULST_TIMEOUT 0
+#endif
+#if !CONFIG_MENULST_TIMEOUT
+#define menulst_delay() 0 /* success */
+#endif
+
+#if CONFIG_MENULST_TIMEOUT
+static inline int menulst_delay(void)
+{
+ u64 timeout;
+ int sec, tmp;
+ char key;
+
+ key = 0;
+
+#ifdef CONFIG_MENULST_FILE
+ printf("Press <Enter> for default menu.lst (%s), or <Esc> for prompt... ",
+ CONFIG_MENULST_FILE);
+#else
+ printf("Press <Enter> for the FILO shell or <ESC> to enter a menu.lst path...");
+#endif
+ for (sec = CONFIG_MENULST_TIMEOUT; sec>0 && key==0; sec--) {
+ printf("%d", sec);
+ timeout = currticks() + TICKS_PER_SEC;
+ while (currticks() < timeout) {
+ if (havechar()) {
+ key = getchar();
+ if (key==ENTER || key==ESCAPE)
+ break;
+ }
+ }
+ for (tmp = sec; tmp; tmp /= 10)
+ printf("\b \b");
+ }
+ if (key == 0) {
+ printf("timed out\n");
+ return 0; /* success */
+ } else {
+ putchar('\n');
+ if (key == ESCAPE)
+ return -1; /* canceled */
+ else
+ return 0; /* default accepted */
+ }
+}
+#endif /* CONFIG_MENULST_TIMEOUT */
+
+void grub_menulst(void)
+{
+ char line[256];
+
+ /* If Escape key is pressed already, skip autoboot */
+ if (havechar() && getchar()==ESCAPE)
+ return;
+
+ if (menulst_delay()==0) {
+#ifdef CONFIG_MENULST_FILE
+ printf("menu: %s\n", CONFIG_MENULST_FILE);
+ strcpy(config_file, CONFIG_MENULST_FILE);
+#endif
+ } else {
+ /* The above didn't work, ask user */
+ while (havechar())
+ getchar();
+
+#ifdef CONFIG_MENULST_FILE
+ strncpy(line, CONFIG_MENULST_FILE, sizeof(line)-1);
+ line[sizeof(line)-1] = '\0';
+#else
+ line[0] = '\0';
+#endif
+ for (;;) {
+ printf("menu: ");
+ getline(line, sizeof line);
+
+ if (strcmp(line,"quit")==0) break;
+
+ if (line[0]) {
+ strcpy(config_file, line);
+ break;
+ }
+ }
+ }
+
+
+}
+
Modified: trunk/filo/main/grub/serial.c
===================================================================
--- trunk/filo/main/grub/serial.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub/serial.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -33,8 +33,6 @@
static int keep_track = 1;
-#ifndef GRUB_UTIL
-
/* Fetch a key. */
int
serial_hw_fetch (void)
@@ -94,9 +92,7 @@
#endif
return 1;
}
-#endif /* ! GRUB_UTIL */
-
/* Generic definitions. */
#if CONFIG_SERIAL_CONSOLE
Modified: trunk/filo/main/grub/stage2.c
===================================================================
--- trunk/filo/main/grub/stage2.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub/stage2.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -1,6 +1,7 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2000,2001,2002,2004,2005 Free Software Foundation, Inc.
+ * Copyright (C) 2005-2008 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
@@ -21,36 +22,24 @@
#include <config.h>
#include <grub/shared.h>
#include <grub/term.h>
+#include <fs.h>
-int file_open(const char *filename);
-int file_read(void *buf, unsigned long len);
-int file_seek(unsigned long offset);
-void file_close(void);
+/* Define if there is user specified preset menu string */
+/* #undef PRESET_MENU_STRING */
+
void grub_menulst(void);
struct multiboot_info mbi;
-#if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS)
+#if defined(PRESET_MENU_STRING)
-# if defined(PRESET_MENU_STRING)
static const char *preset_menu = PRESET_MENU_STRING;
-# elif defined(SUPPORT_DISKLESS)
-/* Execute the command "bootp" automatically. */
-static const char *preset_menu = "bootp\n";
-# endif /* SUPPORT_DISKLESS */
static int preset_menu_offset;
static int
open_preset_menu (void)
{
-#ifdef GRUB_UTIL
- /* Unless the user explicitly requests to use the preset menu,
- always opening the preset menu fails in the grub shell. */
- if (! use_preset_menu)
- return 0;
-#endif /* GRUB_UTIL */
-
preset_menu_offset = 0;
return preset_menu != 0;
}
@@ -76,13 +65,13 @@
preset_menu = 0;
}
-#else /* ! PRESET_MENU_STRING && ! SUPPORT_DISKLESS */
+#else /* ! PRESET_MENU_STRING */
#define open_preset_menu() 0
#define read_from_preset_menu(buf, maxlen) 0
#define close_preset_menu()
-#endif /* ! PRESET_MENU_STRING && ! SUPPORT_DISKLESS */
+#endif /* ! PRESET_MENU_STRING */
static char *
get_entry (char *list, int num, int nested)
@@ -798,13 +787,6 @@
break;
}
-#ifdef GRUB_UTIL
- if (c == 'q')
- {
- /* The same as ``quit''. */
- stop ();
- }
-#endif
}
}
}
@@ -951,19 +933,16 @@
init_config ();
}
- // /* Initialize the environment for restarting Stage 2. */
- // grub_setjmp (restart_env);
-
/* Initialize the kill buffer. */
*kill_buf = 0;
-#if (defined(CONFIG_SERIAL_CONSOLE) && CONFIG_SERIAL_CONSOLE == 1)
+#ifdef CONFIG_SERIAL_CONSOLE
{
errnum=0;
memset(myheap, 0, 256);
run_script("serial --unit=0 --speed=9600\n\0", myheap); // dummy call
memset(myheap, 0, 256);
-#if !(defined(CONFIG_VGA_CONSOLE) && CONFIG_VGA_CONSOLE == 1 )
+#ifndef CONFIG_VGA_CONSOLE
run_script("terminal serial\n\0", myheap);
#endif
}
@@ -979,9 +958,6 @@
/* Here load the configuration file. */
-#ifdef GRUB_UTIL
- if (use_config_file)
-#endif /* GRUB_UTIL */
{
char *default_file = (char *) DEFAULT_FILE_BUF;
int i;
Deleted: trunk/filo/main/grub.c
===================================================================
--- trunk/filo/main/grub.c 2008-09-04 06:22:39 UTC (rev 59)
+++ trunk/filo/main/grub.c 2008-09-11 17:51:27 UTC (rev 60)
@@ -1,119 +0,0 @@
-/*
- * This file is part of FILO.
- *
- * 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
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <libpayload.h>
-#include <config.h>
-#include <lib.h>
-#include <fs.h>
-#include <arch/timer.h>
-
-extern char config_file[];
-// #include <grub/shared.h>
-
-#define ENTER '\r'
-#define ESCAPE '\x1b'
-
-#ifndef CONFIG_MENULST_TIMEOUT
-#define CONFIG_MENULST_TIMEOUT 0
-#endif
-#if !CONFIG_MENULST_TIMEOUT
-#define menulst_delay() 0 /* success */
-#endif
-
-#ifdef CONFIG_USE_GRUB
-#if CONFIG_MENULST_TIMEOUT
-static inline int menulst_delay(void)
-{
- u64 timeout;
- int sec, tmp;
- char key;
-
- key = 0;
-
-#ifdef CONFIG_MENULST_FILE
- printf("Press <Enter> for default menu.lst (%s), or <Esc> for prompt... ",
- CONFIG_MENULST_FILE);
-#else
- printf("Press <Enter> for the FILO shell or <ESC> to enter a menu.lst path...");
-#endif
- for (sec = CONFIG_MENULST_TIMEOUT; sec>0 && key==0; sec--) {
- printf("%d", sec);
- timeout = currticks() + TICKS_PER_SEC;
- while (currticks() < timeout) {
- if (havechar()) {
- key = getchar();
- if (key==ENTER || key==ESCAPE)
- break;
- }
- }
- for (tmp = sec; tmp; tmp /= 10)
- printf("\b \b");
- }
- if (key == 0) {
- printf("timed out\n");
- return 0; /* success */
- } else {
- putchar('\n');
- if (key == ESCAPE)
- return -1; /* canceled */
- else
- return 0; /* default accepted */
- }
-}
-#endif /* CONFIG_MENULST_TIMEOUT */
-
-void grub_menulst(void)
-{
- char line[256];
-
- /* If Escape key is pressed already, skip autoboot */
- if (havechar() && getchar()==ESCAPE)
- return;
-
- if (menulst_delay()==0) {
-#ifdef CONFIG_MENULST_FILE
- printf("menu: %s\n", CONFIG_MENULST_FILE);
- strcpy(config_file, CONFIG_MENULST_FILE);
-#endif
- } else {
- /* The above didn't work, ask user */
- while (havechar())
- getchar();
-
-#ifdef CONFIG_MENULST_FILE
- strncpy(line, CONFIG_MENULST_FILE, sizeof(line)-1);
- line[sizeof(line)-1] = '\0';
-#else
- line[0] = '\0';
-#endif
- for (;;) {
- printf("menu: ");
- getline(line, sizeof line);
-
- if (strcmp(line,"quit")==0) break;
-
- if (line[0]) {
- strcpy(config_file, line);
- break;
- }
- }
- }
-
-
-}
-#endif /* CONFIG_USE_GRUB */
-