mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	binman: Correct fmap output on x86
Normally x86 platforms use the end-at-4gb option. This currently produces an FMAP with positions which have a large offset. The use of end-at-4gb is a useful convenience within binman, but we don't really want to export a map with these offsets. Fix this by subtracting the 'skip at start' parameter. Also put the code which convers names to fmap format, for clarity. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		| @@ -68,6 +68,7 @@ class Section(object): | |||||||
|         self._end_4gb = False |         self._end_4gb = False | ||||||
|         self._name_prefix = '' |         self._name_prefix = '' | ||||||
|         self._entries = OrderedDict() |         self._entries = OrderedDict() | ||||||
|  |         self._image_pos = None | ||||||
|         if not test: |         if not test: | ||||||
|             self._ReadNode() |             self._ReadNode() | ||||||
|             self._ReadEntries() |             self._ReadEntries() | ||||||
| @@ -124,7 +125,10 @@ class Section(object): | |||||||
|     def SetCalculatedProperties(self): |     def SetCalculatedProperties(self): | ||||||
|         state.SetInt(self._node, 'offset', self._offset) |         state.SetInt(self._node, 'offset', self._offset) | ||||||
|         state.SetInt(self._node, 'size', self._size) |         state.SetInt(self._node, 'size', self._size) | ||||||
|         state.SetInt(self._node, 'image-pos', self._image_pos) |         image_pos = self._image_pos | ||||||
|  |         if self._parent_section: | ||||||
|  |             image_pos -= self._parent_section.GetRootSkipAtStart() | ||||||
|  |         state.SetInt(self._node, 'image-pos', image_pos) | ||||||
|         for entry in self._entries.values(): |         for entry in self._entries.values(): | ||||||
|             entry.SetCalculatedProperties() |             entry.SetCalculatedProperties() | ||||||
|  |  | ||||||
| @@ -437,11 +441,17 @@ class Section(object): | |||||||
|             source_entry.Raise("Cannot find node for phandle %d" % phandle) |             source_entry.Raise("Cannot find node for phandle %d" % phandle) | ||||||
|         for entry in self._entries.values(): |         for entry in self._entries.values(): | ||||||
|             if entry._node == node: |             if entry._node == node: | ||||||
|                 if entry.data is None: |                 return entry.GetData() | ||||||
|                     return None |  | ||||||
|                 return entry.data |  | ||||||
|         source_entry.Raise("Cannot find entry for node '%s'" % node.name) |         source_entry.Raise("Cannot find entry for node '%s'" % node.name) | ||||||
|  |  | ||||||
|     def ExpandSize(self, size): |     def ExpandSize(self, size): | ||||||
|         if size != self._size: |         if size != self._size: | ||||||
|             self._size = size |             self._size = size | ||||||
|  |  | ||||||
|  |     def GetRootSkipAtStart(self): | ||||||
|  |         if self._parent_section: | ||||||
|  |             return self._parent_section.GetRootSkipAtStart() | ||||||
|  |         return self._skip_at_start | ||||||
|  |  | ||||||
|  |     def GetImageSize(self): | ||||||
|  |         return self._image._size | ||||||
|   | |||||||
| @@ -197,7 +197,8 @@ class Entry(object): | |||||||
|         """Set the value of device-tree properties calculated by binman""" |         """Set the value of device-tree properties calculated by binman""" | ||||||
|         state.SetInt(self._node, 'offset', self.offset) |         state.SetInt(self._node, 'offset', self.offset) | ||||||
|         state.SetInt(self._node, 'size', self.size) |         state.SetInt(self._node, 'size', self.size) | ||||||
|         state.SetInt(self._node, 'image-pos', self.image_pos) |         state.SetInt(self._node, 'image-pos', | ||||||
|  |                        self.image_pos - self.section.GetRootSkipAtStart()) | ||||||
|         state.CheckSetHashValue(self._node, self.GetData) |         state.CheckSetHashValue(self._node, self.GetData) | ||||||
|  |  | ||||||
|     def ProcessFdt(self, fdt): |     def ProcessFdt(self, fdt): | ||||||
|   | |||||||
| @@ -42,14 +42,17 @@ class Entry_fmap(Entry): | |||||||
|                 for subentry in entries.values(): |                 for subentry in entries.values(): | ||||||
|                     _AddEntries(areas, subentry) |                     _AddEntries(areas, subentry) | ||||||
|             else: |             else: | ||||||
|                 areas.append(fmap_util.FmapArea(entry.image_pos or 0, |                 pos = entry.image_pos | ||||||
|                                                 entry.size or 0, entry.name, 0)) |                 if pos is not None: | ||||||
|  |                     pos -= entry.section.GetRootSkipAtStart() | ||||||
|  |                 areas.append(fmap_util.FmapArea(pos or 0, entry.size or 0, | ||||||
|  |                                                 entry.name, 0)) | ||||||
|  |  | ||||||
|         entries = self.section.GetEntries() |         entries = self.section._image.GetEntries() | ||||||
|         areas = [] |         areas = [] | ||||||
|         for entry in entries.values(): |         for entry in entries.values(): | ||||||
|             _AddEntries(areas, entry) |             _AddEntries(areas, entry) | ||||||
|         return fmap_util.EncodeFmap(self.section.GetSize() or 0, self.name, |         return fmap_util.EncodeFmap(self.section.GetImageSize() or 0, self.name, | ||||||
|                                     areas) |                                     areas) | ||||||
|  |  | ||||||
|     def ObtainContents(self): |     def ObtainContents(self): | ||||||
|   | |||||||
| @@ -66,11 +66,11 @@ class Entry_u_boot_with_ucode_ptr(Entry_blob): | |||||||
|         # the U-Boot region must start at offset 7MB in the section. In this |         # the U-Boot region must start at offset 7MB in the section. In this | ||||||
|         # case the ROM starts at 0xff800000, so the offset of the first |         # case the ROM starts at 0xff800000, so the offset of the first | ||||||
|         # entry in the section corresponds to that. |         # entry in the section corresponds to that. | ||||||
|         if (self.target_offset < self.offset or |         if (self.target_offset < self.image_pos or | ||||||
|                 self.target_offset >= self.offset + self.size): |                 self.target_offset >= self.image_pos + self.size): | ||||||
|             self.Raise('Microcode pointer _dt_ucode_base_size at %08x is ' |             self.Raise('Microcode pointer _dt_ucode_base_size at %08x is outside the section ranging from %08x to %08x' % | ||||||
|                 'outside the section ranging from %08x to %08x' % |                 (self.target_offset, self.image_pos, | ||||||
|                 (self.target_offset, self.offset, self.offset + self.size)) |                  self.image_pos + self.size)) | ||||||
|  |  | ||||||
|         # Get the microcode, either from u-boot-ucode or u-boot-dtb-with-ucode. |         # Get the microcode, either from u-boot-ucode or u-boot-dtb-with-ucode. | ||||||
|         # If we have left the microcode in the device tree, then it will be |         # If we have left the microcode in the device tree, then it will be | ||||||
| @@ -90,7 +90,7 @@ class Entry_u_boot_with_ucode_ptr(Entry_blob): | |||||||
|  |  | ||||||
|         # Write the microcode offset and size into the entry |         # Write the microcode offset and size into the entry | ||||||
|         offset_and_size = struct.pack('<2L', offset, size) |         offset_and_size = struct.pack('<2L', offset, size) | ||||||
|         self.target_offset -= self.offset |         self.target_offset -= self.image_pos | ||||||
|         self.ProcessContentsUpdate(self.data[:self.target_offset] + |         self.ProcessContentsUpdate(self.data[:self.target_offset] + | ||||||
|                                    offset_and_size + |                                    offset_and_size + | ||||||
|                                    self.data[self.target_offset + 8:]) |                                    self.data[self.target_offset + 8:]) | ||||||
|   | |||||||
| @@ -49,6 +49,9 @@ FmapHeader = collections.namedtuple('FmapHeader', FMAP_HEADER_NAMES) | |||||||
| FmapArea = collections.namedtuple('FmapArea', FMAP_AREA_NAMES) | FmapArea = collections.namedtuple('FmapArea', FMAP_AREA_NAMES) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def NameToFmap(name): | ||||||
|  |     return name.replace('\0', '').replace('-', '_').upper() | ||||||
|  |  | ||||||
| def ConvertName(field_names, fields): | def ConvertName(field_names, fields): | ||||||
|     """Convert a name to something flashrom likes |     """Convert a name to something flashrom likes | ||||||
|  |  | ||||||
| @@ -62,7 +65,7 @@ def ConvertName(field_names, fields): | |||||||
|             value: value of that field (string for the ones we support) |             value: value of that field (string for the ones we support) | ||||||
|     """ |     """ | ||||||
|     name_index = field_names.index('name') |     name_index = field_names.index('name') | ||||||
|     fields[name_index] = fields[name_index].replace('\0', '').replace('-', '_').upper() |     fields[name_index] = NameToFmap(fields[name_index]) | ||||||
|  |  | ||||||
| def DecodeFmap(data): | def DecodeFmap(data): | ||||||
|     """Decode a flashmap into a header and list of areas |     """Decode a flashmap into a header and list of areas | ||||||
| @@ -100,6 +103,7 @@ def EncodeFmap(image_size, name, areas): | |||||||
|     """ |     """ | ||||||
|     def _FormatBlob(fmt, names, obj): |     def _FormatBlob(fmt, names, obj): | ||||||
|         params = [getattr(obj, name) for name in names] |         params = [getattr(obj, name) for name in names] | ||||||
|  |         ConvertName(names, params) | ||||||
|         return struct.pack(fmt, *params) |         return struct.pack(fmt, *params) | ||||||
|  |  | ||||||
|     values = FmapHeader(FMAP_SIGNATURE, 1, 0, 0, image_size, name, len(areas)) |     values = FmapHeader(FMAP_SIGNATURE, 1, 0, 0, image_size, name, len(areas)) | ||||||
|   | |||||||
| @@ -1663,6 +1663,51 @@ class TestFunctional(unittest.TestCase): | |||||||
|         self.assertEqual('tplnodtb with microc' + pos_and_size + |         self.assertEqual('tplnodtb with microc' + pos_and_size + | ||||||
|                          'ter somewhere in here', first) |                          'ter somewhere in here', first) | ||||||
|  |  | ||||||
|  |     def testFmapX86(self): | ||||||
|  |         """Basic test of generation of a flashrom fmap""" | ||||||
|  |         data = self._DoReadFile('94_fmap_x86.dts') | ||||||
|  |         fhdr, fentries = fmap_util.DecodeFmap(data[32:]) | ||||||
|  |         expected = U_BOOT_DATA + MRC_DATA + 'a' * (32 - 7) | ||||||
|  |         self.assertEqual(expected, data[:32]) | ||||||
|  |         fhdr, fentries = fmap_util.DecodeFmap(data[32:]) | ||||||
|  |  | ||||||
|  |         self.assertEqual(0x100, fhdr.image_size) | ||||||
|  |  | ||||||
|  |         self.assertEqual(0, fentries[0].offset) | ||||||
|  |         self.assertEqual(4, fentries[0].size) | ||||||
|  |         self.assertEqual('U_BOOT', fentries[0].name) | ||||||
|  |  | ||||||
|  |         self.assertEqual(4, fentries[1].offset) | ||||||
|  |         self.assertEqual(3, fentries[1].size) | ||||||
|  |         self.assertEqual('INTEL_MRC', fentries[1].name) | ||||||
|  |  | ||||||
|  |         self.assertEqual(32, fentries[2].offset) | ||||||
|  |         self.assertEqual(fmap_util.FMAP_HEADER_LEN + | ||||||
|  |                          fmap_util.FMAP_AREA_LEN * 3, fentries[2].size) | ||||||
|  |         self.assertEqual('FMAP', fentries[2].name) | ||||||
|  |  | ||||||
|  |     def testFmapX86Section(self): | ||||||
|  |         """Basic test of generation of a flashrom fmap""" | ||||||
|  |         data = self._DoReadFile('95_fmap_x86_section.dts') | ||||||
|  |         expected = U_BOOT_DATA + MRC_DATA + 'b' * (32 - 7) | ||||||
|  |         self.assertEqual(expected, data[:32]) | ||||||
|  |         fhdr, fentries = fmap_util.DecodeFmap(data[36:]) | ||||||
|  |  | ||||||
|  |         self.assertEqual(0x100, fhdr.image_size) | ||||||
|  |  | ||||||
|  |         self.assertEqual(0, fentries[0].offset) | ||||||
|  |         self.assertEqual(4, fentries[0].size) | ||||||
|  |         self.assertEqual('U_BOOT', fentries[0].name) | ||||||
|  |  | ||||||
|  |         self.assertEqual(4, fentries[1].offset) | ||||||
|  |         self.assertEqual(3, fentries[1].size) | ||||||
|  |         self.assertEqual('INTEL_MRC', fentries[1].name) | ||||||
|  |  | ||||||
|  |         self.assertEqual(36, fentries[2].offset) | ||||||
|  |         self.assertEqual(fmap_util.FMAP_HEADER_LEN + | ||||||
|  |                          fmap_util.FMAP_AREA_LEN * 3, fentries[2].size) | ||||||
|  |         self.assertEqual('FMAP', fentries[2].name) | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								tools/binman/test/94_fmap_x86.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								tools/binman/test/94_fmap_x86.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | // SPDX-License-Identifier: GPL-2.0+ | ||||||
|  | /dts-v1/; | ||||||
|  |  | ||||||
|  | / { | ||||||
|  | 	#address-cells = <1>; | ||||||
|  | 	#size-cells = <1>; | ||||||
|  |  | ||||||
|  | 	binman { | ||||||
|  | 		end-at-4gb; | ||||||
|  | 		size = <0x100>; | ||||||
|  | 		pad-byte = <0x61>; | ||||||
|  | 		u-boot { | ||||||
|  | 		}; | ||||||
|  | 		intel-mrc { | ||||||
|  | 		}; | ||||||
|  | 		fmap { | ||||||
|  | 			offset = <0xffffff20>; | ||||||
|  | 		}; | ||||||
|  | 	}; | ||||||
|  | }; | ||||||
							
								
								
									
										22
									
								
								tools/binman/test/95_fmap_x86_section.dts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								tools/binman/test/95_fmap_x86_section.dts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | // SPDX-License-Identifier: GPL-2.0+ | ||||||
|  | /dts-v1/; | ||||||
|  |  | ||||||
|  | / { | ||||||
|  | 	#address-cells = <1>; | ||||||
|  | 	#size-cells = <1>; | ||||||
|  |  | ||||||
|  | 	binman { | ||||||
|  | 		end-at-4gb; | ||||||
|  | 		size = <0x100>; | ||||||
|  | 		u-boot { | ||||||
|  | 		}; | ||||||
|  | 		section { | ||||||
|  | 			pad-byte = <0x62>; | ||||||
|  | 			intel-mrc { | ||||||
|  | 			}; | ||||||
|  | 			fmap { | ||||||
|  | 				offset = <0x20>; | ||||||
|  | 			}; | ||||||
|  | 		}; | ||||||
|  | 	}; | ||||||
|  | }; | ||||||
		Reference in New Issue
	
	Block a user