1# SPDX-License-Identifier: GPL-2.0+ 2# Copyright (c) 2016 Google, Inc 3# Written by Simon Glass <sjg@chromium.org> 4# 5# Class for an image, the output of binman 6# 7 8from __future__ import print_function 9 10from collections import OrderedDict 11from operator import attrgetter 12import re 13import sys 14 15import fdt_util 16import bsection 17import tools 18 19class Image: 20 """A Image, representing an output from binman 21 22 An image is comprised of a collection of entries each containing binary 23 data. The image size must be large enough to hold all of this data. 24 25 This class implements the various operations needed for images. 26 27 Atrtributes: 28 _node: Node object that contains the image definition in device tree 29 _name: Image name 30 _size: Image size in bytes, or None if not known yet 31 _filename: Output filename for image 32 _sections: Sections present in this image (may be one or more) 33 34 Args: 35 test: True if this is being called from a test of Images. This this case 36 there is no device tree defining the structure of the section, so 37 we create a section manually. 38 """ 39 def __init__(self, name, node, test=False): 40 self._node = node 41 self._name = name 42 self._size = None 43 self._filename = '%s.bin' % self._name 44 if test: 45 self._section = bsection.Section('main-section', self._node, True) 46 else: 47 self._ReadNode() 48 49 def _ReadNode(self): 50 """Read properties from the image node""" 51 self._size = fdt_util.GetInt(self._node, 'size') 52 filename = fdt_util.GetString(self._node, 'filename') 53 if filename: 54 self._filename = filename 55 self._section = bsection.Section('main-section', self._node) 56 57 def GetFdtSet(self): 58 """Get the set of device tree files used by this image""" 59 return self._section.GetFdtSet() 60 61 def AddMissingProperties(self): 62 """Add properties that are not present in the device tree 63 64 When binman has completed packing the entries the offset and size of 65 each entry are known. But before this the device tree may not specify 66 these. Add any missing properties, with a dummy value, so that the 67 size of the entry is correct. That way we can insert the correct values 68 later. 69 """ 70 self._section.AddMissingProperties() 71 72 def ProcessFdt(self, fdt): 73 """Allow entries to adjust the device tree 74 75 Some entries need to adjust the device tree for their purposes. This 76 may involve adding or deleting properties. 77 """ 78 return self._section.ProcessFdt(fdt) 79 80 def GetEntryContents(self): 81 """Call ObtainContents() for the section 82 """ 83 self._section.GetEntryContents() 84 85 def GetEntryOffsets(self): 86 """Handle entries that want to set the offset/size of other entries 87 88 This calls each entry's GetOffsets() method. If it returns a list 89 of entries to update, it updates them. 90 """ 91 self._section.GetEntryOffsets() 92 93 def PackEntries(self): 94 """Pack all entries into the image""" 95 self._section.PackEntries() 96 97 def CheckSize(self): 98 """Check that the image contents does not exceed its size, etc.""" 99 self._size = self._section.CheckSize() 100 101 def CheckEntries(self): 102 """Check that entries do not overlap or extend outside the image""" 103 self._section.CheckEntries() 104 105 def SetCalculatedProperties(self): 106 self._section.SetCalculatedProperties() 107 108 def SetImagePos(self): 109 self._section.SetImagePos(0) 110 111 def ProcessEntryContents(self): 112 """Call the ProcessContents() method for each entry 113 114 This is intended to adjust the contents as needed by the entry type. 115 """ 116 self._section.ProcessEntryContents() 117 118 def WriteSymbols(self): 119 """Write symbol values into binary files for access at run time""" 120 self._section.WriteSymbols() 121 122 def BuildImage(self): 123 """Write the image to a file""" 124 fname = tools.GetOutputFilename(self._filename) 125 with open(fname, 'wb') as fd: 126 self._section.BuildSection(fd, 0) 127 128 def GetEntries(self): 129 return self._section.GetEntries() 130 131 def WriteMap(self): 132 """Write a map of the image to a .map file""" 133 filename = '%s.map' % self._name 134 fname = tools.GetOutputFilename(filename) 135 with open(fname, 'w') as fd: 136 print('%8s %8s %8s %s' % ('ImagePos', 'Offset', 'Size', 'Name'), 137 file=fd) 138 self._section.WriteMap(fd, 0) 139