Le ven. 19 janv. 2024 à 12:40, davide.cardillo via lists.openembedded.org <davide.cardillo=seco....@lists.openembedded.org> a écrit :
> Issue: > the usage of a gpt table with i.MX processor is not compatible by default. > This is due to a memory conflict: the main partition table is placed into > the same memory space used to flash the header of the U-Boot. This last > can not be moved since the ROM code of the i.MX6 starts to read to that > fixed address (0x400). > This problem can be solved using a feature of the GTP partition table for > witch the main table can be moved to a desired memory area. > The WIC library present in poky manages the GTP table through some > standard Linux commands (gdisk and sgdisk) which ones have already the > opportunity to perform this task. > This patch introduces this feature with the addition of some wic's > options, > used also in wks file. > > New partition placement behavior: > Since now all partitions are placed after the gpt table presents into the > first 1KB of memory (including both the gpt header at the first byte of > memory and the main partition table staring at 0x400). > Now the main gpt table can be placed in other address spaces and a > partition > can be placed also before the gpt table. Recap: > - by default, all partitions are placed sequentially, one after the other. > The first partition implicitly starts after the GPT partition table. > - adding a flag to the item of a partition into the wks file, the > partition > can be placed, starting from a fixed memory offset (neglecting the memory > space occupied by the GTP table). > Combining the moving of the main partition table and the absolute (not yet > relative) positioning of a partition, now it is possible to place one or > more > partitions before the GPT table. > > New flags: > - main-ptable-offset (size in KB): to add as property of the bootloader > item. > Specifies the main partition table location in KB. > - fixed-align (boolean): to add as property of a partition. Specifies that > the > partition must to placed with absolute offset, used in conjunction with > --align > property > > Example: > setting used for a wic for an i.MX6 processor, where the main partition > table is > placed with the absolute offset of 4MB > > bootloader --ptable gpt --main-ptable-offset 4096K > part / --source rawcopy --sourceparams="file=u-boot.imx" --ondisk mmcblk > --align 1 --size 1M --no-table --fixed-align > > Test environment: > This patch is a part of Edgehog OS (https://git.seco.com/edgehog) a > custom Yocto distribution by SECO SpA (www.seco.com), used on multiple > architectures (both ARM and x86). > This solution is widely used by all SECO customers who use hardware > solution based on NXP i.MX6 processors. > > Signed-off-by: Davide Cardillo <davide.cardi...@seco.com> > Reviewed-by: Tobias Poganiuch <tobias.pogani...@seco.com> > Tested-by: Andrea Da Col <andrea.da...@seco.com> > Tested-by: Daniel Rinaldi <daniel.rina...@seco.com> > --- > scripts/lib/wic/ksparser.py | 2 + > scripts/lib/wic/partition.py | 1 + > scripts/lib/wic/plugins/imager/direct.py | 102 +++++++++++++++++++++-- > scripts/wic | 2 +- > 4 files changed, 98 insertions(+), 9 deletions(-) > > diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py > index 0df9eb0d05..45db2eaa5d 100644 > --- a/scripts/lib/wic/ksparser.py > +++ b/scripts/lib/wic/ksparser.py > @@ -148,6 +148,7 @@ class KickStart(): > part = subparsers.add_parser('part') > part.add_argument('mountpoint', nargs='?') > part.add_argument('--active', action='store_true') > + part.add_argument('--fixed-align', action='store_true') > part.add_argument('--align', type=int) > part.add_argument('--offset', type=sizetype("K", True)) > part.add_argument('--exclude-path', nargs='+') > @@ -194,6 +195,7 @@ class KickStart(): > default='msdos') > bootloader.add_argument('--timeout', type=int) > bootloader.add_argument('--source') > + bootloader.add_argument('--main-ptable-offset', > type=sizetype("K"), default=0) > > include = subparsers.add_parser('include') > include.add_argument('path', type=cannedpathtype) > diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py > index 5275da6ed3..1bd2b457cd 100644 > --- a/scripts/lib/wic/partition.py > +++ b/scripts/lib/wic/partition.py > @@ -26,6 +26,7 @@ class Partition(): > self.args = args > self.active = args.active > self.align = args.align > + self.fixed_align = args.fixed_align > self.disk = args.disk > self.device = None > self.extra_space = args.extra_space > diff --git a/scripts/lib/wic/plugins/imager/direct.py > b/scripts/lib/wic/plugins/imager/direct.py > index 165fc2979f..efa4d7804e 100644 > --- a/scripts/lib/wic/plugins/imager/direct.py > +++ b/scripts/lib/wic/plugins/imager/direct.py > @@ -16,6 +16,7 @@ import random > import shutil > import tempfile > import uuid > +import operator > Same problem as before :( Looking at the headers of your mail, it looks like you are using https://lists.openembedded.org/g/openembedded-core to copy/paste your patch. That won't work. Try to follow the steps documented in : https://docs.yoctoproject.org/dev/contributor-guide/submit-changes.html#using-git-to-send-patches Regards, > > from time import strftime > > @@ -66,6 +67,7 @@ class DirectPlugin(ImagerPlugin): > self.workdir = self.setup_workdir(options.workdir) > self._image = None > self.ptable_format = self.ks.bootloader.ptable > + self.main_ptable_offset = self.ks.bootloader.main_ptable_offset > self.parts = self.ks.partitions > > # as a convenience, set source to the boot partition source > @@ -77,6 +79,7 @@ class DirectPlugin(ImagerPlugin): > > image_path = self._full_path(self.workdir, self.parts[0].disk, > "direct") > self._image = PartitionedImage(image_path, self.ptable_format, > + self.main_ptable_offset, > self.parts, self.native_sysroot, > options.extra_space) > > @@ -294,15 +297,27 @@ GPT_OVERHEAD = 34 > # Size of a sector in bytes > SECTOR_SIZE = 512 > > +class memoryRegion(): > + def __init__(self): > + self.start_sector = 1 > + self.end_sector = 1 > + self.part_num = 0 > + > + def __init__(self, part_num, start_sec, end_sec): > + self.part_num = part_num > + self.start_sector = start_sec > + self.end_sector = end_sec > + > class PartitionedImage(): > """ > Partitioned image in a file. > """ > > - def __init__(self, path, ptable_format, partitions, > native_sysroot=None, extra_space=0): > + def __init__(self, path, ptable_format, main_ptable_offset, > partitions, native_sysroot=None, extra_space=0): > self.path = path # Path to the image file > self.numpart = 0 # Number of allocated partitions > self.realpart = 0 # Number of partitions in the partition table > + self.fixedalign_part = 0 # Number of partitions with absolute > alignment > self.primary_part_num = 0 # Number of primary partitions (msdos) > self.extendedpart = 0 # Create extended partition before this > logical partition (msdos) > self.extended_size_sec = 0 # Size of exteded partition (msdos) > @@ -311,11 +326,13 @@ class PartitionedImage(): > self.min_size = 0 # Minimum required disk size to fit > # all partitions (in bytes) > self.ptable_format = ptable_format # Partition table format > + self.main_ptable_offset = main_ptable_offset # for GPT table, > offset > # Disk system identifier > self.identifier = random.SystemRandom().randint(1, 0xffffffff) > > self.partitions = partitions > self.partimages = [] > + self.used_memory_region = [] > # Size of a sector used in calculations > self.sector_size = SECTOR_SIZE > self.native_sysroot = native_sysroot > @@ -368,6 +385,30 @@ class PartitionedImage(): > # Converting kB to sectors for parted > part.size_sec = part.disk_size * 1024 // self.sector_size > > + def _add_busy_region(self, part_num, start_sec, end_sec): > + self.used_memory_region.append(memoryRegion(part_num, start_sec, > end_sec)) > + self.used_memory_region = sorted(self.used_memory_region, > key=operator.attrgetter('start_sector')) > + > + def _print_busy_region_list(self): > + list = "Busy memory region (in sector)\n" > + list += "\tpart#\tstart\tEnd\n" > + for num in range(len(self.used_memory_region)): > + list +="\t%s\t%s\t%s\n" % > (self.used_memory_region[num].part_num, \ > + self.used_memory_region[num].start_sector, > self.used_memory_region[num].end_sector) > + logger.debug(list) > + > + def _check_memory_region(self, start_sec, end_sec ): > + """ Check if the specified region is already flagges as used. > Returns > + zero if not used, 1 otherwise""" > + for num in range(len(self.used_memory_region)): > + region = self.used_memory_region[num] > + if ( ( region.start_sector < start_sec and start_sec < > region.end_sector) or \ > + ( region.start_sector < end_sec and end_sec < > region.end_sector) ): > + return 1 > + if ( start_sec < region.start_sector and end_sec > > region.end_sector ): > + return 1 > + return 0 > + > def layout_partitions(self): > """ Layout the partitions, meaning calculate the position of every > partition on the disk. The 'ptable_format' parameter defines the > @@ -379,6 +420,35 @@ class PartitionedImage(): > # partitions not listed in the table are not included. > num_real_partitions = len([p for p in self.partitions if not > p.no_table]) > > + # The partitions flagged as fixed alignment partition are placed > into image > + # before the others. Instead, relative-aligned partitions are > placed in a > + # serialized fashion, with control of the intersection of memory > areas. > + # The base address of the relative-aligned partitions is, as > before, > + # the maximum address accupied by the partition table > + > + # Flag as used the momoery required for partition table > + self._add_busy_region(-1, 0, MBR_OVERHEAD) > + if self.ptable_format == "gpt": > + offset = self.main_ptable_offset * 1024 // self.sector_size > + self._add_busy_region(-1, offset, offset + GPT_OVERHEAD) > + > + # Search all partition with fixed position into the image > + for num in range(len(self.partitions)): > + part = self.partitions[num] > + if not part.fixed_align: > + continue > + if not part.no_table: > + raise WicError("A partition with fixed alignment must > have no_table flag set") > + > + start_sector = (part.align * 1024 // self.sector_size) > + end_sector = start_sector + part.size_sec - 1 > + if self._check_memory_region(start_sector, end_sector) == 1: > + self._print_busy_region_list() > + raise WicError("A partition wants to use an already used > memory region (sectors %d - %d)" \ > + % (start_sector, end_sector)) > + self._add_busy_region(num, start_sector, end_sector) > + part.start = start_sector > + > # Go through partitions in the order they are added in .ks file > for num in range(len(self.partitions)): > part = self.partitions[num] > @@ -403,7 +473,7 @@ class PartitionedImage(): > if self.ptable_format == "msdos": > overhead = MBR_OVERHEAD > elif self.ptable_format == "gpt": > - overhead = GPT_OVERHEAD > + overhead = (self.main_ptable_offset * 1024 // > self.sector_size) + GPT_OVERHEAD > > # Skip one sector required for the partitioning scheme > overhead > self.offset += overhead > @@ -418,7 +488,7 @@ class PartitionedImage(): > self.offset += 2 > > align_sectors = 0 > - if part.align: > + if not part.fixed_align and part.align: > # If not first partition and we do have alignment set we > need > # to align the partition. > # FIXME: This leaves a empty spaces to the disk. To fill > the > @@ -440,7 +510,7 @@ class PartitionedImage(): > # increase the offset so we actually start the > partition on right alignment > self.offset += align_sectors > > - if part.offset is not None: > + if not part.fixed_align and part.offset is not None: > offset = part.offset // self.sector_size > > if offset * self.sector_size != part.offset: > @@ -455,14 +525,20 @@ class PartitionedImage(): > > self.offset = offset > > - part.start = self.offset > - self.offset += part.size_sec > - > if not part.no_table: > part.num = self.realpart > else: > part.num = 0 > > + if not part.fixed_align: > + part.start = self.offset > + self.offset += part.size_sec > + if self._check_memory_region(part.start, self.offset) == > 1: > + self._print_busy_region_list() > + raise WicError("A partition wants to use an already > used memory region (sectors %d - %d)" \ > + % (part.start, self.offset)) > + self._add_busy_region(part.num, part.start, self.offset) > + > if self.ptable_format == "msdos" and not part.no_table: > if part.type == 'logical': > self.logical_part_cnt += 1 > @@ -482,12 +558,14 @@ class PartitionedImage(): > "sectors (%d bytes).", part.mountpoint, > part.disk, > part.num, part.start, self.offset - 1, > part.size_sec, > part.size_sec * self.sector_size) > + > + self._print_busy_region_list() > > # Once all the partitions have been layed out, we can calculate > the > # minumim disk size > self.min_size = self.offset > if self.ptable_format == "gpt": > - self.min_size += GPT_OVERHEAD > + self.min_size += (self.main_ptable_offset * 1024 // > self.sector_size) + GPT_OVERHEAD > > self.min_size *= self.sector_size > self.min_size += self.extra_space > @@ -606,6 +684,14 @@ class PartitionedImage(): > exec_native_cmd("sfdisk --part-type %s %s %s" % \ > (self.path, part.num, part.system_id), > self.native_sysroot) > + > + if self.ptable_format == "gpt" and self.main_ptable_offset > 0: > + main_ptable_sectors = self.main_ptable_offset * 1024 // > self.sector_size > + logger.debug("Move the main GPT partition table forward by %s > sector(s)", main_ptable_sectors) > + cmd = "sgdisk -j %d %s" % (main_ptable_sectors, self.path) > + #cmd = "(echo -e 'x'; echo -e 'j' ; echo -e '%d'; echo -e > 'w'; echo -e 'Y') | gdisk %s" % (main_ptable_sectors, self.path) > + exec_native_cmd(cmd, self.native_sysroot) > + > > def cleanup(self): > pass > diff --git a/scripts/wic b/scripts/wic > index 06e0b48db0..0c59a550ef 100755 > --- a/scripts/wic > +++ b/scripts/wic > @@ -59,7 +59,7 @@ from wic import help as hlp > > > def wic_logger(): > - """Create and convfigure wic logger.""" > + """Create and configure wic logger.""" > logger = logging.getLogger('wic') > logger.setLevel(logging.INFO) > > -- > 2.39.2 > > > > -- Yoann Congal Smile ECS - Tech expert
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#194034): https://lists.openembedded.org/g/openembedded-core/message/194034 Mute This Topic: https://lists.openembedded.org/mt/103828012/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-