summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2016-02-04 12:15:47 -0500
committerMark H Weaver <mhw@netris.org>2016-08-18 03:29:09 -0400
commit6a3608131ef56d75191c5a0e80b0a84b35c6b2e7 (patch)
tree6b2e70fc08e7ddbdf70009371f00ab866a876748
parentabfe2e29c8feb9bd05c019595a9700bdfdcc0835 (diff)
gnu: grub: Add support for Loongson-based machines.
* gnu/packages/patches/grub-fix-loongson2f.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/grub.scm (grub)[source]: Add patch on MIPS. [arguments]: Disable tests on MIPS. [native-inputs]: Remove parted, qemu, and xorriso (for tests) on MIPS.
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/grub.scm29
-rw-r--r--gnu/packages/patches/grub-fix-loongson2f.patch254
3 files changed, 279 insertions, 5 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 87a2b18d8a..5105ecd2d3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -541,6 +541,7 @@ dist_patch_DATA = \
%D%/packages/patches/grep-timing-sensitive-test.patch \
%D%/packages/patches/grub-CVE-2015-8370.patch \
%D%/packages/patches/grub-gets-undeclared.patch \
+ %D%/packages/patches/grub-fix-loongson2f.patch \
%D%/packages/patches/grub-freetype.patch \
%D%/packages/patches/guile-1.8-cpp-4.5.patch \
%D%/packages/patches/guile-arm-fixes.patch \
diff --git a/gnu/packages/grub.scm b/gnu/packages/grub.scm
index 01f2a8454d..7e0aa0686b 100644
--- a/gnu/packages/grub.scm
+++ b/gnu/packages/grub.scm
@@ -87,10 +87,23 @@
(file-name (string-append name "-" version ".tar.xz"))
(sha256
(base32
- "18ddwnw0vxs7zigvah0g6a5z5vvlz0p8fjglxv1h59sjbrakvv1h"))))
+ "18ddwnw0vxs7zigvah0g6a5z5vvlz0p8fjglxv1h59sjbrakvv1h"))
+ (patches
+ (map search-patch
+ `(;; Apply the following patch _only_ on mips64
+ ,@(if (string-prefix? "mips64" (or (%current-target-system)
+ (%current-system)))
+ '("grub-fix-loongson2f.patch")
+ '()))))))
(build-system gnu-build-system)
(arguments
- '(;; Two warnings: suggest braces, signed/unsigned comparison.
+ `(,@(if (string-prefix? "mips" (or (%current-target-system)
+ (%current-system)))
+ ;; XXX Disable tests on MIPS, to work around the fact that our
+ ;; QEMU package is currently broken on MIPS.
+ '(#:tests? #f)
+ '())
+ ;; Two warnings: suggest braces, signed/unsigned comparison.
#:configure-flags '("--disable-werror")
#:phases (modify-phases %standard-phases
(add-after
@@ -126,9 +139,15 @@
;; Dependencies for the test suite. The "real" QEMU is needed here,
;; because several targets are used.
- ("parted" ,parted)
- ("qemu" ,qemu-for-tests)
- ("xorriso" ,xorriso)))
+ ;;
+ ;; XXX Don't add these on MIPS, since our QEMU package is currently
+ ;; broken on MIPS.
+ ,@(if (not (string-prefix? "mips" (or (%current-target-system)
+ (%current-system))))
+ `(("parted" ,parted)
+ ("qemu" ,qemu-for-tests)
+ ("xorriso" ,xorriso))
+ '())))
(home-page "http://www.gnu.org/software/grub/")
(synopsis "GRand Unified Boot loader")
(description
diff --git a/gnu/packages/patches/grub-fix-loongson2f.patch b/gnu/packages/patches/grub-fix-loongson2f.patch
new file mode 100644
index 0000000000..4c3ff3cdde
--- /dev/null
+++ b/gnu/packages/patches/grub-fix-loongson2f.patch
@@ -0,0 +1,254 @@
+Revert two upstream commits that cause GRUB to hang early during boot on
+Loongson 2F.
+
+From 2062ea983468e257442763a7ac26877a6a88ee2f Mon Sep 17 00:00:00 2001
+From: Mark H Weaver <mhw@netris.org>
+Date: Fri, 12 Aug 2016 05:23:36 -0400
+Subject: [PATCH 1/2] Revert "ehci: Fix memory coherence"
+
+This reverts commit 0f076d75d04d76ab83e8472715eec71da0cb55ff.
+---
+ grub-core/bus/usb/ehci.c | 41 -----------------------------------------
+ 1 file changed, 41 deletions(-)
+
+diff --git a/grub-core/bus/usb/ehci.c b/grub-core/bus/usb/ehci.c
+index 5f4297b..ae1efb2 100644
+--- a/grub-core/bus/usb/ehci.c
++++ b/grub-core/bus/usb/ehci.c
+@@ -29,7 +29,6 @@
+ #include <grub/loader.h>
+ #include <grub/cs5536.h>
+ #include <grub/disk.h>
+-#include <grub/cache.h>
+
+ GRUB_MOD_LICENSE ("GPLv3+");
+
+@@ -338,21 +337,6 @@ struct grub_ehci
+
+ static struct grub_ehci *ehci;
+
+-static void
+-sync_all_caches (struct grub_ehci *e)
+-{
+- if (!e)
+- return;
+- if (e->td_virt)
+- grub_arch_sync_dma_caches (e->td_virt, sizeof (struct grub_ehci_td) *
+- GRUB_EHCI_N_TD);
+- if (e->qh_virt)
+- grub_arch_sync_dma_caches (e->qh_virt, sizeof (struct grub_ehci_qh) *
+- GRUB_EHCI_N_QH);
+- if (e->framelist_virt)
+- grub_arch_sync_dma_caches (e->framelist_virt, 4096);
+-}
+-
+ /* EHCC registers access functions */
+ static inline grub_uint32_t
+ grub_ehci_ehcc_read32 (struct grub_ehci *e, grub_uint32_t addr)
+@@ -453,8 +437,6 @@ grub_ehci_reset (struct grub_ehci *e)
+ {
+ grub_uint64_t maxtime;
+
+- sync_all_caches (e);
+-
+ grub_ehci_oper_write32 (e, GRUB_EHCI_COMMAND,
+ GRUB_EHCI_CMD_HC_RESET
+ | grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
+@@ -858,8 +840,6 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
+ e->next = ehci;
+ ehci = e;
+
+- sync_all_caches (e);
+-
+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: OK at all\n");
+
+ grub_dprintf ("ehci",
+@@ -1040,7 +1020,6 @@ grub_ehci_find_qh (struct grub_ehci *e, grub_usb_transfer_t transfer)
+ /* Found proper existing (and linked) QH, do setup of QH */
+ grub_dprintf ("ehci", "find_qh: found, QH=%p\n", qh_iter);
+ grub_ehci_setup_qh (qh_iter, transfer);
+- sync_all_caches (e);
+ return qh_iter;
+ }
+
+@@ -1312,8 +1291,6 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
+ struct grub_ehci_transfer_controller_data *cdata;
+ grub_uint32_t status;
+
+- sync_all_caches (e);
+-
+ /* Check if EHCI is running and AL is enabled */
+ status = grub_ehci_oper_read32 (e, GRUB_EHCI_STATUS);
+ if ((status & GRUB_EHCI_ST_HC_HALTED) != 0)
+@@ -1422,8 +1399,6 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
+ * i.e. reset token */
+ cdata->qh_virt->td_overlay.token = grub_cpu_to_le32_compile_time (0);
+
+- sync_all_caches (e);
+-
+ /* Finito */
+ transfer->controller_data = cdata;
+
+@@ -1472,8 +1447,6 @@ grub_ehci_parse_notrun (grub_usb_controller_t dev,
+ grub_ehci_free_td (e, cdata->td_alt_virt);
+ grub_free (cdata);
+
+- sync_all_caches (e);
+-
+ /* Additionally, do something with EHCI to make it running (what?) */
+ /* Try enable EHCI and AL */
+ grub_ehci_oper_write32 (e, GRUB_EHCI_COMMAND,
+@@ -1509,8 +1482,6 @@ grub_ehci_parse_halt (grub_usb_controller_t dev,
+ grub_ehci_free_td (e, cdata->td_alt_virt);
+ grub_free (cdata);
+
+- sync_all_caches (e);
+-
+ /* Evaluation of error code - currently we don't have GRUB USB error
+ * codes for some EHCI states, GRUB_USB_ERR_DATA is used for them.
+ * Order of evaluation is critical, specially bubble/stall. */
+@@ -1544,8 +1515,6 @@ grub_ehci_parse_success (grub_usb_controller_t dev,
+ grub_ehci_free_td (e, cdata->td_alt_virt);
+ grub_free (cdata);
+
+- sync_all_caches (e);
+-
+ return GRUB_USB_ERR_NONE;
+ }
+
+@@ -1559,8 +1528,6 @@ grub_ehci_check_transfer (grub_usb_controller_t dev,
+ transfer->controller_data;
+ grub_uint32_t token, token_ftd;
+
+- sync_all_caches (e);
+-
+ grub_dprintf ("ehci",
+ "check_transfer: EHCI STATUS=%08x, cdata=%p, qh=%p\n",
+ grub_ehci_oper_read32 (e, GRUB_EHCI_STATUS),
+@@ -1627,9 +1594,6 @@ grub_ehci_cancel_transfer (grub_usb_controller_t dev,
+ int i;
+ grub_uint64_t maxtime;
+ grub_uint32_t qh_phys;
+-
+- sync_all_caches (e);
+-
+ grub_uint32_t interrupt =
+ cdata->qh_virt->ep_cap & GRUB_EHCI_SMASK_MASK;
+
+@@ -1649,7 +1613,6 @@ grub_ehci_cancel_transfer (grub_usb_controller_t dev,
+ grub_ehci_free_tds (e, cdata->td_first_virt, transfer, &actual);
+ grub_ehci_free_td (e, cdata->td_alt_virt);
+ grub_free (cdata);
+- sync_all_caches (e);
+ grub_dprintf ("ehci", "cancel_transfer: end - EHCI not running\n");
+ return GRUB_USB_ERR_NONE;
+ }
+@@ -1672,8 +1635,6 @@ grub_ehci_cancel_transfer (grub_usb_controller_t dev,
+ /* Unlink QH from AL */
+ e->qh_virt[i].qh_hptr = cdata->qh_virt->qh_hptr;
+
+- sync_all_caches (e);
+-
+ /* If this is an interrupt transfer, we just wait for the periodic
+ * schedule to advance a few times and then assume that the EHCI
+ * controller has read the updated QH. */
+@@ -1728,8 +1689,6 @@ grub_ehci_cancel_transfer (grub_usb_controller_t dev,
+
+ grub_dprintf ("ehci", "cancel_transfer: end\n");
+
+- sync_all_caches (e);
+-
+ return GRUB_USB_ERR_NONE;
+ }
+
+--
+2.9.2
+
+From b3882275ae73cbde96ddc177f37c3ba42f92ae29 Mon Sep 17 00:00:00 2001
+From: Mark H Weaver <mhw@netris.org>
+Date: Fri, 12 Aug 2016 12:16:09 -0400
+Subject: [PATCH 2/2] Revert "usbtrans: Fix memory coherence and
+ use-after-free."
+
+This reverts commit ca028db3d47387bbbd24b40f085751ca98a09183.
+---
+ grub-core/bus/usb/usbtrans.c | 24 +++++-------------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+diff --git a/grub-core/bus/usb/usbtrans.c b/grub-core/bus/usb/usbtrans.c
+index 9266e49..ee86808 100644
+--- a/grub-core/bus/usb/usbtrans.c
++++ b/grub-core/bus/usb/usbtrans.c
+@@ -24,7 +24,6 @@
+ #include <grub/usb.h>
+ #include <grub/usbtrans.h>
+ #include <grub/time.h>
+-#include <grub/cache.h>
+
+
+ static inline unsigned int
+@@ -102,8 +101,6 @@ grub_usb_control_msg (grub_usb_device_t dev,
+ data_addr = grub_dma_get_phys (data_chunk);
+ grub_memcpy ((char *) data, data_in, size);
+
+- grub_arch_sync_dma_caches (data, size);
+-
+ grub_dprintf ("usb",
+ "control: reqtype=0x%02x req=0x%02x val=0x%02x idx=0x%02x size=%lu\n",
+ reqtype, request, value, index, (unsigned long)size);
+@@ -164,8 +161,6 @@ grub_usb_control_msg (grub_usb_device_t dev,
+ setupdata->value = value;
+ setupdata->index = index;
+ setupdata->length = size;
+- grub_arch_sync_dma_caches (setupdata, sizeof (*setupdata));
+-
+ transfer->transactions[0].size = sizeof (*setupdata);
+ transfer->transactions[0].pid = GRUB_USB_TRANSFER_TYPE_SETUP;
+ transfer->transactions[0].data = setupdata_addr;
+@@ -207,13 +202,11 @@ grub_usb_control_msg (grub_usb_device_t dev,
+ grub_free (transfer->transactions);
+
+ grub_free (transfer);
++ grub_dma_free (data_chunk);
+ grub_dma_free (setupdata_chunk);
+
+- grub_arch_sync_dma_caches (data, size0);
+ grub_memcpy (data_in, (char *) data, size0);
+
+- grub_dma_free (data_chunk);
+-
+ return err;
+ }
+
+@@ -243,10 +236,7 @@ grub_usb_bulk_setup_readwrite (grub_usb_device_t dev,
+ data = grub_dma_get_virt (data_chunk);
+ data_addr = grub_dma_get_phys (data_chunk);
+ if (type == GRUB_USB_TRANSFER_TYPE_OUT)
+- {
+- grub_memcpy ((char *) data, data_in, size);
+- grub_arch_sync_dma_caches (data, size);
+- }
++ grub_memcpy ((char *) data, data_in, size);
+
+ /* Create a transfer. */
+ transfer = grub_malloc (sizeof (struct grub_usb_transfer));
+@@ -316,13 +306,9 @@ grub_usb_bulk_finish_readwrite (grub_usb_transfer_t transfer)
+ dev->toggle[transfer->endpoint] = toggle;
+
+ if (transfer->dir == GRUB_USB_TRANSFER_TYPE_IN)
+- {
+- grub_arch_sync_dma_caches (grub_dma_get_virt (transfer->data_chunk),
+- transfer->size + 1);
+- grub_memcpy (transfer->data, (void *)
+- grub_dma_get_virt (transfer->data_chunk),
+- transfer->size + 1);
+- }
++ grub_memcpy (transfer->data, (void *)
++ grub_dma_get_virt (transfer->data_chunk),
++ transfer->size + 1);
+
+ grub_free (transfer->transactions);
+ grub_dma_free (transfer->data_chunk);
+--
+2.9.2
+