diff options
| author | James <james.mckenzie@citrix.com> | 2012-11-17 02:57:07 +0000 | 
|---|---|---|
| committer | James <james.mckenzie@citrix.com> | 2012-11-17 02:57:07 +0000 | 
| commit | d58d45ff1f1be086355d9bdb18d7857f4429e82c (patch) | |
| tree | e7da3962e7b6c36030d7e68820b39ead7d308c33 /master | |
| parent | 548fc951e98dd1553204e3f45db3f5cc70813c4b (diff) | |
| download | grub-1.99-pq-d58d45ff1f1be086355d9bdb18d7857f4429e82c.tar.gz grub-1.99-pq-d58d45ff1f1be086355d9bdb18d7857f4429e82c.tar.bz2 grub-1.99-pq-d58d45ff1f1be086355d9bdb18d7857f4429e82c.zip  | |
fish
Diffstat (limited to 'master')
| -rw-r--r-- | master/jmm/copy-acpi-and-dmi-for-mb-kernels | 121 | ||||
| -rw-r--r-- | master/jmm/disable-all-pci-dma-on-boot | 85 | ||||
| -rw-r--r-- | master/series | 7 | 
3 files changed, 208 insertions, 5 deletions
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  #  #  | 
