blob: 84b3f9585057ed1f0a32af256c8f275bf1e6bdcf [file] [log] [blame]
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02001# SPDX-License-Identifier: GPL-2.0+
Tom Rini10e47792018-05-06 17:58:06 -04002# Copyright (c) 2013, Google Inc.
Simon Glassdb749192013-05-16 13:53:28 +00003#
Simon Glassfe394112017-08-05 10:28:40 -06004# Sanity check of the FIT handling in U-Boot
Simon Glassdb749192013-05-16 13:53:28 +00005
Simon Glassdb749192013-05-16 13:53:28 +00006import os
Simon Glassfe394112017-08-05 10:28:40 -06007import pytest
Simon Glassdb749192013-05-16 13:53:28 +00008import struct
Simon Glassfe394112017-08-05 10:28:40 -06009import u_boot_utils as util
Simon Glassdb749192013-05-16 13:53:28 +000010
11# Define a base ITS which we can adjust using % and a dictionary
12base_its = '''
13/dts-v1/;
14
15/ {
16 description = "Chrome OS kernel image with one or more FDT blobs";
17 #address-cells = <1>;
18
19 images {
20 kernel@1 {
21 data = /incbin/("%(kernel)s");
22 type = "kernel";
23 arch = "sandbox";
24 os = "linux";
Julius Werner97b09cd2019-07-24 19:37:55 -070025 compression = "%(compression)s";
Simon Glassdb749192013-05-16 13:53:28 +000026 load = <0x40000>;
27 entry = <0x8>;
28 };
Karl Apsiteaad8dd72015-05-21 09:52:50 -040029 kernel@2 {
30 data = /incbin/("%(loadables1)s");
31 type = "kernel";
32 arch = "sandbox";
33 os = "linux";
34 compression = "none";
35 %(loadables1_load)s
36 entry = <0x0>;
37 };
Simon Glassdb749192013-05-16 13:53:28 +000038 fdt@1 {
39 description = "snow";
Julius Werner97b09cd2019-07-24 19:37:55 -070040 data = /incbin/("%(fdt)s");
Simon Glassdb749192013-05-16 13:53:28 +000041 type = "flat_dt";
42 arch = "sandbox";
43 %(fdt_load)s
Julius Werner97b09cd2019-07-24 19:37:55 -070044 compression = "%(compression)s";
Simon Glassdb749192013-05-16 13:53:28 +000045 signature@1 {
46 algo = "sha1,rsa2048";
47 key-name-hint = "dev";
48 };
49 };
50 ramdisk@1 {
51 description = "snow";
52 data = /incbin/("%(ramdisk)s");
53 type = "ramdisk";
54 arch = "sandbox";
55 os = "linux";
56 %(ramdisk_load)s
Julius Werner97b09cd2019-07-24 19:37:55 -070057 compression = "%(compression)s";
Simon Glassdb749192013-05-16 13:53:28 +000058 };
Karl Apsiteaad8dd72015-05-21 09:52:50 -040059 ramdisk@2 {
60 description = "snow";
61 data = /incbin/("%(loadables2)s");
62 type = "ramdisk";
63 arch = "sandbox";
64 os = "linux";
65 %(loadables2_load)s
66 compression = "none";
67 };
Simon Glassdb749192013-05-16 13:53:28 +000068 };
69 configurations {
70 default = "conf@1";
71 conf@1 {
72 kernel = "kernel@1";
73 fdt = "fdt@1";
74 %(ramdisk_config)s
Karl Apsiteaad8dd72015-05-21 09:52:50 -040075 %(loadables_config)s
Simon Glassdb749192013-05-16 13:53:28 +000076 };
77 };
78};
79'''
80
81# Define a base FDT - currently we don't use anything in this
82base_fdt = '''
83/dts-v1/;
84
85/ {
Heinrich Schuchardtdca10562019-12-18 11:05:59 +010086 #address-cells = <1>;
87 #size-cells = <0>;
88
89 model = "Sandbox Verified Boot Test";
90 compatible = "sandbox";
Simon Glassdb749192013-05-16 13:53:28 +000091
Simon Glass546bab12016-02-24 09:14:44 -070092 reset@0 {
93 compatible = "sandbox,reset";
Heinrich Schuchardtdca10562019-12-18 11:05:59 +010094 reg = <0>;
Simon Glass546bab12016-02-24 09:14:44 -070095 };
Simon Glassdb749192013-05-16 13:53:28 +000096};
97'''
98
Robert P. J. Day8445f732017-03-13 06:50:55 -040099# This is the U-Boot script that is run for each test. First load the FIT,
100# then run the 'bootm' command, then save out memory from the places where
Simon Glassdb749192013-05-16 13:53:28 +0000101# we expect 'bootm' to write things. Then quit.
102base_script = '''
Simon Glassf250d472018-11-15 18:44:02 -0700103host load hostfs 0 %(fit_addr)x %(fit)s
Simon Glassdb749192013-05-16 13:53:28 +0000104fdt addr %(fit_addr)x
105bootm start %(fit_addr)x
106bootm loados
Simon Glassf250d472018-11-15 18:44:02 -0700107host save hostfs 0 %(kernel_addr)x %(kernel_out)s %(kernel_size)x
108host save hostfs 0 %(fdt_addr)x %(fdt_out)s %(fdt_size)x
109host save hostfs 0 %(ramdisk_addr)x %(ramdisk_out)s %(ramdisk_size)x
110host save hostfs 0 %(loadables1_addr)x %(loadables1_out)s %(loadables1_size)x
111host save hostfs 0 %(loadables2_addr)x %(loadables2_out)s %(loadables2_size)x
Simon Glassdb749192013-05-16 13:53:28 +0000112'''
113
Simon Glassfe394112017-08-05 10:28:40 -0600114@pytest.mark.boardspec('sandbox')
115@pytest.mark.buildconfigspec('fit_signature')
Stephen Warren2079db32017-09-18 11:11:49 -0600116@pytest.mark.requiredtool('dtc')
Simon Glassfe394112017-08-05 10:28:40 -0600117def test_fit(u_boot_console):
Simon Glass6867ec02017-08-05 10:28:39 -0600118 def make_fname(leaf):
119 """Make a temporary filename
Simon Glassdb749192013-05-16 13:53:28 +0000120
Simon Glass6867ec02017-08-05 10:28:39 -0600121 Args:
122 leaf: Leaf name of file to create (within temporary directory)
123 Return:
124 Temporary filename
125 """
Simon Glassdb749192013-05-16 13:53:28 +0000126
Simon Glassfe394112017-08-05 10:28:40 -0600127 return os.path.join(cons.config.build_dir, leaf)
Simon Glassdb749192013-05-16 13:53:28 +0000128
Simon Glass6867ec02017-08-05 10:28:39 -0600129 def filesize(fname):
130 """Get the size of a file
Simon Glassdb749192013-05-16 13:53:28 +0000131
Simon Glass6867ec02017-08-05 10:28:39 -0600132 Args:
133 fname: Filename to check
134 Return:
135 Size of file in bytes
136 """
137 return os.stat(fname).st_size
Simon Glassdb749192013-05-16 13:53:28 +0000138
Simon Glass6867ec02017-08-05 10:28:39 -0600139 def read_file(fname):
140 """Read the contents of a file
Simon Glassdb749192013-05-16 13:53:28 +0000141
Simon Glass6867ec02017-08-05 10:28:39 -0600142 Args:
143 fname: Filename to read
144 Returns:
145 Contents of file as a string
146 """
Paul Burton4c35e972017-09-14 14:34:48 -0700147 with open(fname, 'rb') as fd:
Simon Glass6867ec02017-08-05 10:28:39 -0600148 return fd.read()
Simon Glassdb749192013-05-16 13:53:28 +0000149
Simon Glass6867ec02017-08-05 10:28:39 -0600150 def make_dtb():
151 """Make a sample .dts file and compile it to a .dtb
Simon Glassdb749192013-05-16 13:53:28 +0000152
Simon Glass6867ec02017-08-05 10:28:39 -0600153 Returns:
154 Filename of .dtb file created
155 """
156 src = make_fname('u-boot.dts')
157 dtb = make_fname('u-boot.dtb')
158 with open(src, 'w') as fd:
Tom Rini6a990412019-10-24 11:59:21 -0400159 fd.write(base_fdt)
Simon Glassfe394112017-08-05 10:28:40 -0600160 util.run_and_log(cons, ['dtc', src, '-O', 'dtb', '-o', dtb])
Simon Glass6867ec02017-08-05 10:28:39 -0600161 return dtb
Simon Glassdb749192013-05-16 13:53:28 +0000162
Simon Glass6867ec02017-08-05 10:28:39 -0600163 def make_its(params):
164 """Make a sample .its file with parameters embedded
Simon Glassdb749192013-05-16 13:53:28 +0000165
Simon Glass6867ec02017-08-05 10:28:39 -0600166 Args:
167 params: Dictionary containing parameters to embed in the %() strings
168 Returns:
169 Filename of .its file created
170 """
171 its = make_fname('test.its')
172 with open(its, 'w') as fd:
Paul Burton00f2d202017-09-14 14:34:43 -0700173 print(base_its % params, file=fd)
Simon Glass6867ec02017-08-05 10:28:39 -0600174 return its
Simon Glassdb749192013-05-16 13:53:28 +0000175
Simon Glass6867ec02017-08-05 10:28:39 -0600176 def make_fit(mkimage, params):
177 """Make a sample .fit file ready for loading
Simon Glassdb749192013-05-16 13:53:28 +0000178
Simon Glass6867ec02017-08-05 10:28:39 -0600179 This creates a .its script with the selected parameters and uses mkimage to
180 turn this into a .fit image.
Simon Glassdb749192013-05-16 13:53:28 +0000181
Simon Glass6867ec02017-08-05 10:28:39 -0600182 Args:
183 mkimage: Filename of 'mkimage' utility
184 params: Dictionary containing parameters to embed in the %() strings
185 Return:
186 Filename of .fit file created
187 """
188 fit = make_fname('test.fit')
189 its = make_its(params)
Simon Glassfe394112017-08-05 10:28:40 -0600190 util.run_and_log(cons, [mkimage, '-f', its, fit])
Simon Glass6867ec02017-08-05 10:28:39 -0600191 with open(make_fname('u-boot.dts'), 'w') as fd:
Tom Rini6a990412019-10-24 11:59:21 -0400192 fd.write(base_fdt)
Simon Glass6867ec02017-08-05 10:28:39 -0600193 return fit
Simon Glassdb749192013-05-16 13:53:28 +0000194
Simon Glass6867ec02017-08-05 10:28:39 -0600195 def make_kernel(filename, text):
196 """Make a sample kernel with test data
Simon Glassdb749192013-05-16 13:53:28 +0000197
Simon Glass6867ec02017-08-05 10:28:39 -0600198 Args:
199 filename: the name of the file you want to create
200 Returns:
201 Full path and filename of the kernel it created
202 """
203 fname = make_fname(filename)
204 data = ''
205 for i in range(100):
206 data += 'this %s %d is unlikely to boot\n' % (text, i)
207 with open(fname, 'w') as fd:
Paul Burton00f2d202017-09-14 14:34:43 -0700208 print(data, file=fd)
Simon Glass6867ec02017-08-05 10:28:39 -0600209 return fname
Simon Glassdb749192013-05-16 13:53:28 +0000210
Simon Glass6867ec02017-08-05 10:28:39 -0600211 def make_ramdisk(filename, text):
212 """Make a sample ramdisk with test data
Simon Glassdb749192013-05-16 13:53:28 +0000213
Simon Glass6867ec02017-08-05 10:28:39 -0600214 Returns:
215 Filename of ramdisk created
216 """
217 fname = make_fname(filename)
218 data = ''
219 for i in range(100):
220 data += '%s %d was seldom used in the middle ages\n' % (text, i)
221 with open(fname, 'w') as fd:
Paul Burton00f2d202017-09-14 14:34:43 -0700222 print(data, file=fd)
Simon Glass6867ec02017-08-05 10:28:39 -0600223 return fname
Simon Glassdb749192013-05-16 13:53:28 +0000224
Julius Werner97b09cd2019-07-24 19:37:55 -0700225 def make_compressed(filename):
226 util.run_and_log(cons, ['gzip', '-f', '-k', filename])
227 return filename + '.gz'
228
Simon Glass6867ec02017-08-05 10:28:39 -0600229 def find_matching(text, match):
230 """Find a match in a line of text, and return the unmatched line portion
Simon Glassdb749192013-05-16 13:53:28 +0000231
Simon Glass6867ec02017-08-05 10:28:39 -0600232 This is used to extract a part of a line from some text. The match string
233 is used to locate the line - we use the first line that contains that
234 match text.
Simon Glassdb749192013-05-16 13:53:28 +0000235
Simon Glass6867ec02017-08-05 10:28:39 -0600236 Once we find a match, we discard the match string itself from the line,
237 and return what remains.
Simon Glassdb749192013-05-16 13:53:28 +0000238
Simon Glass6867ec02017-08-05 10:28:39 -0600239 TODO: If this function becomes more generally useful, we could change it
240 to use regex and return groups.
Simon Glassdb749192013-05-16 13:53:28 +0000241
Simon Glass6867ec02017-08-05 10:28:39 -0600242 Args:
Simon Glassfe394112017-08-05 10:28:40 -0600243 text: Text to check (list of strings, one for each command issued)
Simon Glass6867ec02017-08-05 10:28:39 -0600244 match: String to search for
245 Return:
246 String containing unmatched portion of line
247 Exceptions:
248 ValueError: If match is not found
Simon Glassdb749192013-05-16 13:53:28 +0000249
Simon Glassfe394112017-08-05 10:28:40 -0600250 >>> find_matching(['first line:10', 'second_line:20'], 'first line:')
Simon Glass6867ec02017-08-05 10:28:39 -0600251 '10'
Simon Glassfe394112017-08-05 10:28:40 -0600252 >>> find_matching(['first line:10', 'second_line:20'], 'second line')
Simon Glass6867ec02017-08-05 10:28:39 -0600253 Traceback (most recent call last):
254 ...
255 ValueError: Test aborted
Simon Glassfe394112017-08-05 10:28:40 -0600256 >>> find_matching('first line:10\', 'second_line:20'], 'second_line:')
Simon Glass6867ec02017-08-05 10:28:39 -0600257 '20'
Simon Glassfe394112017-08-05 10:28:40 -0600258 >>> find_matching('first line:10\', 'second_line:20\nthird_line:30'],
259 'third_line:')
260 '30'
Simon Glass6867ec02017-08-05 10:28:39 -0600261 """
Simon Glassfe394112017-08-05 10:28:40 -0600262 __tracebackhide__ = True
263 for line in '\n'.join(text).splitlines():
Simon Glass6867ec02017-08-05 10:28:39 -0600264 pos = line.find(match)
265 if pos != -1:
266 return line[:pos] + line[pos + len(match):]
Simon Glassdb749192013-05-16 13:53:28 +0000267
Simon Glassfe394112017-08-05 10:28:40 -0600268 pytest.fail("Expected '%s' but not found in output")
Simon Glassdb749192013-05-16 13:53:28 +0000269
Simon Glassfe394112017-08-05 10:28:40 -0600270 def check_equal(expected_fname, actual_fname, failure_msg):
271 """Check that a file matches its expected contents
Simon Glassdb749192013-05-16 13:53:28 +0000272
Julius Werner88040022019-08-02 15:52:28 -0700273 This is always used on out-buffers whose size is decided by the test
274 script anyway, which in some cases may be larger than what we're
275 actually looking for. So it's safe to truncate it to the size of the
276 expected data.
277
Simon Glass6867ec02017-08-05 10:28:39 -0600278 Args:
Simon Glassfe394112017-08-05 10:28:40 -0600279 expected_fname: Filename containing expected contents
280 actual_fname: Filename containing actual contents
281 failure_msg: Message to print on failure
Simon Glass6867ec02017-08-05 10:28:39 -0600282 """
Simon Glassfe394112017-08-05 10:28:40 -0600283 expected_data = read_file(expected_fname)
284 actual_data = read_file(actual_fname)
Julius Werner88040022019-08-02 15:52:28 -0700285 if len(expected_data) < len(actual_data):
286 actual_data = actual_data[:len(expected_data)]
Simon Glassfe394112017-08-05 10:28:40 -0600287 assert expected_data == actual_data, failure_msg
Simon Glassdb749192013-05-16 13:53:28 +0000288
Simon Glassfe394112017-08-05 10:28:40 -0600289 def check_not_equal(expected_fname, actual_fname, failure_msg):
290 """Check that a file does not match its expected contents
Simon Glassdb749192013-05-16 13:53:28 +0000291
Simon Glass6867ec02017-08-05 10:28:39 -0600292 Args:
Simon Glassfe394112017-08-05 10:28:40 -0600293 expected_fname: Filename containing expected contents
294 actual_fname: Filename containing actual contents
295 failure_msg: Message to print on failure
Simon Glass6867ec02017-08-05 10:28:39 -0600296 """
Simon Glassfe394112017-08-05 10:28:40 -0600297 expected_data = read_file(expected_fname)
298 actual_data = read_file(actual_fname)
299 assert expected_data != actual_data, failure_msg
Simon Glassdb749192013-05-16 13:53:28 +0000300
Simon Glassfe394112017-08-05 10:28:40 -0600301 def run_fit_test(mkimage):
Simon Glass6867ec02017-08-05 10:28:39 -0600302 """Basic sanity check of FIT loading in U-Boot
Simon Glassdb749192013-05-16 13:53:28 +0000303
Simon Glass6867ec02017-08-05 10:28:39 -0600304 TODO: Almost everything:
305 - hash algorithms - invalid hash/contents should be detected
306 - signature algorithms - invalid sig/contents should be detected
307 - compression
308 - checking that errors are detected like:
309 - image overwriting
310 - missing images
311 - invalid configurations
312 - incorrect os/arch/type fields
313 - empty data
314 - images too large/small
315 - invalid FDT (e.g. putting a random binary in instead)
316 - default configuration selection
317 - bootm command line parameters should have desired effect
318 - run code coverage to make sure we are testing all the code
319 """
Simon Glass6867ec02017-08-05 10:28:39 -0600320 # Set up invariant files
321 control_dtb = make_dtb()
322 kernel = make_kernel('test-kernel.bin', 'kernel')
323 ramdisk = make_ramdisk('test-ramdisk.bin', 'ramdisk')
324 loadables1 = make_kernel('test-loadables1.bin', 'lenrek')
325 loadables2 = make_ramdisk('test-loadables2.bin', 'ksidmar')
326 kernel_out = make_fname('kernel-out.bin')
Julius Werner97b09cd2019-07-24 19:37:55 -0700327 fdt = make_fname('u-boot.dtb')
Simon Glass6867ec02017-08-05 10:28:39 -0600328 fdt_out = make_fname('fdt-out.dtb')
329 ramdisk_out = make_fname('ramdisk-out.bin')
330 loadables1_out = make_fname('loadables1-out.bin')
331 loadables2_out = make_fname('loadables2-out.bin')
Simon Glassdb749192013-05-16 13:53:28 +0000332
Simon Glass6867ec02017-08-05 10:28:39 -0600333 # Set up basic parameters with default values
334 params = {
335 'fit_addr' : 0x1000,
Simon Glassdb749192013-05-16 13:53:28 +0000336
Simon Glass6867ec02017-08-05 10:28:39 -0600337 'kernel' : kernel,
338 'kernel_out' : kernel_out,
339 'kernel_addr' : 0x40000,
340 'kernel_size' : filesize(kernel),
Simon Glassdb749192013-05-16 13:53:28 +0000341
Julius Werner97b09cd2019-07-24 19:37:55 -0700342 'fdt' : fdt,
Simon Glass6867ec02017-08-05 10:28:39 -0600343 'fdt_out' : fdt_out,
344 'fdt_addr' : 0x80000,
345 'fdt_size' : filesize(control_dtb),
346 'fdt_load' : '',
Simon Glassdb749192013-05-16 13:53:28 +0000347
Simon Glass6867ec02017-08-05 10:28:39 -0600348 'ramdisk' : ramdisk,
349 'ramdisk_out' : ramdisk_out,
350 'ramdisk_addr' : 0xc0000,
351 'ramdisk_size' : filesize(ramdisk),
352 'ramdisk_load' : '',
353 'ramdisk_config' : '',
Karl Apsiteaad8dd72015-05-21 09:52:50 -0400354
Simon Glass6867ec02017-08-05 10:28:39 -0600355 'loadables1' : loadables1,
356 'loadables1_out' : loadables1_out,
357 'loadables1_addr' : 0x100000,
358 'loadables1_size' : filesize(loadables1),
359 'loadables1_load' : '',
Karl Apsiteaad8dd72015-05-21 09:52:50 -0400360
Simon Glass6867ec02017-08-05 10:28:39 -0600361 'loadables2' : loadables2,
362 'loadables2_out' : loadables2_out,
363 'loadables2_addr' : 0x140000,
364 'loadables2_size' : filesize(loadables2),
365 'loadables2_load' : '',
Karl Apsiteaad8dd72015-05-21 09:52:50 -0400366
Simon Glass6867ec02017-08-05 10:28:39 -0600367 'loadables_config' : '',
Julius Werner97b09cd2019-07-24 19:37:55 -0700368 'compression' : 'none',
Simon Glass6867ec02017-08-05 10:28:39 -0600369 }
Simon Glassdb749192013-05-16 13:53:28 +0000370
Simon Glass6867ec02017-08-05 10:28:39 -0600371 # Make a basic FIT and a script to load it
372 fit = make_fit(mkimage, params)
373 params['fit'] = fit
374 cmd = base_script % params
Simon Glassdb749192013-05-16 13:53:28 +0000375
Simon Glass6867ec02017-08-05 10:28:39 -0600376 # First check that we can load a kernel
377 # We could perhaps reduce duplication with some loss of readability
Simon Glassfe394112017-08-05 10:28:40 -0600378 cons.config.dtb = control_dtb
379 cons.restart_uboot()
380 with cons.log.section('Kernel load'):
381 output = cons.run_command_list(cmd.splitlines())
382 check_equal(kernel, kernel_out, 'Kernel not loaded')
383 check_not_equal(control_dtb, fdt_out,
384 'FDT loaded but should be ignored')
385 check_not_equal(ramdisk, ramdisk_out,
386 'Ramdisk loaded but should not be')
Simon Glassdb749192013-05-16 13:53:28 +0000387
Simon Glass6867ec02017-08-05 10:28:39 -0600388 # Find out the offset in the FIT where U-Boot has found the FDT
Simon Glassfe394112017-08-05 10:28:40 -0600389 line = find_matching(output, 'Booting using the fdt blob at ')
Simon Glass6867ec02017-08-05 10:28:39 -0600390 fit_offset = int(line, 16) - params['fit_addr']
391 fdt_magic = struct.pack('>L', 0xd00dfeed)
392 data = read_file(fit)
Simon Glassdb749192013-05-16 13:53:28 +0000393
Simon Glass6867ec02017-08-05 10:28:39 -0600394 # Now find where it actually is in the FIT (skip the first word)
395 real_fit_offset = data.find(fdt_magic, 4)
Simon Glassfe394112017-08-05 10:28:40 -0600396 assert fit_offset == real_fit_offset, (
397 'U-Boot loaded FDT from offset %#x, FDT is actually at %#x' %
398 (fit_offset, real_fit_offset))
Simon Glassdb749192013-05-16 13:53:28 +0000399
Simon Glass6867ec02017-08-05 10:28:39 -0600400 # Now a kernel and an FDT
Simon Glassfe394112017-08-05 10:28:40 -0600401 with cons.log.section('Kernel + FDT load'):
Simon Glass6867ec02017-08-05 10:28:39 -0600402 params['fdt_load'] = 'load = <%#x>;' % params['fdt_addr']
403 fit = make_fit(mkimage, params)
Simon Glassfe394112017-08-05 10:28:40 -0600404 cons.restart_uboot()
405 output = cons.run_command_list(cmd.splitlines())
406 check_equal(kernel, kernel_out, 'Kernel not loaded')
407 check_equal(control_dtb, fdt_out, 'FDT not loaded')
408 check_not_equal(ramdisk, ramdisk_out,
409 'Ramdisk loaded but should not be')
Simon Glassdb749192013-05-16 13:53:28 +0000410
Simon Glass6867ec02017-08-05 10:28:39 -0600411 # Try a ramdisk
Simon Glassfe394112017-08-05 10:28:40 -0600412 with cons.log.section('Kernel + FDT + Ramdisk load'):
Simon Glass6867ec02017-08-05 10:28:39 -0600413 params['ramdisk_config'] = 'ramdisk = "ramdisk@1";'
414 params['ramdisk_load'] = 'load = <%#x>;' % params['ramdisk_addr']
415 fit = make_fit(mkimage, params)
Simon Glassfe394112017-08-05 10:28:40 -0600416 cons.restart_uboot()
417 output = cons.run_command_list(cmd.splitlines())
418 check_equal(ramdisk, ramdisk_out, 'Ramdisk not loaded')
Simon Glassdb749192013-05-16 13:53:28 +0000419
Simon Glass6867ec02017-08-05 10:28:39 -0600420 # Configuration with some Loadables
Simon Glassfe394112017-08-05 10:28:40 -0600421 with cons.log.section('Kernel + FDT + Ramdisk load + Loadables'):
Simon Glass6867ec02017-08-05 10:28:39 -0600422 params['loadables_config'] = 'loadables = "kernel@2", "ramdisk@2";'
Simon Glassfe394112017-08-05 10:28:40 -0600423 params['loadables1_load'] = ('load = <%#x>;' %
424 params['loadables1_addr'])
425 params['loadables2_load'] = ('load = <%#x>;' %
426 params['loadables2_addr'])
Simon Glass6867ec02017-08-05 10:28:39 -0600427 fit = make_fit(mkimage, params)
Simon Glassfe394112017-08-05 10:28:40 -0600428 cons.restart_uboot()
429 output = cons.run_command_list(cmd.splitlines())
430 check_equal(loadables1, loadables1_out,
431 'Loadables1 (kernel) not loaded')
432 check_equal(loadables2, loadables2_out,
433 'Loadables2 (ramdisk) not loaded')
Simon Glassdb749192013-05-16 13:53:28 +0000434
Julius Werner97b09cd2019-07-24 19:37:55 -0700435 # Kernel, FDT and Ramdisk all compressed
436 with cons.log.section('(Kernel + FDT + Ramdisk) compressed'):
437 params['compression'] = 'gzip'
438 params['kernel'] = make_compressed(kernel)
439 params['fdt'] = make_compressed(fdt)
440 params['ramdisk'] = make_compressed(ramdisk)
441 fit = make_fit(mkimage, params)
442 cons.restart_uboot()
443 output = cons.run_command_list(cmd.splitlines())
444 check_equal(kernel, kernel_out, 'Kernel not loaded')
445 check_equal(control_dtb, fdt_out, 'FDT not loaded')
Julius Werner88040022019-08-02 15:52:28 -0700446 check_not_equal(ramdisk, ramdisk_out, 'Ramdisk got decompressed?')
447 check_equal(ramdisk + '.gz', ramdisk_out, 'Ramdist not loaded')
Julius Werner97b09cd2019-07-24 19:37:55 -0700448
449
Simon Glassfe394112017-08-05 10:28:40 -0600450 cons = u_boot_console
451 try:
452 # We need to use our own device tree file. Remember to restore it
453 # afterwards.
454 old_dtb = cons.config.dtb
455 mkimage = cons.config.build_dir + '/tools/mkimage'
456 run_fit_test(mkimage)
457 finally:
458 # Go back to the original U-Boot with the correct dtb.
459 cons.config.dtb = old_dtb
460 cons.restart_uboot()