RISC-V: fix PC not saved when using backtrace

This commit is contained in:
Omar Chebib 2022-11-16 12:28:40 +08:00
parent d580f6b076
commit 6fe563163c
2 changed files with 6 additions and 12 deletions

View File

@ -622,14 +622,12 @@ FORCE_INLINE_ATTR UBaseType_t uxInitialiseStackTLS(UBaseType_t uxStackPointer, u
* Wrapper to allow task functions to return. Force the optimization option -O1 on that function to make sure there * Wrapper to allow task functions to return. Force the optimization option -O1 on that function to make sure there
* is no tail-call. Indeed, we need the compiler to keep the return address to this function when calling `panic_abort`. * is no tail-call. Indeed, we need the compiler to keep the return address to this function when calling `panic_abort`.
* *
* Thanks to the `naked` attribute, GDB stub backtrace doesn't print: * Thanks to `naked` attribute, the compiler won't generate a prologue and epilogue for the function, which saves time
* #2 0x00000000 in ?? () * and stack space.
*
* However, this also means that when calculating vPortTaskWrapper's call frame in a backtrace, return address
* register `ra`, will NOT contain 0x00000000.
*/ */
static void __attribute__((optimize("O1"), naked)) vPortTaskWrapper(TaskFunction_t pxCode, void *pvParameters) static void __attribute__((optimize("O1"), naked)) vPortTaskWrapper(TaskFunction_t pxCode, void *pvParameters)
{ {
asm volatile(".cfi_undefined ra\n");
extern void __attribute__((noreturn)) panic_abort(const char *details); extern void __attribute__((noreturn)) panic_abort(const char *details);
static char DRAM_ATTR msg[80] = "FreeRTOS: FreeRTOS Task \"\0"; static char DRAM_ATTR msg[80] = "FreeRTOS: FreeRTOS Task \"\0";
pxCode(pvParameters); pxCode(pvParameters);
@ -639,7 +637,6 @@ static void __attribute__((optimize("O1"), naked)) vPortTaskWrapper(TaskFunction
strcat(msg, pcTaskName); strcat(msg, pcTaskName);
strcat(msg, "\" should not return, Aborting now!"); strcat(msg, "\" should not return, Aborting now!");
panic_abort(msg); panic_abort(msg);
} }
#endif // CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER #endif // CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER

View File

@ -200,14 +200,12 @@ FORCE_INLINE_ATTR UBaseType_t uxInitialiseStackTLS(UBaseType_t uxStackPointer, u
* Wrapper to allow task functions to return. Force the optimization option -O1 on that function to make sure there * Wrapper to allow task functions to return. Force the optimization option -O1 on that function to make sure there
* is no tail-call. Indeed, we need the compiler to keep the return address to this function when calling `panic_abort`. * is no tail-call. Indeed, we need the compiler to keep the return address to this function when calling `panic_abort`.
* *
* Thanks to the `naked` attribute, GDB stub backtrace doesn't print: * Thanks to `naked` attribute, the compiler won't generate a prologue and epilogue for the function, which saves time
* #2 0x00000000 in ?? () * and stack space.
*
* However, this also means that when calculating vPortTaskWrapper's call frame in a backtrace, return address
* register `ra`, will NOT contain 0x00000000.
*/ */
static void __attribute__((optimize("O1"), naked)) vPortTaskWrapper(TaskFunction_t pxCode, void *pvParameters) static void __attribute__((optimize("O1"), naked)) vPortTaskWrapper(TaskFunction_t pxCode, void *pvParameters)
{ {
asm volatile(".cfi_undefined ra\n");
extern void __attribute__((noreturn)) panic_abort(const char *details); extern void __attribute__((noreturn)) panic_abort(const char *details);
static char DRAM_ATTR msg[80] = "FreeRTOS: FreeRTOS Task \"\0"; static char DRAM_ATTR msg[80] = "FreeRTOS: FreeRTOS Task \"\0";
pxCode(pvParameters); pxCode(pvParameters);
@ -217,7 +215,6 @@ static void __attribute__((optimize("O1"), naked)) vPortTaskWrapper(TaskFunction
strcat(msg, pcTaskName); strcat(msg, pcTaskName);
strcat(msg, "\" should not return, Aborting now!"); strcat(msg, "\" should not return, Aborting now!");
panic_abort(msg); panic_abort(msg);
} }
#endif // CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER #endif // CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER