boot: fix potential bl jump to app failed issue

After changing sp, following functions calling will result
in unpredictable behavior in case of jumping

Signed-off-by: wanggang26 <wanggang26@xiaomi.com>
This commit is contained in:
wanggang26 2024-08-05 19:41:15 +08:00 committed by Alan Carvalho de Assis
parent ab92b7d04d
commit 289fc24b32
5 changed files with 30 additions and 20 deletions

View File

@ -172,10 +172,12 @@ int board_boot_image(const char *path, uint32_t hdr_size)
/* Set main and process stack pointers */
__asm__ __volatile__("\tmsr msp, %0\n" : : "r" (vt.spr));
setcontrol(0x00);
ARM_ISB();
((void (*)(void))vt.reset)();
__asm__ __volatile__("\tmsr msp, %0\n"
"\tmsr control, %1\n"
"\tisb\n"
"\tmov pc, %2\n"
:
: "r" (vt.spr), "r" (0), "r" (vt.reset));
return 0;
}

View File

@ -161,10 +161,12 @@ int board_boot_image(const char *path, uint32_t hdr_size)
/* Set main and process stack pointers */
__asm__ __volatile__("\tmsr msp, %0\n" : : "r" (vt.spr));
setcontrol(0x00);
ARM_ISB();
((void (*)(void))vt.reset)();
__asm__ __volatile__("\tmsr msp, %0\n"
"\tmsr control, %1\n"
"\tisb\n"
"\tmov pc, %2\n"
:
: "r" (vt.spr), "r" (0), "r" (vt.reset));
return 0;
}

View File

@ -161,10 +161,12 @@ int board_boot_image(const char *path, uint32_t hdr_size)
/* Set main and process stack pointers */
__asm__ __volatile__("\tmsr msp, %0\n" : : "r" (vt.spr));
setcontrol(0x00);
ARM_ISB();
((void (*)(void))vt.reset)();
__asm__ __volatile__("\tmsr msp, %0\n"
"\tmsr control, %1\n"
"\tisb\n"
"\tmov pc, %2\n"
:
: "r" (vt.spr), "r" (0), "r" (vt.reset));
return 0;
}

View File

@ -183,10 +183,12 @@ int board_boot_image(const char *path, uint32_t hdr_size)
/* Set main and process stack pointers */
__asm__ __volatile__("\tmsr msp, %0\n" : : "r" (vt.spr));
setcontrol(0x00);
ARM_ISB();
((void (*)(void))vt.reset)();
__asm__ __volatile__("\tmsr msp, %0\n"
"\tmsr control, %1\n"
"\tisb\n"
"\tmov pc, %2\n"
:
: "r" (vt.spr), "r" (0), "r" (vt.reset));
#else
/* Non-secure entry point */

View File

@ -178,10 +178,12 @@ int board_boot_image(const char *path, uint32_t hdr_size)
/* Set main and process stack pointers */
__asm__ __volatile__("\tmsr msp, %0\n" : : "r" (vt.spr));
setcontrol(0x00);
ARM_ISB();
((void (*)(void))vt.reset)();
__asm__ __volatile__("\tmsr msp, %0\n"
"\tmsr control, %1\n"
"\tisb\n"
"\tmov pc, %2\n"
:
: "r" (vt.spr), "r" (0), "r" (vt.reset));
return 0;
}