summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames <james.mckenzie@citrix.com>2012-11-17 02:57:07 +0000
committerJames <james.mckenzie@citrix.com>2012-11-17 02:57:07 +0000
commitd58d45ff1f1be086355d9bdb18d7857f4429e82c (patch)
treee7da3962e7b6c36030d7e68820b39ead7d308c33
parent548fc951e98dd1553204e3f45db3f5cc70813c4b (diff)
downloadgrub-1.99-pq-d58d45ff1f1be086355d9bdb18d7857f4429e82c.tar.gz
grub-1.99-pq-d58d45ff1f1be086355d9bdb18d7857f4429e82c.tar.bz2
grub-1.99-pq-d58d45ff1f1be086355d9bdb18d7857f4429e82c.zip
fish
-rw-r--r--.gitignore1
-rw-r--r--master/jmm/copy-acpi-and-dmi-for-mb-kernels121
-rw-r--r--master/jmm/disable-all-pci-dma-on-boot85
-rw-r--r--master/series7
4 files changed, 209 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b25c15b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*~
diff --git a/master/jmm/copy-acpi-and-dmi-for-mb-kernels b/master/jmm/copy-acpi-and-dmi-for-mb-kernels
new file mode 100644
index 0000000..0b11871
--- /dev/null
+++ b/master/jmm/copy-acpi-and-dmi-for-mb-kernels
@@ -0,0 +1,121 @@
+diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
+index 85ae791..fec513f 100644
+--- a/grub-core/loader/i386/linux.c
++++ b/grub-core/loader/i386/linux.c
+@@ -407,6 +407,94 @@ grub_linux_setup_video (struct linux_kernel_params *params)
+ return GRUB_ERR_NONE;
+ }
+
++#ifdef GRUB_MACHINE_EFI
++static grub_efi_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
++static grub_efi_guid_t acpi2_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
++static grub_efi_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID;
++
++#define EBDA_SEG_ADDR 0x40e
++#define LOW_MEM_ADDR 0x413
++#define FAKE_EBDA_SEG 0x7000
++#define FAKE_SMBIOS_SEG 0x8000
++
++static void
++inject_bios_acpi (void)
++{
++ unsigned i;
++ void *acpi;
++ grub_uint16_t *ebda_seg_ptr, *low_mem_ptr;
++
++ acpi = 0;
++ for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
++ {
++ grub_efi_guid_t *guid =
++ &grub_efi_system_table->configuration_table[i].vendor_guid;
++
++ if (!grub_memcmp (guid, &acpi2_guid, sizeof (grub_efi_guid_t)))
++ {
++ acpi = grub_efi_system_table->configuration_table[i].vendor_table;
++ grub_printf ("ACPI2: %p\n", acpi);
++ }
++ else if (!grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_guid_t)))
++ {
++ void *t;
++
++ t = grub_efi_system_table->configuration_table[i].vendor_table;
++ if (!acpi)
++ acpi = t;
++ grub_printf ("ACPI: %p\n", t);
++ }
++ }
++
++ if (acpi == 0)
++ return;
++
++ ebda_seg_ptr = (grub_uint16_t *) EBDA_SEG_ADDR;
++ low_mem_ptr = (grub_uint16_t *) LOW_MEM_ADDR;
++
++ *ebda_seg_ptr = FAKE_EBDA_SEG;
++ *low_mem_ptr = FAKE_EBDA_SEG >> 6;
++
++ grub_printf("Copying acpi %p to %x\n",acpi,(int) (FAKE_EBDA_SEG << 4));
++ grub_memcpy ((char *) (FAKE_EBDA_SEG << 4), acpi, 0x10000);
++
++}
++
++static void
++inject_bios_smbios(void)
++{
++ unsigned i;
++ void *smbios;
++
++ smbios = 0;
++ for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
++ {
++ grub_efi_guid_t *guid =
++ &grub_efi_system_table->configuration_table[i].vendor_guid;
++
++ if (!grub_memcmp (guid, &smbios_guid, sizeof (grub_efi_guid_t)))
++ {
++ smbios = grub_efi_system_table->configuration_table[i].vendor_table;
++ grub_printf ("SMBIOS: %p\n", smbios);
++ }
++ }
++
++ if (smbios == 0)
++ return;
++
++ grub_printf("Copying smbios %p to %x\n",smbios,(int) (FAKE_SMBIOS_SEG << 4));
++ grub_memcpy ((char *) (FAKE_SMBIOS_SEG << 4), smbios, 0x10000);
++}
++
++
++static void fake_bios_data(void)
++{
++ inject_bios_smbios();
++ inject_bios_acpi();
++}
++
++#endif
++
+ static grub_err_t
+ grub_linux_boot (void)
+ {
+@@ -471,6 +559,10 @@ grub_linux_boot (void)
+
+ e820_num = 0;
+ grub_mmap_iterate (hook);
++#ifdef GRUB_MACHINE_EFI
++ grub_e820_add_region (params->e820_map, &e820_num,
++ 0x70000, 0x20000, GRUB_E820_RESERVED);
++#endif
+ params->mmap_size = e820_num;
+
+ modevar = grub_env_get ("gfxpayload");
+@@ -547,6 +639,10 @@ grub_linux_boot (void)
+ #endif
+
+ #ifdef GRUB_MACHINE_EFI
++ fake_bios_data();
++#endif
++
++#ifdef GRUB_MACHINE_EFI
+ {
+ grub_efi_uintn_t efi_desc_size;
+ grub_size_t efi_mmap_target;
diff --git a/master/jmm/disable-all-pci-dma-on-boot b/master/jmm/disable-all-pci-dma-on-boot
new file mode 100644
index 0000000..e330109
--- /dev/null
+++ b/master/jmm/disable-all-pci-dma-on-boot
@@ -0,0 +1,85 @@
+diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
+index fec513f..81048ef 100644
+--- a/grub-core/loader/i386/linux.c
++++ b/grub-core/loader/i386/linux.c
+@@ -34,6 +34,8 @@
+ #include <grub/i386/relocator.h>
+ #include <grub/i18n.h>
+ #include <grub/lib/cmdline.h>
++#include <grub/pci.h>
++
+
+ GRUB_MOD_LICENSE ("GPLv3+");
+
+@@ -495,6 +497,52 @@ static void fake_bios_data(void)
+
+ #endif
+
++static void stop_dma(void)
++{
++
++ auto int NESTED_FUNC_ATTR stop_card_dma (grub_pci_device_t dev,
++ grub_pci_id_t pciid);
++
++ int NESTED_FUNC_ATTR stop_card_dma (grub_pci_device_t dev,
++ grub_pci_id_t pciid)
++ {
++ grub_pci_address_t addr;
++ grub_uint16_t old_cmd,new_cmd;
++
++ (void) pciid;
++
++ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
++
++ switch (grub_pci_read (addr) >> 24) {
++ case 0x00: /*unknown*/
++ case 0x03: /*GPU*/
++ case 0x05: /*memory*/
++ case 0x06: /*bridge*/
++ case 0x0b: /*cpu*/
++ break;
++ default: /*everything else gets dma turned off*/
++
++ addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
++ old_cmd = grub_pci_read_word(addr);
++ new_cmd = old_cmd & ~GRUB_PCI_COMMAND_BUS_MASTER;
++ grub_pci_write_word(addr,new_cmd);
++
++#if 0
++ if (old_cmd!=new_cmd) {
++ grub_printf ("Disabled DMA on: %02x:%02x.%x %04x -> %04x\n",
++ grub_pci_get_bus (dev), grub_pci_get_device (dev),
++ grub_pci_get_function (dev), (int) old_cmd,(int) new_cmd);
++ }
++#endif
++ }
++
++ return 0;
++ }
++
++ grub_pci_iterate (stop_card_dma);
++}
++
++
+ static grub_err_t
+ grub_linux_boot (void)
+ {
+@@ -642,6 +690,7 @@ grub_linux_boot (void)
+ fake_bios_data();
+ #endif
+
++
+ #ifdef GRUB_MACHINE_EFI
+ {
+ grub_efi_uintn_t efi_desc_size;
+@@ -651,7 +700,9 @@ grub_linux_boot (void)
+ &efi_desc_size, &efi_desc_version);
+ if (err)
+ return err;
+-
++
++ stop_dma();
++
+ /* Note that no boot services are available from here. */
+ efi_mmap_target = real_mode_target
+ + ((grub_uint8_t *) efi_mmap_buf - (grub_uint8_t *) real_mode_mem);
diff --git a/master/series b/master/series
index 15baf15..92264d8 100644
--- a/master/series
+++ b/master/series
@@ -45,15 +45,12 @@ debian/efi_disk_cache.patch
debian/dirlen.patch
debian/hurd.patch
debian/userland-part.patch
-#jmm/efi_call_7
jmm/efi_call_7-bis
-#jmm/efi-load-drivers
jmm/efi-load-drivers-bis
-#jmm/networking
-#jmm/networking2
jmm/networking-bis
-#jmm/efi-sni
jmm/efi-sni-bis
+jmm/copy-acpi-and-dmi-for-mb-kernels
+jmm/disable-all-pci-dma-on-boot
endstop
#
#