[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openembedded-core
Subject:    [OE-core][dunfell 41/41] wic: Add 512 Byte alignment to --offset
From:       "Steve Sakoman" <steve () sakoman ! com>
Date:       2020-09-30 22:11:43
Message-ID: b9296bdeaacc1dce97aac9c9bf0d70555bb36646.1601502610.git.steve () sakoman ! com
[Download RAW message or body]

From: Joshua Watt <JPEWhacker@gmail.com>

Allows the --offset argument to use the "s" or "S" suffix to specify
that it is reporting the number of 512 byte sectors.

This is required for some SoCs where the mask ROM looks for an item at a
sector that isn't aligned to a 1KB boundary.

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 938595d1dc4abaf5f7f3a7900add3f0492b805d0)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
---
 meta/lib/oeqa/selftest/cases/wic.py      | 24 ++++++++++++++++++++++++
 scripts/lib/wic/ksparser.py              | 20 ++++++++++++++------
 scripts/lib/wic/plugins/imager/direct.py |  8 ++++----
 3 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/meta/lib/oeqa/selftest/cases/wic.py \
b/meta/lib/oeqa/selftest/cases/wic.py index a166d3f614..13b6a0cc72 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -738,6 +738,30 @@ class Wic2(WicTestCase):
                 "2:103424kiB:205824kiB:102400kiB:ext4:primary:;",
                 ])
 
+        with NamedTemporaryFile("w", suffix=".wks") as tempf:
+            # Test that partitions can be placed on a 512 byte sector boundary
+            tempf.write("bootloader --ptable gpt\n" \
+                        "part /    --source rootfs --ondisk hda --offset 65s \
--fixed-size 99M --fstype=ext4\n" \ +                        "part /bar               \
--ondisk hda --offset 102432 --fixed-size 100M --fstype=ext4\n") +            \
tempf.flush() +
+            _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
+            self.assertEqual(partlns, [
+                "1:32.5kiB:101408kiB:101376kiB:ext4:primary:;",
+                "2:102432kiB:204832kiB:102400kiB:ext4:primary:;",
+                ])
+
+        with NamedTemporaryFile("w", suffix=".wks") as tempf:
+            # Test that a partition can be placed immediately after a MSDOS \
partition table +            tempf.write("bootloader --ptable msdos\n" \
+                        "part /    --source rootfs --ondisk hda --offset 1s \
--fixed-size 100M --fstype=ext4\n") +            tempf.flush()
+
+            _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
+            self.assertEqual(partlns, [
+                "1:0.50kiB:102400kiB:102400kiB:ext4::;",
+                ])
+
         with NamedTemporaryFile("w", suffix=".wks") as tempf:
             # Test that image creation fails if the partitions would overlap
             tempf.write("bootloader --ptable gpt\n" \
diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
index ac6f427564..76cc55b848 100644
--- a/scripts/lib/wic/ksparser.py
+++ b/scripts/lib/wic/ksparser.py
@@ -51,11 +51,11 @@ class KickStartParser(ArgumentParser):
     def error(self, message):
         raise ArgumentError(None, message)
 
-def sizetype(default):
+def sizetype(default, size_in_bytes=False):
     def f(arg):
         """
         Custom type for ArgumentParser
-        Converts size string in <num>[K|k|M|G] format into the integer value
+        Converts size string in <num>[S|s|K|k|M|G] format into the integer value
         """
         try:
             suffix = default
@@ -67,12 +67,20 @@ def sizetype(default):
             except ValueError:
                 raise ArgumentTypeError("Invalid size: %r" % arg)
 
+
+        if size_in_bytes:
+            if suffix == 's' or suffix == 'S':
+                return size * 512
+            mult = 1024
+        else:
+            mult = 1
+
         if suffix == "k" or suffix == "K":
-            return size
+            return size * mult
         if suffix == "M":
-            return size * 1024
+            return size * mult * 1024
         if suffix == "G":
-            return size * 1024 * 1024
+            return size * mult * 1024 * 1024
 
         raise ArgumentTypeError("Invalid size: %r" % arg)
     return f
@@ -141,7 +149,7 @@ class KickStart():
         part.add_argument('mountpoint', nargs='?')
         part.add_argument('--active', action='store_true')
         part.add_argument('--align', type=int)
-        part.add_argument('--offset', type=sizetype("K"))
+        part.add_argument('--offset', type=sizetype("K", True))
         part.add_argument('--exclude-path', nargs='+')
         part.add_argument('--include-path', nargs='+')
         part.add_argument("--extra-space", type=sizetype("M"))
diff --git a/scripts/lib/wic/plugins/imager/direct.py \
b/scripts/lib/wic/plugins/imager/direct.py index 2f01999405..55db826e93 100644
--- a/scripts/lib/wic/plugins/imager/direct.py
+++ b/scripts/lib/wic/plugins/imager/direct.py
@@ -429,14 +429,14 @@ class PartitionedImage():
                     self.offset += align_sectors
 
             if part.offset is not None:
-                offset = (part.offset * 1024) // self.sector_size
+                offset = part.offset // self.sector_size
 
-                if offset * self.sector_size != part.offset * 1024:
-                    raise WicError("Could not place %s%s at offset %dK with sector \
size %d" % (part.disk, self.numpart, part.offset, self.sector_size)) +                \
if offset * self.sector_size != part.offset: +                    raise \
WicError("Could not place %s%s at offset %d with sector size %d" % (part.disk, \
self.numpart, part.offset, self.sector_size))  
                 delta = offset - self.offset
                 if delta < 0:
-                    raise WicError("Could not place %s%s at offset %dK: next free \
sector is %d (delta: %d)" % (part.disk, self.numpart, part.offset, self.offset, \
delta)) +                    raise WicError("Could not place %s%s at offset %d: next \
free sector is %d (delta: %d)" % (part.disk, self.numpart, part.offset, self.offset, \
delta))  
                 logger.debug("Skipping %d sectors to place %s%s at offset %dK",
                              delta, part.disk, self.numpart, part.offset)
-- 
2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#142987): https://lists.openembedded.org/g/openembedded-core/message/142987
Mute This Topic: https://lists.openembedded.org/mt/77228505/4454766
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [openembedded-core@marc.info]
-=-=-=-=-=-=-=-=-=-=-=-



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic