Skip to content

Commit

Permalink
Support freertos stacking on cortex m33 with and without fpu contexts
Browse files Browse the repository at this point in the history
  • Loading branch information
scott-brust committed May 22, 2024
1 parent d99693e commit fdbfcca
Showing 1 changed file with 73 additions and 28 deletions.
101 changes: 73 additions & 28 deletions src/rtos/rtos_standard_stackings.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,23 +75,43 @@ static const struct stack_register_offset rtos_standard_cortex_m4f_fpu_stack_off
};

static const struct stack_register_offset rtos_standard_cortex_m33_stack_offsets[] = {
{ ARMV7M_R0, 0x24, 32 }, /* r0 */
{ ARMV7M_R1, 0x28, 32 }, /* r1 */
{ ARMV7M_R2, 0x2c, 32 }, /* r2 */
{ ARMV7M_R3, 0x30, 32 }, /* r3 */
{ ARMV7M_R4, 0x04, 32 }, /* r4 */
{ ARMV7M_R5, 0x08, 32 }, /* r5 */
{ ARMV7M_R6, 0x0c, 32 }, /* r6 */
{ ARMV7M_R7, 0x10, 32 }, /* r7 */
{ ARMV7M_R8, 0x14, 32 }, /* r8 */
{ ARMV7M_R9, 0x18, 32 }, /* r9 */
{ ARMV7M_R10, 0x1c, 32 }, /* r10 */
{ ARMV7M_R11, 0x20, 32 }, /* r11 */
{ ARMV7M_R12, 0x34, 32 }, /* r12 */
{ ARMV7M_R0, 0x28, 32 }, /* r0 */
{ ARMV7M_R1, 0x2c, 32 }, /* r1 */
{ ARMV7M_R2, 0x30, 32 }, /* r2 */
{ ARMV7M_R3, 0x34, 32 }, /* r3 */
{ ARMV7M_R4, 0x08, 32 }, /* r4 */
{ ARMV7M_R5, 0x0C, 32 }, /* r5 */
{ ARMV7M_R6, 0x10, 32 }, /* r6 */
{ ARMV7M_R7, 0x14, 32 }, /* r7 */
{ ARMV7M_R8, 0x18, 32 }, /* r8 */
{ ARMV7M_R9, 0x1C, 32 }, /* r9 */
{ ARMV7M_R10, 0x20, 32 }, /* r10 */
{ ARMV7M_R11, 0x24, 32 }, /* r11 */
{ ARMV7M_R12, 0x38, 32 }, /* r12 */
{ ARMV7M_R13, -2, 32 }, /* sp */
{ ARMV7M_R14, 0x38, 32 }, /* lr */
{ ARMV7M_PC, 0x3c, 32 }, /* pc */
{ ARMV7M_XPSR, 0x40, 32 }, /* xPSR */
{ ARMV7M_R14, 0x3c, 32 }, /* lr */
{ ARMV7M_PC, 0x40, 32 }, /* pc */
{ ARMV7M_XPSR, 0x44, 32 }, /* xPSR */
};

static const struct stack_register_offset rtos_standard_cortex_m33_fpu_stack_offsets[] = {
{ ARMV7M_R0, 0x68, 32 }, /* r0 */
{ ARMV7M_R1, 0x6c, 32 }, /* r1 */
{ ARMV7M_R2, 0x70, 32 }, /* r2 */
{ ARMV7M_R3, 0x74, 32 }, /* r3 */
{ ARMV7M_R4, 0x08, 32 }, /* r4 */
{ ARMV7M_R5, 0x0C, 32 }, /* r5 */
{ ARMV7M_R6, 0x10, 32 }, /* r6 */
{ ARMV7M_R7, 0x14, 32 }, /* r7 */
{ ARMV7M_R8, 0x18, 32 }, /* r8 */
{ ARMV7M_R9, 0x1C, 32 }, /* r9 */
{ ARMV7M_R10, 0x20, 32 }, /* r10 */
{ ARMV7M_R11, 0x24, 32 }, /* r11 */
{ ARMV7M_R12, 0x78, 32 }, /* r12 */
{ ARMV7M_R13, -2, 32 }, /* sp */
{ ARMV7M_R14, 0x7c, 32 }, /* lr */
{ ARMV7M_PC, 0x80, 32 }, /* pc */
{ ARMV7M_XPSR, 0x84, 32 }, /* xPSR */
};

