@@ -419,15 +419,27 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
419419 asm volatile ("ldr r2, [%0]" ::"r" (p_res )); \
420420 asm volatile ("cmp r2, #1" :::"cc" ); \
421421 asm volatile ("bne nope" ); \
422+ asm volatile ("mvn r3, r2" :::"r3" ); \
423+ asm volatile ("cmp r3, #0xFFFFFFFE" :::"cc" ); \
424+ asm volatile ("bne nope" ); \
422425 asm volatile ("ldr r2, [%0]" ::"r" (p_res )); \
423426 asm volatile ("cmp r2, #1" :::"cc" ); \
424427 asm volatile ("bne nope" ); \
428+ asm volatile ("mvn r3, r2" :::"r3" ); \
429+ asm volatile ("cmp r3, #0xFFFFFFFE" :::"cc" ); \
430+ asm volatile ("bne nope" ); \
425431 asm volatile ("ldr r2, [%0]" ::"r" (p_res )); \
426432 asm volatile ("cmp r2, #1" :::"cc" ); \
427433 asm volatile ("bne nope" ); \
434+ asm volatile ("mvn r3, r2" :::"r3" ); \
435+ asm volatile ("cmp r3, #0xFFFFFFFE" :::"cc" ); \
436+ asm volatile ("bne nope" ); \
428437 asm volatile ("ldr r2, [%0]" ::"r" (p_res )); \
429438 asm volatile ("cmp r2, #1" :::"cc" ); \
430439 asm volatile ("bne nope" ); \
440+ asm volatile ("mvn r3, r2" :::"r3" ); \
441+ asm volatile ("cmp r3, #0xFFFFFFFE" :::"cc" ); \
442+ asm volatile ("bne nope" ); \
431443 /* Confirm that the signature is OK */ \
432444 wolfBoot_image_confirm_signature_ok (img ); \
433445 asm volatile ("nope:" ); \
@@ -460,15 +472,27 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
460472 "ldr r2, [%0]\n" \
461473 "cmp r2, #1\n" \
462474 "bne 1f\n" \
475+ "mvn r3, r2\n" \
476+ "cmp r3, #0xFFFFFFFE\n" \
477+ "bne 1f\n" \
463478 "ldr r2, [%0]\n" \
464479 "cmp r2, #1\n" \
465480 "bne 1f\n" \
481+ "mvn r3, r2\n" \
482+ "cmp r3, #0xFFFFFFFE\n" \
483+ "bne 1f\n" \
466484 "ldr r2, [%0]\n" \
467485 "cmp r2, #1\n" \
468486 "bne 1f\n" \
487+ "mvn r3, r2\n" \
488+ "cmp r3, #0xFFFFFFFE\n" \
489+ "bne 1f\n" \
469490 "ldr r2, [%0]\n" \
470491 "cmp r2, #1\n" \
471492 "bne 1f\n" \
493+ "mvn r3, r2\n" \
494+ "cmp r3, #0xFFFFFFFE\n" \
495+ "bne 1f\n" \
472496 /* Load 'img' into r0 (first argument to the function) */ \
473497 "mov r0, %1\n" \
474498 /* Load the function pointer into r3 */ \
@@ -480,7 +504,7 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
480504 "2:\n" \
481505 : /* No output operands */ \
482506 : "r" (p_res ), "r" (img ), "r" (confirm_func ) /* Input operands */ \
483- : "r0" , "r2" , "lr" /* Clobbered registers */ \
507+ : "r0" , "r2" , "r3" , " lr" /* Clobbered registers */ \
484508 ); \
485509 } while (0 )
486510#endif
@@ -507,93 +531,94 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
507531#if defined(__GNUC__ )
508532
509533#define VERIFY_VERSION_ALLOWED (fb_ok ) \
510- /* Stash the registry values */ \
511- asm volatile("push {r4, r5, r6, r7}"); \
512- /* Redundant initialization with 'failure' values */ \
513- asm volatile ("mov r0, #0" :::"r0" ); \
514- asm volatile ("mov r4, #1" :::"r4" ); \
515- asm volatile ("mov r5, #0" :::"r5" ); \
516- asm volatile ("mov r6, #2" :::"r6" ); \
517- asm volatile ("mov r7, #0" :::"r7" ); \
518- asm volatile ("mov r0, #0" :::"r0" ); \
519- asm volatile ("mov r4, #1" :::"r4" ); \
520- asm volatile ("mov r5, #0" :::"r5" ); \
521- asm volatile ("mov r6, #2" :::"r6" ); \
522- asm volatile ("mov r7, #0" :::"r7" ); \
523- /* Read the fb_ok flag, jump to end_check \
524- * if proven fb_ok == 1 */ \
525- asm volatile ("mov r0, %0" ::"r" (fb_ok ):"r0" ); \
526- asm volatile ("cmp r0, #1" :::"cc" ); \
527- asm volatile ("bne do_check" ); \
528- asm volatile ("cmp r0, #1" :::"cc" ); \
529- asm volatile ("bne do_check" ); \
530- asm volatile ("cmp r0, #1" :::"cc" ); \
531- asm volatile ("bne do_check" ); \
532- asm volatile ("b end_check" ); \
533- /* Do the actual version check: */ \
534- asm volatile ("do_check:" ); \
535- /* Read update versions to reg r5 and r7 */ \
536- asm volatile ("mov r0, #1" :::"r0" ); \
537- asm volatile ("mov r0, #1" :::"r0" ); \
538- asm volatile ("mov r0, #1" :::"r0" ); \
539- asm volatile ("bl wolfBoot_get_image_version" ); \
540- asm volatile ("mov r5, r0" :::"r5" ); \
541- asm volatile ("mov r5, r0" :::"r5" ); \
542- asm volatile ("mov r5, r0" :::"r5" ); \
543- asm volatile ("mov r0, #1" :::"r0" ); \
544- asm volatile ("mov r0, #1" :::"r0" ); \
545- asm volatile ("mov r0, #1" :::"r0" ); \
546- asm volatile ("bl wolfBoot_get_image_version" ); \
547- asm volatile ("mov r7, r0" :::"r7" ); \
548- asm volatile ("mov r7, r0" :::"r7" ); \
549- asm volatile ("mov r7, r0" :::"r7" ); \
550- /* Compare r5 and r7, if not equal, something went very wrong, */ \
551- asm volatile ("cmp r5, r7" :::"cc" ); \
552- asm volatile ("bne ." ); \
553- asm volatile ("cmp r5, r7" :::"cc" ); \
554- asm volatile ("bne .-4" ); \
555- asm volatile ("cmp r5, r7" :::"cc" ); \
556- asm volatile ("bne .-8" ); \
557- asm volatile ("cmp r5, r7" :::"cc" ); \
558- asm volatile ("bne .-12" ); \
559- /* Read current versions to reg r4 and r6 */ \
560- asm volatile ("mov r0, #0" :::"r0" ); \
561- asm volatile ("mov r0, #0" :::"r0" ); \
562- asm volatile ("mov r0, #0" :::"r0" ); \
563- asm volatile ("bl wolfBoot_get_image_version" ); \
564- asm volatile ("mov r4, r0" :::"r4" ); \
565- asm volatile ("mov r4, r0" :::"r4" ); \
566- asm volatile ("mov r4, r0" :::"r4" ); \
567- asm volatile ("mov r0, #0" :::"r0" ); \
568- asm volatile ("mov r0, #0" :::"r0" ); \
569- asm volatile ("mov r0, #0" :::"r0" ); \
570- asm volatile ("bl wolfBoot_get_image_version" ); \
571- asm volatile ("mov r6, r0" :::"r6" ); \
572- asm volatile ("mov r6, r0" :::"r6" ); \
573- asm volatile ("mov r6, r0" :::"r6" ); \
574- asm volatile ("cmp r4, r6" :::"cc" ); \
575- asm volatile ("bne ." ); \
576- asm volatile ("cmp r4, r6" :::"cc" ); \
577- asm volatile ("bne .-4" ); \
578- asm volatile ("cmp r4, r6" :::"cc" ); \
579- asm volatile ("bne .-8" ); \
580- asm volatile ("cmp r4, r6" :::"cc" ); \
581- asm volatile ("bne .-12" ); \
582- asm volatile ("mov r0, #0" :::"r0" ); \
583- asm volatile ("mov r0, #0" :::"r0" ); \
584- asm volatile ("mov r0, #0" :::"r0" ); \
585- /* Compare the two versions in registries */ \
586- asm volatile ("cmp r4, r5" :::"cc" ); \
587- asm volatile ("bge ." ); \
588- asm volatile ("cmp r6, r7" :::"cc" ); \
589- asm volatile ("bge .-4" ); \
590- asm volatile ("cmp r4, r5" :::"cc" ); \
591- asm volatile ("bge .-8" ); \
592- asm volatile ("cmp r6, r7" :::"cc" ); \
593- asm volatile ("bge .-12" ); \
594- asm volatile ("end_check:" ); \
595- /* Restore previously saved registry values */ \
596- asm volatile ("pop {r4, r5, r6, r7}" :::"r4" , "r5" , "r6" , "r7" )
534+ asm volatile( \
535+ "push {r4, r5, r6, r7}\n" \
536+ "mov r0, #0\n" \
537+ "mov r4, #1\n" \
538+ "mov r5, #0\n" \
539+ "mov r6, #2\n" \
540+ "mov r7, #0\n" \
541+ "mov r0, #0\n" \
542+ "mov r4, #1\n" \
543+ "mov r5, #0\n" \
544+ "mov r6, #2\n" \
545+ "mov r7, #0\n" \
546+ "mov r0, %0\n" \
547+ "mov r4, %0\n" \
548+ "cmp r0, #1\n" \
549+ "bne do_check\n" \
550+ "cmp r4, #1\n" \
551+ "bne do_check\n" \
552+ "cmp r0, r4\n" \
553+ "bne do_check\n" \
554+ "cmp r0, #1\n" \
555+ "bne do_check\n" \
556+ "b end_check\n" \
557+ "do_check:\n" \
558+ "mov r0, #1\n" \
559+ "mov r0, #1\n" \
560+ "mov r0, #1\n" \
561+ "bl wolfBoot_get_image_version\n" \
562+ "mov r5, r0\n" \
563+ "mov r5, r0\n" \
564+ "mov r5, r0\n" \
565+ "mov r0, #1\n" \
566+ "mov r0, #1\n" \
567+ "mov r0, #1\n" \
568+ "bl wolfBoot_get_image_version\n" \
569+ "mov r7, r0\n" \
570+ "mov r7, r0\n" \
571+ "mov r7, r0\n" \
572+ "cmp r5, r7\n" \
573+ "bne ver_panic\n" \
574+ "cmp r5, r7\n" \
575+ "bne ver_panic\n" \
576+ "cmp r5, r7\n" \
577+ "bne ver_panic\n" \
578+ "cmp r5, r7\n" \
579+ "bne ver_panic\n" \
580+ "mov r0, #0\n" \
581+ "mov r0, #0\n" \
582+ "mov r0, #0\n" \
583+ "bl wolfBoot_get_image_version\n" \
584+ "mov r4, r0\n" \
585+ "mov r4, r0\n" \
586+ "mov r4, r0\n" \
587+ "mov r0, #0\n" \
588+ "mov r0, #0\n" \
589+ "mov r0, #0\n" \
590+ "bl wolfBoot_get_image_version\n" \
591+ "mov r6, r0\n" \
592+ "mov r6, r0\n" \
593+ "mov r6, r0\n" \
594+ "cmp r4, r6\n" \
595+ "bne ver_panic\n" \
596+ "cmp r4, r6\n" \
597+ "bne ver_panic\n" \
598+ "cmp r4, r6\n" \
599+ "bne ver_panic\n" \
600+ "cmp r4, r6\n" \
601+ "bne ver_panic\n" \
602+ "mov r0, #0\n" \
603+ "mov r0, #0\n" \
604+ "mov r0, #0\n" \
605+ "cmp r4, r5\n" \
606+ "bhs ver_panic\n" \
607+ "cmp r6, r7\n" \
608+ "bhs ver_panic\n" \
609+ "cmp r4, r5\n" \
610+ "bhs ver_panic\n" \
611+ "cmp r6, r7\n" \
612+ "bhs ver_panic\n" \
613+ "b end_check\n" \
614+ "ver_panic:\n" \
615+ "b .\n" \
616+ "end_check:\n" \
617+ "pop {r4, r5, r6, r7}\n" \
618+ : \
619+ : "r"(fb_ok) \
620+ : "r0", "r4", "r5", "r6", "r7", "lr", "cc", "memory" \
621+ )
597622
598623#elif defined(__ICCARM__ ) && defined(__IAR_SYSTEMS_ICC__ )
599624
@@ -612,10 +637,25 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
612637 "mov r6, #2\n" \
613638 "mov r7, #0\n" \
614639 "mov r0, %0\n" \
640+ "mov r4, %0\n" \
641+ "cmp r0, #0\n" \
642+ "beq 4f\n" \
615643 "cmp r0, #1\n" \
616- "bne 1f\n" \
644+ "beq 4f\n" \
645+ "bkpt 0xE1\n" \
646+ "4:\n" \
647+ "cmp r4, #0\n" \
648+ "beq 5f\n" \
649+ "cmp r4, #1\n" \
650+ "beq 5f\n" \
651+ "bkpt 0xE1\n" \
652+ "5:\n" \
617653 "cmp r0, #1\n" \
618654 "bne 1f\n" \
655+ "cmp r4, #1\n" \
656+ "bne 1f\n" \
657+ "cmp r0, r4\n" \
658+ "bne 1f\n" \
619659 "cmp r0, #1\n" \
620660 "bne 1f\n" \
621661 "b 2f\n" \
@@ -635,13 +675,13 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
635675 "mov r7, r0\n" \
636676 "mov r7, r0\n" \
637677 "cmp r5, r7\n" \
638- "bne . \n" \
678+ "bne 3f \n" \
639679 "cmp r5, r7\n" \
640- "bne .-4 \n" \
680+ "bne 3f \n" \
641681 "cmp r5, r7\n" \
642- "bne .-8 \n" \
682+ "bne 3f \n" \
643683 "cmp r5, r7\n" \
644- "bne .-12 \n" \
684+ "bne 3f \n" \
645685 "mov r0, #0\n" \
646686 "mov r0, #0\n" \
647687 "mov r0, #0\n" \
@@ -657,24 +697,27 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
657697 "mov r6, r0\n" \
658698 "mov r6, r0\n" \
659699 "cmp r4, r6\n" \
660- "bne . \n" \
700+ "bne 3f \n" \
661701 "cmp r4, r6\n" \
662- "bne .-4 \n" \
702+ "bne 3f \n" \
663703 "cmp r4, r6\n" \
664- "bne .-8 \n" \
704+ "bne 3f \n" \
665705 "cmp r4, r6\n" \
666- "bne .-12 \n" \
706+ "bne 3f \n" \
667707 "mov r0, #0\n" \
668708 "mov r0, #0\n" \
669709 "mov r0, #0\n" \
670710 "cmp r4, r5\n" \
671- "bge . \n" \
711+ "bhs 3f \n" \
672712 "cmp r6, r7\n" \
673- "bge .-4 \n" \
713+ "bhs 3f \n" \
674714 "cmp r4, r5\n" \
675- "bge .-8 \n" \
715+ "bhs 3f \n" \
676716 "cmp r6, r7\n" \
677- "bge .-12\n" \
717+ "bhs 3f\n" \
718+ "b 2f\n" \
719+ "3:\n" \
720+ "b .\n" \
678721 "2:\n" \
679722 "pop {r4, r5, r6, r7}\n" \
680723 : /* No output operands */ \
0 commit comments