@@ -91,11 +91,42 @@ if [[ "$ARCH_OFFSET" == "0" || "$ARCH_OFFSET" == "0x0" ]]; then
9191 fi
9292fi
9393
94- BOOT_OFFSET=$(( BOOT_ADDR - ARCH_OFFSET))
95- UPDATE_OFFSET=$(( UPDATE_ADDR - ARCH_OFFSET))
94+ normalize_flash_addr () {
95+ local addr=" $1 "
96+ if [[ " $ARCH_OFFSET " == " 0x08000000" ]]; then
97+ if (( addr >= 0x0c000000 && addr < 0x10000000 )) ; then
98+ addr=$(( addr - 0x04000000 ))
99+ fi
100+ fi
101+ echo " $addr "
102+ }
103+
104+ BOOT_ADDR_NORM=" $( normalize_flash_addr " $BOOT_ADDR " ) "
105+ UPDATE_ADDR_NORM=" $( normalize_flash_addr " $UPDATE_ADDR " ) "
106+
107+ BOOT_OFFSET=$(( BOOT_ADDR_NORM - ARCH_OFFSET))
108+ UPDATE_OFFSET=$(( UPDATE_ADDR_NORM - ARCH_OFFSET))
96109BOOT_OFFSET_HEX=$( printf " 0x%x" " $BOOT_OFFSET " )
97110UPDATE_OFFSET_HEX=$( printf " 0x%x" " $UPDATE_OFFSET " )
98111
112+ get_check_config_val () {
113+ local key=" $1 "
114+ local val
115+ make -C " $WOLFBOOT_ROOT /tools/check_config" check_config RAM_CODE=0 > /dev/null
116+ val=" $( " $WOLFBOOT_ROOT /tools/check_config/check_config" | grep -m1 " ^${key} " | sed ' s/.*: *//' ) "
117+ [[ -n " $val " ]] || die " missing ${key} from tools/check_config output"
118+ echo " 0x$val "
119+ }
120+
121+ BOOT_FLAGS_ADDR=" $( get_check_config_val PART_BOOT_ENDFLAGS) "
122+ UPDATE_FLAGS_ADDR=" $( get_check_config_val PART_UPDATE_ENDFLAGS) "
123+ BOOT_FLAGS_ADDR_NORM=" $( normalize_flash_addr " $BOOT_FLAGS_ADDR " ) "
124+ UPDATE_FLAGS_ADDR_NORM=" $( normalize_flash_addr " $UPDATE_FLAGS_ADDR " ) "
125+ BOOT_FLAGS_OFFSET=$(( BOOT_FLAGS_ADDR_NORM - ARCH_OFFSET))
126+ UPDATE_FLAGS_OFFSET=$(( UPDATE_FLAGS_ADDR_NORM - ARCH_OFFSET))
127+ BOOT_FLAGS_OFFSET_HEX=$( printf " 0x%x" " $BOOT_FLAGS_OFFSET " )
128+ UPDATE_FLAGS_OFFSET_HEX=$( printf " 0x%x" " $UPDATE_FLAGS_OFFSET " )
129+
99130M33MU_TZ_ARGS=(--no-tz)
100131if [[ " ${TZEN} " == " 1" ]]; then
101132 M33MU_TZ_ARGS=()
@@ -106,6 +137,17 @@ if command -v stdbuf >/dev/null 2>&1; then
106137 STDBUF=" stdbuf -o0 -e0"
107138fi
108139
140+ SCENARIOS_RAW=" ${SCENARIOS:- } "
141+ SCENARIOS_UP=" $( echo " $SCENARIOS_RAW " | tr ' [:lower:]' ' [:upper:]' | tr -d ' ' | sed -e ' s/,,*/,/g' -e ' s/^,//' -e ' s/,$//' ) "
142+
143+ want_scenario () {
144+ local s=" $1 "
145+ if [[ -z " $SCENARIOS_UP " ]]; then
146+ return 0
147+ fi
148+ echo " $SCENARIOS_UP " | grep -Eq " (^|,)$s (,|$)"
149+ }
150+
109151EMU_PATH=" $EMU_APPS /$EMU_DIR "
110152WOLFBOOT_BIN=" $WOLFBOOT_ROOT /wolfboot.bin"
111153FACTORY_FLASH=" $EMU_PATH /factory.bin"
@@ -203,12 +245,11 @@ assemble_factory() {
203245
204246print_partition_flags () {
205247 local label=" $1 "
206- python3 - " $FACTORY_FLASH " " $BOOT_ADDR " " $UPDATE_ADDR " " $PART_SIZE " " $SECTOR_SIZE " << 'PY ' | sed "s/^/==> ${label}: /"
248+ python3 - " $FACTORY_FLASH " " $BOOT_FLAGS_OFFSET_HEX " " $UPDATE_FLAGS_OFFSET_HEX " " $SECTOR_SIZE " << 'PY ' | sed "s/^/==> ${label}: /"
207249import sys
208- path, boot_s, update_s, size_s, sect_s = sys.argv[1:6 ]
250+ path, boot_s, update_s, sect_s = sys.argv[1:5 ]
209251boot = int(boot_s, 0)
210252update = int(update_s, 0)
211- size = int(size_s, 0)
212253sect = int(sect_s, 0)
213254
214255def decode(state):
@@ -224,29 +265,29 @@ def decode(state):
224265 return "SUCCESS(0x00)"
225266 return f"0x{state:02x}"
226267
227- def read_state(addr ):
268+ def read_state(endflags ):
228269 try:
229270 with open(path, "rb") as f:
230- f.seek(addr + size - 4)
271+ f.seek(endflags - 4)
231272 magic = f.read(4)
232273 if magic != b"BOOT":
233274 return None
234- f.seek(addr + size - 5)
275+ f.seek(endflags - 5)
235276 b = f.read(1)
236277 if not b:
237278 return None
238279 return b[0]
239280 except Exception:
240281 return None
241282
242- def read_state_alt(addr ):
283+ def read_state_alt(endflags ):
243284 try:
244285 with open(path, "rb") as f:
245- f.seek(addr + size - sect - 4)
286+ f.seek(endflags - sect - 4)
246287 magic = f.read(4)
247288 if magic != b"BOOT":
248289 return None
249- f.seek(addr + size - sect - 5)
290+ f.seek(endflags - sect - 5)
250291 b = f.read(1)
251292 if not b:
252293 return None
@@ -392,83 +433,93 @@ make -C "$EMU_APPS" TARGET="$TARGET" TZEN="${TZEN:-0}" EMU_VERSION=4 IMAGE_HEADE
392433make -C " $EMU_APPS " TARGET=" $TARGET " TZEN=" ${TZEN:- 0} " EMU_VERSION=7 IMAGE_HEADER_SIZE=" $IMAGE_HEADER_SIZE " sign-emu
393434make -C " $EMU_APPS " TARGET=" $TARGET " TZEN=" ${TZEN:- 0} " EMU_VERSION=8 IMAGE_HEADER_SIZE=" $IMAGE_HEADER_SIZE " sign-emu
394435
395- assemble_factory
396-
397- log " Scenario A: factory boot"
398- print_partition_flags " Scenario A: flags before factory run"
399- log " factory run: boot image v1, expect UART get_version=1"
400- set +e
401- $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
402- --timeout " $BOOT_TIMEOUT " --quit-on-faults \
403- " $FACTORY_FLASH " > " $EMU_PATH /factory.log" 2>&1
404- factory_rc=$?
405- set -e
406- if ! grep -q " get_version=1" " $EMU_PATH /factory.log" ; then
407- tail -n 80 " $EMU_PATH /factory.log" | sed ' s/^/ | /'
408- die " factory run: expected get_version=1"
409- fi
410- if [[ $factory_rc -ne 0 && $factory_rc -ne 127 ]]; then
411- die " factory run: m33mu exited with $factory_rc "
436+ if want_scenario " A" ; then
437+ assemble_factory
438+
439+ log " Scenario A: factory boot"
440+ print_partition_flags " Scenario A: flags before factory run"
441+ log " factory run: boot image v1, expect UART get_version=1"
442+ set +e
443+ $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
444+ --timeout " $BOOT_TIMEOUT " --quit-on-faults \
445+ " $FACTORY_FLASH " > " $EMU_PATH /factory.log" 2>&1
446+ factory_rc=$?
447+ set -e
448+ if ! grep -q " get_version=1" " $EMU_PATH /factory.log" ; then
449+ tail -n 80 " $EMU_PATH /factory.log" | sed ' s/^/ | /'
450+ die " factory run: expected get_version=1"
451+ fi
452+ if [[ $factory_rc -ne 0 && $factory_rc -ne 127 ]]; then
453+ die " factory run: m33mu exited with $factory_rc "
454+ fi
455+ log " factory run: ok (version=1)"
456+
457+ log " Scenario A: receive v7 update without trigger (expect BKPT 0x4D, stay on v1)"
458+ assemble_factory
459+ run_update_scenario " scenario_a_update_v7" " $UPDATE_IMAGE_V7 " 7 0x4d
460+ print_partition_versions " Scenario A: v7 update stored, version remains 1"
412461fi
413- log " factory run: ok (version=1)"
414462
415- log " Scenario A: receive v7 update without trigger (expect BKPT 0x4D, stay on v1)"
416- assemble_factory
417- run_update_scenario " scenario_a_update_v7" " $UPDATE_IMAGE_V7 " 7 0x4d
418- print_partition_versions " Scenario A: v7 update stored, version remains 1"
463+ if want_scenario " B" ; then
464+ log " Scenario B: successful update from v1 to v4"
465+ assemble_factory
466+ print_partition_flags " Scenario B: flags before update"
467+ run_update_scenario " scenario_b_update" " $UPDATE_IMAGE_V4 " 4 0x47
468+
469+ for i in 1 2; do
470+ run_log=" $EMU_PATH /reboot_v4_${i} .log"
471+ log " Scenario B: reboot run $i : boot updated image v4, expect BKPT 0x4A (success)"
472+ $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
473+ --timeout " $REBOOT_TIMEOUT " --expect-bkpt=0x4a --quit-on-faults \
474+ " $FACTORY_FLASH " > " $run_log " 2>&1 || die " reboot v4 run $i : m33mu failed"
475+ grep -q " \\ [EXPECT BKPT\\ ] Success" " $run_log " || die " reboot v4 run $i : expected BKPT 0x4A"
476+ log " Scenario B: reboot run $i : BKPT 0x4A hit"
477+ done
478+ fi
419479
420- log " Scenario B: successful update from v1 to v4"
421- assemble_factory
422- print_partition_flags " Scenario B: flags before update"
423- run_update_scenario " scenario_b_update" " $UPDATE_IMAGE_V4 " 4 0x47
480+ if want_scenario " C" ; then
481+ log " Scenario C: update from v1 to v3, then fallback (no wolfBoot_success is called)"
482+ assemble_factory
483+ print_partition_flags " Scenario C: flags before update"
484+ run_update_scenario " scenario_c_update" " $UPDATE_IMAGE_V3 " 3 0x47
424485
425- for i in 1 2 ; do
426- run_log =" $EMU_PATH /reboot_v4_ ${i} .log"
427- log " Scenario B: reboot run $i : boot updated image v4, expect BKPT 0x4A (success) "
486+ log " Scenario C: first boot after update: reboot into v3 (expect BKPT 0x4B, no success call) "
487+ run_log_v3 =" $EMU_PATH /reboot_v3 .log"
488+ print_partition_flags " Scenario C: flags before v3 reboot "
428489 $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
429- --timeout " $REBOOT_TIMEOUT " --expect-bkpt=0x4a --quit-on-faults \
430- " $FACTORY_FLASH " > " $run_log " 2>&1 || die " reboot v4 run $i : m33mu failed"
431- grep -q " \\ [EXPECT BKPT\\ ] Success" " $run_log " || die " reboot v4 run $i : expected BKPT 0x4A"
432- log " Scenario B: reboot run $i : BKPT 0x4A hit"
433- done
434-
435- log " Scenario C: update from v1 to v3, then fallback (no wolfBoot_success is called)"
436- assemble_factory
437- print_partition_flags " Scenario C: flags before update"
438- run_update_scenario " scenario_c_update" " $UPDATE_IMAGE_V3 " 3 0x47
439-
440- log " Scenario C: first boot after update: reboot into v3 (expect BKPT 0x4B, no success call)"
441- run_log_v3=" $EMU_PATH /reboot_v3.log"
442- print_partition_flags " Scenario C: flags before v3 reboot"
443- $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
444- --timeout " $REBOOT_TIMEOUT " --expect-bkpt=0x4b --persist --quit-on-faults \
445- " $FACTORY_FLASH " > " $run_log_v3 " 2>&1 || die " reboot v3 run: m33mu failed"
446- grep -q " \\ [EXPECT BKPT\\ ] Success" " $run_log_v3 " || die " reboot v3 run: expected BKPT 0x4B"
447- log " Scenario C: reboot v3: BKPT 0x4B hit"
448- print_partition_flags " Scenario C: flags after v3 reboot"
449-
450- log " Scenario C: second reboot, expect v1 after fallback"
451- run_log_fallback=" $EMU_PATH /reboot_fallback_v1.log"
452- set +e
453- $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
454- --timeout " $UPDATE_TIMEOUT " --persist --quit-on-faults \
455- " $FACTORY_FLASH " > " $run_log_fallback " 2>&1
456- fallback_rc=$?
457- set -e
458- print_partition_flags " Scenario C: flags after fallback run"
459- print_partition_versions " Scenario C: versions after fallback run"
460- if ! grep -q " get_version=1" " $run_log_fallback " ; then
461- tail -n 80 " $run_log_fallback " | sed ' s/^/ | /'
462- die " fallback run: expected get_version=1"
463- fi
464- if [[ $fallback_rc -ne 0 && $fallback_rc -ne 127 ]]; then
465- die " fallback run: m33mu exited with $fallback_rc "
490+ --timeout " $REBOOT_TIMEOUT " --expect-bkpt=0x4b --persist --quit-on-faults \
491+ " $FACTORY_FLASH " > " $run_log_v3 " 2>&1 || die " reboot v3 run: m33mu failed"
492+ grep -q " \\ [EXPECT BKPT\\ ] Success" " $run_log_v3 " || die " reboot v3 run: expected BKPT 0x4B"
493+ log " Scenario C: reboot v3: BKPT 0x4B hit"
494+ print_partition_flags " Scenario C: flags after v3 reboot"
495+
496+ log " Scenario C: second reboot, expect v1 after fallback"
497+ run_log_fallback=" $EMU_PATH /reboot_fallback_v1.log"
498+ set +e
499+ $STDBUF " $M33MU " --cpu " $EMU_CPU " --uart-stdout " ${M33MU_TZ_ARGS[@]} " \
500+ --timeout " $UPDATE_TIMEOUT " --persist --quit-on-faults \
501+ " $FACTORY_FLASH " > " $run_log_fallback " 2>&1
502+ fallback_rc=$?
503+ set -e
504+ print_partition_flags " Scenario C: flags after fallback run"
505+ print_partition_versions " Scenario C: versions after fallback run"
506+ if ! grep -q " get_version=1" " $run_log_fallback " ; then
507+ tail -n 80 " $run_log_fallback " | sed ' s/^/ | /'
508+ die " fallback run: expected get_version=1"
509+ fi
510+ if [[ $fallback_rc -ne 0 && $fallback_rc -ne 127 ]]; then
511+ die " fallback run: m33mu exited with $fallback_rc "
512+ fi
513+ log " Scenario C: fallback ok (version=1)"
466514fi
467- log " Scenario C: fallback ok (version=1)"
468515
469- if [[ " $RAM_CODE " == " 1" ]]; then
470- log " Scenario S: self-update enabled (RAM_CODE=1)"
471- log " Scenario S: not enabled in this script yet"
516+ if want_scenario " S" ; then
517+ if [[ " $RAM_CODE " == " 1" ]]; then
518+ log " Scenario S: self-update enabled (RAM_CODE=1)"
519+ log " Scenario S: not enabled in this script yet"
520+ else
521+ log " Scenario S: RAM_CODE disabled, skipping"
522+ fi
472523fi
473524
474525log " ok: $TARGET emu tests passed"
0 commit comments