Looks good to me. I'd leave some spare fields in the in-image record head (zero filled), for future extension of the in-image record head.
On Sun, Jul 23, 2017 at 6:00 PM, Jan Sucan <sucan...@fit.cvut.cz> wrote: > Hello, > > this is the proposal for the new firmware file format. > > ---- Firmware file format ---- > > Data structure used is a singly linked list. Operations on it have a > linear time complexity (worst-case), but because there is only a few > records it is sufficient. > > Conditions for ordering of the records: > - checksum record is the first > - firmware image data is the last > > Checksum and image data are the only mandatory records. > > Start of the linked list is at the end of the file (and it continues > "backwards") so the file can be resized more easily when modifying > records (firmware attributes). > > Each record has an ID (1 byte) which describes the meaning of it and > its allowed values. ID is followed by the length of attribute data in > bytes (4 bytes, little-endian). The next record starts immediately > after data of the current record. > > Each record is read-write for a user except for the two read-only > records: > - checksum > - firmware image data > > ---- Records ---- > > - Checksum: string (checksum will cover everything after this record) > - License text: string (file path or complete text of the license, no > license ack is needed if not defined) > - Firmware version: integer number > - Firmware image endianness: boolean (little-endian, big-endian) > - Firmware image word size: 1,2,4 or 8 (used for endianness) > - Firmware image data: array > > ---- Operations with firmware files ---- > > - Initialize raw firmware file: create linked list structure and > checksum and firmware image data records > - Uninitialize firmware file: remove linked list structure and keep > only the original raw firmware data > - Check firmware using the checksum > - Set record's value: only for read-write records (this also creates > record which is not defined yet) > - Get record's value: for read-only and read-write records > - Remove record: only for read-write records > > > jan > > > > On Thu, 20 Jul 2017, Sepherosa Ziehau wrote: > >> Hi, >> >> On Wed, Jul 19, 2017 at 4:27 PM, Jan Sucan <sucan...@fit.cvut.cz> wrote: >>> >>> That's good and interesting idea. Attaching the config to the image >>> could unify the way in which config info is saved for both built-in >>> and non-built-in images, and also unify a code for parsing the config >>> info in the kernel firmware subsystem. Possibilities for firmware file >>> formats: >>> >>> - uuencoded >>> Pros: Config can be added, modified and removed by a text editor >>> Cons: .uu files are about 35% larger, need to implement uudecoding in >>> the kernel, config correctness checked at firmware loading time >>> >>> - binary >>> Pros: firmware data size, user-interface of the new tool can be >>> better suited for given purpose than a text editor (which is too >>> general), config correctness checked at config modifying time >>> Cons: need to create new tool for handling attached info (something >>> like kenv(1) for firmware) >>> >>> For binary firmware it will be necessary to also add some checksum >>> data in case when config is not attached and firmware data is also >>> valid config. Checksum could be computed only from firmware data or it >>> can cover the config data too. >>> >>> I think, that the second file format would be better. I can try to >>> propose a format for the attached config and post it here for a >>> review. >> >> >> Yeah, sure, go ahead :) >> >> Thank you, >> sephe >> >>> >>> >>> >>> On Tue, 18 Jul 2017, Sepherosa Ziehau wrote: >>> >>>> I'd choose plain text config per-image. BTW, is it possible to attach >>>> the config at the beginning/end of the image? Assuming we can force >>>> some image file creation rules. >>>> >>>> On Tue, Jul 11, 2017 at 8:20 PM, Ján Sučan <sucan...@fit.cvut.cz> wrote: >>>>> >>>>> >>>>> Hello, >>>>> >>>>> I would like to introduce a few ideas about the new firmware subsystem. >>>>> I >>>>> assume that it should not require adding a new system tools or >>>>> modifying >>>>> boot process. >>>>> >>>>> Simplification is the first. It would be good to remove parent-child >>>>> relationship and corresponding functionality. It would significantly >>>>> simplify firmware handling. Its only practical use is when there are >>>>> multiple images in one loadable kernel module. The module can be >>>>> unloaded >>>>> when all children are not in use. Usage of the children images is >>>>> tracked >>>>> through the counter for the parent image. If images will not be placed >>>>> inside loadable kernel modules, the parent-child mechanism won't have >>>>> any >>>>> practical meaning. I think, currently the mechanism is not used >>>>> anywhere >>>>> in >>>>> the DragonFly system and if it was, it could be easily replaced by >>>>> putting >>>>> every child image in its own module without modifying drivers. >>>>> >>>>> There are two use cases according to who will provide firmware images >>>>> to >>>>> the >>>>> system: >>>>> >>>>> - developers of DragonFly BSD (they can modify and rebuild the system) >>>>> - third-parties (they should not be required to modify and rebuild the >>>>> system) >>>>> >>>>> Providing a new non-built-in firmware should not require: >>>>> >>>>> a) system rebuild >>>>> b) system reboot >>>>> c) loading a kernel module >>>>> >>>>> All firmware images needs to have some information attached (at least, >>>>> if >>>>> ack with a license is needed) which should be >>>>> >>>>> d) stored persistently. >>>>> >>>>> The question is where to save the information for non-built-in images. >>>>> For >>>>> built-in images the info is saved in the kernel. Some possibilities >>>>> are: >>>>> >>>>> - A plain text configuration file per image. >>>>> This satisfies requirements a), b), c) and d). Disadvantage is >>>>> parsing >>>>> the >>>>> text content. >>>>> >>>>> - Kernel environment variables. >>>>> The problem with this is that they are initialized: >>>>> - by some kernel code (this violates a), b), c) ) >>>>> - manually from userland by kenv command or kenv() libc function >>>>> (violates d) ) >>>>> - in the loader.conf (violates b) since the content is processed at >>>>> boot >>>>> time) >>>>> Advantage is that the parsing is done by the kernel. >>>>> >>>>> There would be two firmware sources: kernel and filesystem. In case of >>>>> the >>>>> same image names, user could have a choice by setting a kernel >>>>> environment >>>>> variable, firmware from which source has higher priority and will be >>>>> provided to consumer. >>>>> >>>>> >>>>> I will be happy for a comments and ideas >>>>> jan >>>>> >>>> >>>> >>>> >>>> -- >>>> Tomorrow Will Never Die >>>> >>> >> >> >> >> -- >> Tomorrow Will Never Die >> > -- Tomorrow Will Never Die