+2013-04-29 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Enforce disabling of firmware disk drivers when native drivers kick in.
+
2013-04-29 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/commands/nativedisk.c: Customize the list of modules on
#include <grub/time.h>
#include <grub/loader.h>
#include <grub/cs5536.h>
+#include <grub/disk.h>
GRUB_MOD_LICENSE ("GPLv3+");
{
COMPILE_TIME_ASSERT (sizeof (struct grub_ehci_td) == 64);
COMPILE_TIME_ASSERT (sizeof (struct grub_ehci_qh) == 96);
+
+ grub_stop_disk_firmware ();
+
grub_boot_time ("Initing EHCI hardware");
grub_ehci_inithw ();
grub_boot_time ("Registering EHCI driver");
#include <grub/time.h>
#include <grub/cs5536.h>
#include <grub/loader.h>
+#include <grub/disk.h>
GRUB_MOD_LICENSE ("GPLv3+");
{
COMPILE_TIME_ASSERT (sizeof (struct grub_ohci_td) == 32);
COMPILE_TIME_ASSERT (sizeof (struct grub_ohci_ed) == 16);
+
+ grub_stop_disk_firmware ();
+
grub_ohci_inithw ();
grub_usb_controller_dev_register (&usb_controller);
fini_hnd = grub_loader_register_preboot_hook (grub_ohci_fini_hw,
GRUB_MOD_INIT(uhci)
{
+ grub_stop_disk_firmware ();
+
grub_uhci_inithw ();
grub_usb_controller_dev_register (&usb_controller);
grub_dprintf ("uhci", "registered\n");
if (class >> 8 != 0x010601)
return 0;
-#ifdef GRUB_MACHINE_QEMU
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
- grub_pci_write_word (addr, 0x107);
-#endif
-
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG5);
#ifdef GRUB_MACHINE_QEMU
GRUB_MOD_INIT(ahci)
{
- /* To prevent two drivers operating on the same disks. */
- grub_disk_firmware_is_tainted = 1;
- if (grub_disk_firmware_fini)
- {
- grub_disk_firmware_fini ();
- grub_disk_firmware_fini = NULL;
- }
+ grub_stop_disk_firmware ();
/* AHCI initialization. */
grub_ahci_initialize ();
.next = 0
};
-void
-grub_efidisk_init (void)
-{
- enumerate_disks ();
- grub_disk_dev_register (&grub_efidisk_dev);
-}
-
void
grub_efidisk_fini (void)
{
free_devices (fd_devices);
free_devices (hd_devices);
free_devices (cd_devices);
+ fd_devices = 0;
+ hd_devices = 0;
+ cd_devices = 0;
grub_disk_dev_unregister (&grub_efidisk_dev);
}
+void
+grub_efidisk_init (void)
+{
+ grub_disk_firmware_fini = grub_efidisk_fini;
+
+ enumerate_disks ();
+ grub_disk_dev_register (&grub_efidisk_dev);
+}
+
/* Some utility functions to map GRUB devices with EFI devices. */
grub_efi_handle_t
grub_efidisk_get_device_handle (grub_disk_t disk)
grub_free (bootpath);
}
-void
-grub_ofdisk_init (void)
-{
- insert_bootpath ();
-
- grub_disk_dev_register (&grub_ofdisk_dev);
-}
-
void
grub_ofdisk_fini (void)
{
grub_disk_dev_unregister (&grub_ofdisk_dev);
}
+void
+grub_ofdisk_init (void)
+{
+ grub_disk_firmware_fini = grub_ofdisk_fini;
+
+ insert_bootpath ();
+
+ grub_disk_dev_register (&grub_ofdisk_dev);
+}
+
grub_err_t
grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size)
{
GRUB_MOD_INIT(ata_pthru)
{
- /* To prevent two drivers operating on the same disks. */
- grub_disk_firmware_is_tainted = 1;
- if (grub_disk_firmware_fini)
- {
- grub_disk_firmware_fini ();
- grub_disk_firmware_fini = NULL;
- }
+ grub_stop_disk_firmware ();
/* ATA initialization. */
grub_pata_initialize ();
#include <grub/err.h>
#include <grub/types.h>
#include <grub/device.h>
+/* For NULL. */
+#include <grub/mm.h>
/* These are used to set a device id. When you add a new disk device,
you must define a new id for it here. */
extern void (* EXPORT_VAR(grub_disk_firmware_fini)) (void);
extern int EXPORT_VAR(grub_disk_firmware_is_tainted);
+static inline void
+grub_stop_disk_firmware (void)
+{
+ /* To prevent two drivers operating on the same disks. */
+ grub_disk_firmware_is_tainted = 1;
+ if (grub_disk_firmware_fini)
+ {
+ grub_disk_firmware_fini ();
+ grub_disk_firmware_fini = NULL;
+ }
+}
+
#if defined (GRUB_UTIL)
void grub_lvm_init (void);
void grub_ldm_init (void);