1 // SPDX-License-Identifier: GPL-2.0+
3 * Tests for mbr command
5 * Copyright 2023 Matrox Video
14 #include <asm/global_data.h>
15 #include <dm/device-internal.h>
17 #include <test/suites.h>
20 DECLARE_GLOBAL_DATA_PTR;
22 * Requirements for running test manually:
23 * mmc6.img - File size needs to be at least 12 MiB
25 * Command to create mmc6.img:
26 * $ dd if=/dev/zero of=mmc6.img bs=12M count=1
28 * To run this test manually, place mmc6.img into the same directory as u-boot,
30 * $ ./u-boot -Tc 'ut mbr'
32 * To run this test as part of U-Boot test:
33 * $ ./test/py/test.py --bd sandbox --build -k ut_dm -v
34 * Note: mmc6.img will be created by the test suit.
37 static char * mbr_parts_header = "setenv mbr_parts '";
38 static char * mbr_parts_p1 = "uuid_disk=0x12345678;name=p1,start=8M,bootable,size=1M,id=0x0e";
39 static char * mbr_parts_p2 = ";name=p2,size=1M,id=0x0e";
40 static char * mbr_parts_p3 = ";name=p3,size=1M,id=0x0e";
41 static char * mbr_parts_p4 = ";name=p4,size=1M,id=0x0e";
42 static char * mbr_parts_p5 = ";name=[ext],size=2M,id=0x05;name=p5,size=1M,id=0x0e";
43 static char * mbr_parts_tail = "'";
47 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
48 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 00 |...%$..@........|
49 000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
50 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
51 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
53 static unsigned mbr_cmp_start = 0x1B8;
54 static unsigned mbr_cmp_size = 0x48;
55 static unsigned char mbr_parts_ref_p1[] = {
56 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
57 0x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
65 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
66 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
67 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 00 |%..F...H........|
68 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
69 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
71 static unsigned char mbr_parts_ref_p2[] = {
72 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
73 0x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
74 0x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
80 * Three MBR partitions
81 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
82 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
83 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
84 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 00 |...f%..P........|
85 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
87 static unsigned char mbr_parts_ref_p3[] = {
88 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
89 0x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
90 0x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x46,
91 0x06, 0x01, 0x0e, 0x66, 0x25, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
97 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
98 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
99 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
100 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
101 000001f0 26 01 0e 87 06 01 00 58 00 00 00 08 00 00 55 aa |&......X......U.|
103 static unsigned char mbr_parts_ref_p4[] = {
104 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
105 0x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
106 0x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x46,
107 0x06, 0x01, 0x0e, 0x66, 0x25, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x66,
108 0x26, 0x01, 0x0e, 0x87, 0x06, 0x01, 0x00, 0x58, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x55, 0xaa
112 * Five MBR partitions
113 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
114 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
115 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
116 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
117 000001f0 26 01 05 a7 26 01 00 58 00 00 00 10 00 00 55 aa |&...&..X......U.|
119 static unsigned char mbr_parts_ref_p5[] = {
120 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
121 0x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
122 0x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x46,
123 0x06, 0x01, 0x0e, 0x66, 0x25, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x66,
124 0x26, 0x01, 0x05, 0xa7, 0x26, 0x01, 0x00, 0x58, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xaa
126 static unsigned ebr_cmp_start = 0x1B8;
127 static unsigned ebr_cmp_size = 0x48;
130 00b001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87 |................|
131 00b001c0 07 01 0e a7 26 01 00 08 00 00 00 08 00 00 00 00 |....&...........|
132 00b001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
133 00b001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
134 00b001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
136 static unsigned char ebr_parts_ref_p5[] = {
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,
138 0x07, 0x01, 0x0e, 0xa7, 0x26, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
144 /* Fill write buffers with pseudo-random data */
145 static void init_write_buffers(char *mbr_wb, size_t mbr_wb_size,
146 char *ebr_wb, size_t ebr_wb_size, unsigned seed)
148 while (mbr_wb_size--) {
151 seed += 17 + mbr_wb_size/4;
153 while (ebr_wb_size--) {
156 seed += 17 + ebr_wb_size/4;
160 /* Build string with MBR partition(s) layout */
161 static unsigned build_mbr_parts(char *buf, size_t buf_size, unsigned num_parts)
163 size_t bytes_remaining, cur_str_size;
166 if (!num_parts || num_parts > 5 || !buf)
171 bytes_remaining = buf_size;
173 cur_str_size = sizeof(mbr_parts_header);
174 if (cur_str_size + 1 > bytes_remaining)
176 strcat(cur_buf, mbr_parts_header);
177 bytes_remaining -= cur_str_size;
179 if (num_parts >= 1) {
180 cur_str_size = sizeof(mbr_parts_p1);
181 if (cur_str_size + 1 > bytes_remaining)
183 strcat(cur_buf, mbr_parts_p1);
184 bytes_remaining -= cur_str_size;
186 if (num_parts >= 2) {
187 cur_str_size = sizeof(mbr_parts_p2);
188 if (cur_str_size + 1 > bytes_remaining)
190 strcat(cur_buf, mbr_parts_p2);
191 bytes_remaining -= cur_str_size;
193 if (num_parts >= 3) {
194 cur_str_size = sizeof(mbr_parts_p3);
195 if (cur_str_size + 1 > bytes_remaining)
197 strcat(cur_buf, mbr_parts_p3);
198 bytes_remaining -= cur_str_size;
200 if (num_parts == 4) {
201 cur_str_size = sizeof(mbr_parts_p4);
202 if (cur_str_size + 1 > bytes_remaining)
204 strcat(cur_buf, mbr_parts_p4);
205 bytes_remaining -= cur_str_size;
208 else if (num_parts == 5) {
209 cur_str_size = sizeof(mbr_parts_p5);
210 if (cur_str_size + 1 > bytes_remaining)
212 strcat(cur_buf, mbr_parts_p5);
213 bytes_remaining -= cur_str_size;
220 cur_str_size = sizeof(mbr_parts_tail);
221 if (cur_str_size + 1 > bytes_remaining)
223 strcat(cur_buf, mbr_parts_tail);
228 static int mbr_test_run(struct unit_test_state *uts)
230 struct blk_desc *mmc_dev_desc;
231 unsigned char mbr_wbuf[512], ebr_wbuf[512], rbuf[512];
232 char mbr_parts_buf[256];
233 ulong mbr_wa, ebr_wa, ra, ebr_blk, mbr_parts_max;
237 /* Enable the mmc6 node for this test */
238 root = oftree_root(oftree_default());
239 node = ofnode_find_subnode(root, "mmc6");
240 ut_assert(ofnode_valid(node));
241 ut_assertok(lists_bind_fdt(gd->dm_root, node, &dev, NULL, false));
244 * 1 byte for null character
247 mbr_parts_max = 1 + 2 +
248 strlen(mbr_parts_header) +
249 strlen(mbr_parts_p1) +
250 strlen(mbr_parts_p2) +
251 strlen(mbr_parts_p3) +
252 max(strlen(mbr_parts_p4), strlen(mbr_parts_p5)) +
253 strlen(mbr_parts_tail);
254 ut_assertf(sizeof(mbr_parts_buf) >= mbr_parts_max, "Buffer avail: %ld; buffer req: %ld\n",
255 sizeof(mbr_parts_buf), mbr_parts_max);
257 mbr_wa = map_to_sysmem(mbr_wbuf);
258 ebr_wa = map_to_sysmem(ebr_wbuf);
259 ra = map_to_sysmem(rbuf);
260 ebr_blk = (ulong)0xB00000 / 0x200;
262 /* Make sure mmc6 exists */
263 ut_asserteq(6, blk_get_device_by_str("mmc", "6", &mmc_dev_desc));
264 ut_assertok(console_record_reset_enable());
265 ut_assertok(run_commandf("mmc dev 6"));
266 ut_assert_nextline("switch to partitions #0, OK");
267 ut_assert_nextline("mmc6 is current device");
268 ut_assertok(ut_check_console_end(uts));
270 /* Make sure mmc6 is 12+ MiB in size */
271 ut_assertok(run_commandf("mmc read 0x%lx 0x%lx 1", ra, (ulong)0xBFFE00 / 0x200));
273 /* Test one MBR partition */
274 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
275 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 1));
276 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
277 memset(rbuf, 0, sizeof(rbuf));
278 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
279 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
280 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
281 memset(rbuf, 0, sizeof(rbuf));
282 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
283 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
284 ut_assertok(console_record_reset_enable());
285 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
286 ut_assertok(run_commandf("mbr write mmc 6"));
287 ut_assert_nextline("MBR: write success!");
288 ut_assertok(run_commandf("mbr verify mmc 6"));
289 ut_assert_nextline("MBR: verify success!");
290 memset(rbuf, 0, sizeof(rbuf));
291 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
292 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
293 ut_assertok(ut_check_console_end(uts));
295 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
296 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 00 |...%$..@........|
297 000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
298 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
299 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
301 memset(rbuf, 0, sizeof(rbuf));
302 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
303 for (unsigned i = 0; i < mbr_cmp_size; i++) {
304 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p1[i],
305 "1P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
306 mbr_cmp_start + i, mbr_parts_ref_p1[i], rbuf[mbr_cmp_start + i]);
309 /* Test two MBR partitions */
310 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
311 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 2));
312 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
313 memset(rbuf, 0, sizeof(rbuf));
314 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
315 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
316 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
317 memset(rbuf, 0, sizeof(rbuf));
318 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
319 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
320 ut_assertok(console_record_reset_enable());
321 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
322 ut_assertok(run_commandf("mbr write mmc 6"));
323 ut_assert_nextline("MBR: write success!");
324 ut_assertok(run_commandf("mbr verify mmc 6"));
325 ut_assert_nextline("MBR: verify success!");
326 memset(rbuf, 0, sizeof(rbuf));
327 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
328 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
329 ut_assertok(ut_check_console_end(uts));
331 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
332 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
333 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 00 |%..F...H........|
334 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
335 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
337 memset(rbuf, 0, sizeof(rbuf));
338 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
339 for (unsigned i = 0; i < mbr_cmp_size; i++) {
340 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p2[i],
341 "2P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
342 mbr_cmp_start + i, mbr_parts_ref_p2[i], rbuf[mbr_cmp_start + i]);
345 /* Test three MBR partitions */
346 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
347 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 3));
348 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
349 memset(rbuf, 0, sizeof(rbuf));
350 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
351 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
352 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
353 memset(rbuf, 0, sizeof(rbuf));
354 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
355 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
356 ut_assertok(console_record_reset_enable());
357 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
358 ut_assertok(run_commandf("mbr write mmc 6"));
359 ut_assert_nextline("MBR: write success!");
360 ut_assertok(run_commandf("mbr verify mmc 6"));
361 ut_assert_nextline("MBR: verify success!");
362 memset(rbuf, 0, sizeof(rbuf));
363 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
364 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
365 ut_assertok(ut_check_console_end(uts));
367 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
368 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
369 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
370 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 00 |...f%..P........|
371 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
373 memset(rbuf, 0, sizeof(rbuf));
374 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
375 for (unsigned i = 0; i < mbr_cmp_size; i++) {
376 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p3[i],
377 "3P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
378 mbr_cmp_start + i, mbr_parts_ref_p3[i], rbuf[mbr_cmp_start + i]);
381 /* Test four MBR partitions */
382 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
383 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 4));
384 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
385 memset(rbuf, 0, sizeof(rbuf));
386 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
387 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
388 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
389 memset(rbuf, 0, sizeof(rbuf));
390 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
391 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
392 ut_assertok(console_record_reset_enable());
393 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
394 ut_assertok(run_commandf("mbr write mmc 6"));
395 ut_assert_nextline("MBR: write success!");
396 ut_assertok(run_commandf("mbr verify mmc 6"));
397 ut_assert_nextline("MBR: verify success!");
398 memset(rbuf, 0, sizeof(rbuf));
399 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
400 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
401 ut_assertok(ut_check_console_end(uts));
403 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
404 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
405 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
406 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
407 000001f0 26 01 0e 87 06 01 00 58 00 00 00 08 00 00 55 aa |&......X......U.|
409 memset(rbuf, 0, sizeof(rbuf));
410 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
411 for (unsigned i = 0; i < mbr_cmp_size; i++) {
412 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p4[i],
413 "4P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
414 mbr_cmp_start + i, mbr_parts_ref_p4[i], rbuf[mbr_cmp_start + i]);
417 /* Test five MBR partitions */
418 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
419 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 5));
420 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
421 memset(rbuf, 0, sizeof(rbuf));
422 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
423 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
424 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
425 memset(rbuf, 0, sizeof(rbuf));
426 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
427 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
428 ut_assertok(console_record_reset_enable());
429 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
430 ut_assertf(0 == run_commandf("mbr write mmc 6"), "Invalid partitions string: %s\n", mbr_parts_buf);
431 ut_assert_nextline("MBR: write success!");
432 ut_assertok(run_commandf("mbr verify mmc 6"));
433 ut_assert_nextline("MBR: verify success!");
434 ut_assertok(ut_check_console_end(uts));
436 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
437 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
438 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
439 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
440 000001f0 26 01 05 a7 26 01 00 58 00 00 00 10 00 00 55 aa |&...&..X......U.|
442 memset(rbuf, 0, sizeof(rbuf));
443 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
444 for (unsigned i = 0; i < mbr_cmp_size; i++) {
445 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p5[i],
446 "5P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
447 mbr_cmp_start + i, mbr_parts_ref_p5[i], rbuf[mbr_cmp_start + i]);
450 00b001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87 |................|
451 00b001c0 07 01 0e a7 26 01 00 08 00 00 00 08 00 00 00 00 |....&...........|
452 00b001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
453 00b001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
454 00b001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
456 memset(rbuf, 0, sizeof(rbuf));
457 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
458 for (unsigned i = 0; i < ebr_cmp_size; i++) {
459 ut_assertf(rbuf[ebr_cmp_start + i] == ebr_parts_ref_p5[i],
460 "5P EBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
461 ebr_cmp_start + i, ebr_parts_ref_p5[i], rbuf[ebr_cmp_start + i]);
467 /* Declare mbr test */
468 UNIT_TEST(mbr_test_run, UT_TESTF_CONSOLE_REC, mbr_test);
470 int do_ut_mbr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
472 struct unit_test *tests = UNIT_TEST_SUITE_START(mbr_test);
473 const int n_ents = UNIT_TEST_SUITE_COUNT(mbr_test);
475 return cmd_ut_category("mbr", "mbr_test_", tests, n_ents, argc, argv);
478 static int dm_test_cmd_mbr(struct unit_test_state *uts)
480 return mbr_test_run(uts);
483 DM_TEST(dm_test_cmd_mbr, UT_TESTF_SCAN_FDT | UT_TESTF_CONSOLE_REC);