@@ -270,13 +270,24 @@ def maybe_patch_segment_data(self, f, segment_data):
270
270
)
271
271
return segment_data
272
272
273
- def save_segment (self , f , segment , checksum = None ):
273
+ def save_segment (self , f , segment , checksum = None , segment_name = None ):
274
274
"""
275
275
Save the next segment to the image file,
276
276
return next checksum value if provided
277
277
"""
278
278
segment_data = self .maybe_patch_segment_data (f , segment .data )
279
- f .write (struct .pack ("<II" , segment .addr , len (segment_data )))
279
+ segment_len = len (segment_data )
280
+ segment_name = segment_name if segment_name is not None else ""
281
+ if segment_len & 3 :
282
+ raise FatalError (
283
+ f"Invalid { segment_name } segment length { segment_len :#x} . It has to be multiple of 4."
284
+ )
285
+ SIXTEEN_MB = 0x1000000
286
+ if segment_len >= SIXTEEN_MB :
287
+ raise FatalError (
288
+ f"Invalid { segment_name } segment length { segment_len :#x} . The 16 MB limit has been exceeded."
289
+ )
290
+ f .write (struct .pack ("<II" , segment .addr , segment_len ))
280
291
f .write (segment_data )
281
292
if checksum is not None :
282
293
return ESPLoader .checksum (segment_data , checksum )
@@ -293,7 +304,8 @@ def save_flash_segment(self, f, segment, checksum=None):
293
304
segment_len_remainder = segment_end_pos % self .IROM_ALIGN
294
305
if segment_len_remainder < 0x24 :
295
306
segment .data += b"\x00 " * (0x24 - segment_len_remainder )
296
- return self .save_segment (f , segment , checksum )
307
+ segment_name = getattr (segment , "name" , None )
308
+ return self .save_segment (f , segment , checksum , segment_name )
297
309
298
310
def read_checksum (self , f ):
299
311
"""Return ESPLoader checksum from end of just-read image"""
@@ -748,7 +760,7 @@ def get_alignment_data_needed(segment):
748
760
# and checksum (ROM bootloader will only care for RAM segments and its
749
761
# correct checksums)
750
762
for segment in ram_segments :
751
- checksum = self .save_segment (f , segment , checksum )
763
+ checksum = self .save_segment (f , segment , checksum , segment . name )
752
764
total_segments += 1
753
765
self .append_checksum (f , checksum )
754
766
@@ -769,7 +781,7 @@ def get_alignment_data_needed(segment):
769
781
770
782
pad_len -= self .ROM_LOADER .BOOTLOADER_FLASH_OFFSET
771
783
pad_segment = ImageSegment (0 , b"\x00 " * pad_len , f .tell ())
772
- self .save_segment (f , pad_segment )
784
+ self .save_segment (f , pad_segment , None , segment . name )
773
785
total_segments += 1
774
786
# check the alignment
775
787
assert (f .tell () + 8 + self .ROM_LOADER .BOOTLOADER_FLASH_OFFSET ) % (
@@ -793,7 +805,9 @@ def get_alignment_data_needed(segment):
793
805
ram_segments .pop (0 )
794
806
else :
795
807
pad_segment = ImageSegment (0 , b"\x00 " * pad_len , f .tell ())
796
- checksum = self .save_segment (f , pad_segment , checksum )
808
+ checksum = self .save_segment (
809
+ f , pad_segment , checksum , segment .name
810
+ )
797
811
total_segments += 1
798
812
else :
799
813
# write the flash segment
@@ -806,7 +820,7 @@ def get_alignment_data_needed(segment):
806
820
807
821
# flash segments all written, so write any remaining RAM segments
808
822
for segment in ram_segments :
809
- checksum = self .save_segment (f , segment , checksum )
823
+ checksum = self .save_segment (f , segment , checksum , segment . name )
810
824
total_segments += 1
811
825
812
826
if self .secure_pad :
0 commit comments