From d58d45ff1f1be086355d9bdb18d7857f4429e82c Mon Sep 17 00:00:00 2001 From: James Date: Sat, 17 Nov 2012 02:57:07 +0000 Subject: fish --- .gitignore | 1 + master/jmm/copy-acpi-and-dmi-for-mb-kernels | 121 ++++++++++++++++++++++++++++ master/jmm/disable-all-pci-dma-on-boot | 85 +++++++++++++++++++ master/series | 7 +- 4 files changed, 209 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 master/jmm/copy-acpi-and-dmi-for-mb-kernels create mode 100644 master/jmm/disable-all-pci-dma-on-boot 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 + #include + #include ++#include ++ + + 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 # # -- cgit v1.2.3