static const struct stack_register_offset rtos_standard_cortex_r4_stack_offsets[] = {
Expand Down Expand Up @@ -222,7 +242,16 @@ static target_addr_t rtos_standard_cortex_m33_stack_align(struct target *target,
const uint8_t *stack_data, const struct rtos_register_stacking *stacking,
target_addr_t stack_ptr)
{
const int XPSR_OFFSET = 0x40;
const int XPSR_OFFSET = 0x44;
return rtos_cortex_m_stack_align(target, stack_data, stacking,
stack_ptr, XPSR_OFFSET);
}

static target_addr_t rtos_standard_cortex_m33_fpu_stack_align(struct target *target,
const uint8_t *stack_data, const struct rtos_register_stacking *stacking,
target_addr_t stack_ptr)
{
const int XPSR_OFFSET = 0x84;
return rtos_cortex_m_stack_align(target, stack_data, stacking,
stack_ptr, XPSR_OFFSET);
}
Expand Down Expand Up @@ -252,13 +281,21 @@ const struct rtos_register_stacking rtos_standard_cortex_m4f_fpu_stacking = {
};

static const struct rtos_register_stacking rtos_standard_cortex_m33_stacking = {
.stack_registers_size = 0x44,
.stack_registers_size = 0x48,
.stack_growth_direction = -1,
.num_output_registers = ARMV7M_NUM_CORE_REGS,
.calculate_process_stack = rtos_standard_cortex_m33_stack_align,
.register_offsets = rtos_standard_cortex_m33_stack_offsets
};

static const struct rtos_register_stacking rtos_standard_cortex_m33_fpu_stacking = {
.stack_registers_size = 0xD0,
.stack_growth_direction = -1,
.num_output_registers = ARMV7M_NUM_CORE_REGS,
.calculate_process_stack = rtos_standard_cortex_m33_fpu_stack_align,
.register_offsets = rtos_standard_cortex_m33_fpu_stack_offsets
};

const struct rtos_register_stacking rtos_standard_cortex_r4_stacking = {
.stack_registers_size = 0x48,
.stack_growth_direction = -1,
Expand All @@ -275,12 +312,6 @@ const struct rtos_register_stacking *
if (!armv7m_target)
return NULL;

/* Detect an ARM v8M and return specific stacking */
if (armv7m_target->arm.arch == ARM_ARCH_V8M)
/* Future development may require floating point
* and/or secure context... by now standard stacking */
return &rtos_standard_cortex_m33_stacking;

/* Detect the presence of FPU */
bool fpu_enabled = false;
if (armv7m_target->fp_feature == FPV4_SP ||
Expand All @@ -298,18 +329,32 @@ const struct rtos_register_stacking *
fpu_enabled = true;
}
if (fpu_enabled) {
/* Detect an ARM v8M and return specific stacking */
bool armv8m = (armv7m_target->arm.arch == ARM_ARCH_V8M);

/* Read the LR that contains EXC_RETURN */
uint32_t exc_return = 0;
int retval = target_read_u32(rtos->target, stack_ptr + 0x20, &exc_return);
uint32_t stacked_lr_offset = armv8m ? 0x04 : 0x20;
int retval = target_read_u32(rtos->target, stack_ptr + stacked_lr_offset, &exc_return);
if (retval != ERROR_OK) {
LOG_OUTPUT("Error reading stack frame from rtos thread\n");
return NULL;
}
/* Check if the stack frame contains FPU registers */
if ((exc_return & 0x10) == 0)
return &rtos_standard_cortex_m4f_fpu_stacking;
else
bool fpuStacked = (exc_return & 0x10) == 0;

if (armv8m) {
if (fpuStacked) {
return &rtos_standard_cortex_m33_fpu_stacking;
}
return &rtos_standard_cortex_m33_stacking;
}
else {
if (fpuStacked) {
return &rtos_standard_cortex_m4f_fpu_stacking;
}
return &rtos_standard_cortex_m4f_stacking;
}
} else {
return &rtos_standard_cortex_m3_stacking;
}
Expand Down

0 comments on commit fdbfcca

Please sign in to comment.