[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#751704: partman-base 173: partman overwrites parts of u-boot



Control: tag -1 patch

On Wed, Jun 18, 2014 at 09:44:12PM +0200, Karsten Merker wrote:

[On sunxi-based systems, upon writing the partition table, partman
 overwrites parts of u-boot which are located between the end of
 the partition table and the beginning of the first partition.]

Hello,

the following patch solves the issue for me. I have run a
successful jessie installation on a Cubietruck with this patch
applied to a locally built d-i based on kernel 3.16 from
experimental.

If there are no objections, I would like apply it to the
partman-base git repository.

Regards,
Karsten

>From 35d41e3bfce60fd08c4da6dc0696a479c78bdcdd Mon Sep 17 00:00:00 2001
From: Karsten Merker <merker@debian.org>
Date: Tue, 12 Aug 2014 23:10:13 +0200
Subject: [PATCH] Take care of the firmware area on sunxi-based systems

By default partman calls ped_disk_clobber when writing the
partition table, but on sunxi-based systems this would overwrite
the firmware area, resulting in an unbootable system (see
bug #751704). Handle this as a special case in command_commit().
---
 parted_server.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/parted_server.c b/parted_server.c
index 55cf151..bc4523a 100644
--- a/parted_server.c
+++ b/parted_server.c
@@ -1330,6 +1330,25 @@ command_dump()
         oprintf("OK\n");
 }
 
+/* Check whether we are running on a sunxi-based system. */
+int
+is_sunxi_system()
+{
+    int cpuinfo_handle;
+    int result=0;
+    char buf[4096];
+    int length;
+
+    if ((cpuinfo_handle = open("/proc/cpuinfo", O_RDONLY)) != -1  ) {
+        length = read(cpuinfo_handle, buf, sizeof(buf)-1);
+        buf[length]='\0';
+        if (strstr(buf,"Allwinner")!=NULL)
+            result=1;
+        close(cpuinfo_handle);
+    }
+    return result;
+}
+
 void
 command_commit()
 {
@@ -1337,6 +1356,21 @@ command_commit()
         if (dev == NULL)
                 critical_error("The device %s is not opened.", device_name);
         log("command_commit()");
+
+        /*
+         * The boot device on sunxi-based systems needs special handling.
+         * By default partman calls ped_disk_clobber when writing the
+         * partition table, but on sunxi-based systems this would overwrite
+         * the firmware area, resulting in an unbootable system (see
+         * bug #751704).
+         */
+        if (is_sunxi_system() && !strcmp(disk->dev->path, "/dev/mmcblk0")) {
+                disk->needs_clobber=0;
+                log("Sunxi platform detected. Disabling ped_disk_clobber " \
+                    "for the boot device %s to protect the firmware " \
+                    "area.", disk->dev->path);
+        }
+
         open_out();
         if (disk != NULL && named_is_changed(device_name))
                 ped_disk_commit(disk);
-- 
2.1.0.rc1


-- 
Gem. Par. 28 Abs. 4 Bundesdatenschutzgesetz widerspreche ich der Nutzung
sowie der Weitergabe meiner personenbezogenen Daten für Zwecke der
Werbung sowie der Markt- oder Meinungsforschung.


Reply to: