2007-11-05 Robert Millan <rmh@aybabtu.com>
* kern/disk.c (grub_disk_firmware_fini) (grub_disk_firmware_is_tainted): New variables. * include/grub/disk.h (grub_disk_firmware_fini) (grub_disk_firmware_is_tainted): Likewise. * disk/i386/pc/biosdisk.c (GRUB_MOD_FINI(biosdisk)): Moved from here ... (grub_disk_biosdisk_fini): ... to here. (GRUB_MOD_FINI(biosdisk)): Implement using grub_disk_biosdisk_fini(). (GRUB_MOD_INIT(biosdisk)): Abort when `grub_disk_firmware_is_tainted' is set. Register grub_disk_biosdisk_fini() in `grub_disk_firmware_fini'. * disk/ata.c: Remove `<grub/machine/biosdisk.h>'. (GRUB_MOD_INIT(ata)): Remove grub_biosdisk_fini() call. Use `grub_disk_firmware_is_tainted' and `grub_disk_firmware_fini' to finish existing firmware disk interface. * conf/i386-linuxbios.rmk (pkgdata_MODULES): Add `ata.mod'. (ata_mod_SOURCES): New variable. (ata_mod_CFLAGS): Likewise. (ata_mod_LDFLAGS): Likewise.
This commit is contained in:
parent
0149ab7c63
commit
5ab33bba2f
7 changed files with 111 additions and 6 deletions
25
ChangeLog
25
ChangeLog
|
@ -1,3 +1,28 @@
|
||||||
|
2007-11-05 Robert Millan <rmh@aybabtu.com>
|
||||||
|
|
||||||
|
* kern/disk.c (grub_disk_firmware_fini)
|
||||||
|
(grub_disk_firmware_is_tainted): New variables.
|
||||||
|
|
||||||
|
* include/grub/disk.h (grub_disk_firmware_fini)
|
||||||
|
(grub_disk_firmware_is_tainted): Likewise.
|
||||||
|
|
||||||
|
* disk/i386/pc/biosdisk.c (GRUB_MOD_FINI(biosdisk)): Moved from here ...
|
||||||
|
(grub_disk_biosdisk_fini): ... to here.
|
||||||
|
(GRUB_MOD_FINI(biosdisk)): Implement using grub_disk_biosdisk_fini().
|
||||||
|
(GRUB_MOD_INIT(biosdisk)): Abort when `grub_disk_firmware_is_tainted'
|
||||||
|
is set. Register grub_disk_biosdisk_fini() in
|
||||||
|
`grub_disk_firmware_fini'.
|
||||||
|
|
||||||
|
* disk/ata.c: Remove `<grub/machine/biosdisk.h>'.
|
||||||
|
(GRUB_MOD_INIT(ata)): Remove grub_biosdisk_fini() call.
|
||||||
|
Use `grub_disk_firmware_is_tainted' and `grub_disk_firmware_fini'
|
||||||
|
to finish existing firmware disk interface.
|
||||||
|
|
||||||
|
* conf/i386-linuxbios.rmk (pkgdata_MODULES): Add `ata.mod'.
|
||||||
|
(ata_mod_SOURCES): New variable.
|
||||||
|
(ata_mod_CFLAGS): Likewise.
|
||||||
|
(ata_mod_LDFLAGS): Likewise.
|
||||||
|
|
||||||
2007-11-05 Robert Millan <rmh@aybabtu.com>
|
2007-11-05 Robert Millan <rmh@aybabtu.com>
|
||||||
|
|
||||||
* disk/ata.c: Remove `<grub/machine/time.h>'. Include `<grub/time.h>'.
|
* disk/ata.c: Remove `<grub/machine/time.h>'. Include `<grub/time.h>'.
|
||||||
|
|
|
@ -657,7 +657,7 @@ grub_emu_LDFLAGS = $(LIBCURSES)
|
||||||
# Modules.
|
# Modules.
|
||||||
pkgdata_MODULES = _linux.mod linux.mod normal.mod \
|
pkgdata_MODULES = _linux.mod linux.mod normal.mod \
|
||||||
_multiboot.mod multiboot.mod play.mod \
|
_multiboot.mod multiboot.mod play.mod \
|
||||||
cpuid.mod serial.mod
|
cpuid.mod serial.mod ata.mod
|
||||||
|
|
||||||
# For _linux.mod.
|
# For _linux.mod.
|
||||||
_linux_mod_SOURCES = loader/i386/pc/linux.c
|
_linux_mod_SOURCES = loader/i386/pc/linux.c
|
||||||
|
@ -1324,4 +1324,56 @@ fs-cpuid_mod-commands_i386_cpuid.lst: commands/i386/cpuid.c genfslist.sh
|
||||||
cpuid_mod_CFLAGS = $(COMMON_CFLAGS)
|
cpuid_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
|
# For ata.mod.
|
||||||
|
ata_mod_SOURCES = disk/ata.c
|
||||||
|
CLEANFILES += ata.mod mod-ata.o mod-ata.c pre-ata.o ata_mod-disk_ata.o und-ata.lst
|
||||||
|
ifneq ($(ata_mod_EXPORTS),no)
|
||||||
|
CLEANFILES += def-ata.lst
|
||||||
|
DEFSYMFILES += def-ata.lst
|
||||||
|
endif
|
||||||
|
MOSTLYCLEANFILES += ata_mod-disk_ata.d
|
||||||
|
UNDSYMFILES += und-ata.lst
|
||||||
|
|
||||||
|
ata.mod: pre-ata.o mod-ata.o
|
||||||
|
-rm -f $@
|
||||||
|
$(TARGET_CC) $(ata_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ $^
|
||||||
|
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
|
||||||
|
|
||||||
|
pre-ata.o: $(ata_mod_DEPENDENCIES) ata_mod-disk_ata.o
|
||||||
|
-rm -f $@
|
||||||
|
$(TARGET_CC) $(ata_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ ata_mod-disk_ata.o
|
||||||
|
|
||||||
|
mod-ata.o: mod-ata.c
|
||||||
|
$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(ata_mod_CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
mod-ata.c: moddep.lst genmodsrc.sh
|
||||||
|
sh $(srcdir)/genmodsrc.sh 'ata' $< > $@ || (rm -f $@; exit 1)
|
||||||
|
|
||||||
|
ifneq ($(ata_mod_EXPORTS),no)
|
||||||
|
def-ata.lst: pre-ata.o
|
||||||
|
$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 ata/' > $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
und-ata.lst: pre-ata.o
|
||||||
|
echo 'ata' > $@
|
||||||
|
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
|
||||||
|
|
||||||
|
ata_mod-disk_ata.o: disk/ata.c
|
||||||
|
$(TARGET_CC) -Idisk -I$(srcdir)/disk $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(ata_mod_CFLAGS) -MD -c -o $@ $<
|
||||||
|
-include ata_mod-disk_ata.d
|
||||||
|
|
||||||
|
CLEANFILES += cmd-ata_mod-disk_ata.lst fs-ata_mod-disk_ata.lst
|
||||||
|
COMMANDFILES += cmd-ata_mod-disk_ata.lst
|
||||||
|
FSFILES += fs-ata_mod-disk_ata.lst
|
||||||
|
|
||||||
|
cmd-ata_mod-disk_ata.lst: disk/ata.c gencmdlist.sh
|
||||||
|
set -e; $(TARGET_CC) -Idisk -I$(srcdir)/disk $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(ata_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh ata > $@ || (rm -f $@; exit 1)
|
||||||
|
|
||||||
|
fs-ata_mod-disk_ata.lst: disk/ata.c genfslist.sh
|
||||||
|
set -e; $(TARGET_CC) -Idisk -I$(srcdir)/disk $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(ata_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh ata > $@ || (rm -f $@; exit 1)
|
||||||
|
|
||||||
|
|
||||||
|
ata_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
|
ata_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
include $(srcdir)/conf/common.mk
|
include $(srcdir)/conf/common.mk
|
||||||
|
|
|
@ -95,7 +95,7 @@ grub_emu_LDFLAGS = $(LIBCURSES)
|
||||||
# Modules.
|
# Modules.
|
||||||
pkgdata_MODULES = _linux.mod linux.mod normal.mod \
|
pkgdata_MODULES = _linux.mod linux.mod normal.mod \
|
||||||
_multiboot.mod multiboot.mod play.mod \
|
_multiboot.mod multiboot.mod play.mod \
|
||||||
cpuid.mod serial.mod
|
cpuid.mod serial.mod ata.mod
|
||||||
|
|
||||||
# For _linux.mod.
|
# For _linux.mod.
|
||||||
_linux_mod_SOURCES = loader/i386/pc/linux.c
|
_linux_mod_SOURCES = loader/i386/pc/linux.c
|
||||||
|
@ -146,4 +146,9 @@ cpuid_mod_SOURCES = commands/i386/cpuid.c
|
||||||
cpuid_mod_CFLAGS = $(COMMON_CFLAGS)
|
cpuid_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
|
# For ata.mod.
|
||||||
|
ata_mod_SOURCES = disk/ata.c
|
||||||
|
ata_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
|
ata_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
include $(srcdir)/conf/common.mk
|
include $(srcdir)/conf/common.mk
|
||||||
|
|
10
disk/ata.c
10
disk/ata.c
|
@ -24,7 +24,6 @@
|
||||||
#include <grub/time.h>
|
#include <grub/time.h>
|
||||||
/* XXX: For now this only works on i386. */
|
/* XXX: For now this only works on i386. */
|
||||||
#include <grub/cpu/io.h>
|
#include <grub/cpu/io.h>
|
||||||
#include <grub/machine/biosdisk.h>
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -733,8 +732,13 @@ GRUB_MOD_INIT(ata)
|
||||||
{
|
{
|
||||||
(void) mod; /* To stop warning. */
|
(void) mod; /* To stop warning. */
|
||||||
|
|
||||||
/* XXX: To prevent two drivers operating on the same disks. */
|
/* To prevent two drivers operating on the same disks. */
|
||||||
grub_biosdisk_fini ();
|
grub_disk_firmware_is_tainted = 1;
|
||||||
|
if (grub_disk_firmware_fini)
|
||||||
|
{
|
||||||
|
grub_disk_firmware_fini ();
|
||||||
|
grub_disk_firmware_fini = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* ATA initialization. */
|
/* ATA initialization. */
|
||||||
grub_ata_initialize ();
|
grub_ata_initialize ();
|
||||||
|
|
|
@ -312,12 +312,25 @@ static struct grub_disk_dev grub_biosdisk_dev =
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_disk_biosdisk_fini (void)
|
||||||
|
{
|
||||||
|
grub_disk_dev_unregister (&grub_biosdisk_dev);
|
||||||
|
}
|
||||||
|
|
||||||
GRUB_MOD_INIT(biosdisk)
|
GRUB_MOD_INIT(biosdisk)
|
||||||
{
|
{
|
||||||
|
if (grub_disk_firmware_is_tainted)
|
||||||
|
{
|
||||||
|
grub_printf ("Firmware is marked as tainted, refusing to initialize.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
grub_disk_firmware_fini = grub_disk_biosdisk_fini;
|
||||||
|
|
||||||
grub_disk_dev_register (&grub_biosdisk_dev);
|
grub_disk_dev_register (&grub_biosdisk_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
GRUB_MOD_FINI(biosdisk)
|
GRUB_MOD_FINI(biosdisk)
|
||||||
{
|
{
|
||||||
grub_disk_dev_unregister (&grub_biosdisk_dev);
|
grub_disk_biosdisk_fini ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,6 +137,9 @@ grub_err_t EXPORT_FUNC(grub_disk_write) (grub_disk_t disk,
|
||||||
|
|
||||||
grub_uint64_t EXPORT_FUNC(grub_disk_get_size) (grub_disk_t disk);
|
grub_uint64_t EXPORT_FUNC(grub_disk_get_size) (grub_disk_t disk);
|
||||||
|
|
||||||
|
extern void (* EXPORT_VAR(grub_disk_firmware_fini)) (void);
|
||||||
|
extern int EXPORT_VAR(grub_disk_firmware_is_tainted);
|
||||||
|
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
void grub_raid_init (void);
|
void grub_raid_init (void);
|
||||||
void grub_raid_fini (void);
|
void grub_raid_fini (void);
|
||||||
|
|
|
@ -43,6 +43,9 @@ struct grub_disk_cache
|
||||||
|
|
||||||
static struct grub_disk_cache grub_disk_cache_table[GRUB_DISK_CACHE_NUM];
|
static struct grub_disk_cache grub_disk_cache_table[GRUB_DISK_CACHE_NUM];
|
||||||
|
|
||||||
|
void (*grub_disk_firmware_fini) (void);
|
||||||
|
int grub_disk_firmware_is_tainted;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static unsigned long grub_disk_cache_hits;
|
static unsigned long grub_disk_cache_hits;
|
||||||
static unsigned long grub_disk_cache_misses;
|
static unsigned long grub_disk_cache_misses;
|
||||||
|
|
Loading…
Reference in a new issue