X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fstm%2Fao_boot_chain.c;h=6a3864a71356ac69c80059f15cf85a6d8b6ba4dd;hb=4e1b134e29313a1bdac18de57fe547299e5ded2a;hp=9c63272b34b2261cd77cce868b93b31b0b6ce905;hpb=b1a43ce313c85cb7f8f16f7f0647d9d4320ba692;p=fw%2Faltos diff --git a/src/stm/ao_boot_chain.c b/src/stm/ao_boot_chain.c index 9c63272b..6a3864a7 100644 --- a/src/stm/ao_boot_chain.c +++ b/src/stm/ao_boot_chain.c @@ -26,9 +26,11 @@ ao_boot_chain(uint32_t *base) sp = base[0]; pc = base[1]; - asm ("mov sp, %0" : : "r" (sp)); - asm ("mov lr, %0" : : "r" (pc)); - asm ("bx lr"); + if (0x08000100 <= pc && pc <= 0x08200000 && (pc & 1) == 1) { + asm ("mov sp, %0" : : "r" (sp)); + asm ("mov lr, %0" : : "r" (pc)); + asm ("bx lr"); + } } #define AO_BOOT_SIGNAL 0x5a5aa5a5 @@ -42,14 +44,17 @@ struct ao_boot { static struct ao_boot __attribute__ ((section(".boot"))) ao_boot; -void +int ao_boot_check_chain(void) { if (ao_boot.signal == AO_BOOT_SIGNAL && ao_boot.check == AO_BOOT_CHECK) { ao_boot.signal = 0; ao_boot.check = 0; + if (ao_boot.base == 0) + return 0; ao_boot_chain(ao_boot.base); } + return 1; } void