stack overlap for irq handling in library mode
Closed, ResolvedPublic

Description

Message from @matt2048:

I have a question about the code logic of irq handling in library mode, code blocks in spm_api_func.c are as follows:

void tfm_spm_partition_push_interrupted_ctx(uint32_t partition_idx)
{

struct spm_partition_runtime_data_t *runtime_data =
    &g_spm_partition_db.partitions[partition_idx].runtime_data;
struct interrupted_ctx_stack_frame_t *stack_frame =
    (struct interrupted_ctx_stack_frame_t *)runtime_data->ctx_stack_ptr;
 
stack_frame->partition_state = runtime_data->partition_state;

}

void tfm_spm_partition_push_handler_ctx(uint32_t partition_idx)
{

struct spm_partition_runtime_data_t *runtime_data =
    &g_spm_partition_db.partitions[partition_idx].runtime_data;
struct handler_ctx_stack_frame_t *stack_frame =
    (struct handler_ctx_stack_frame_t *)
        runtime_data->ctx_stack_ptr;
 
stack_frame->partition_state = runtime_data->partition_state;
stack_frame->caller_partition_idx = runtime_data->caller_partition_idx;
 
runtime_data->ctx_stack_ptr +=
    sizeof(struct handler_ctx_stack_frame_t) / sizeof(uint32_t);

}

My question is why there is not the following such code logic at the end of function tfm_spm_partition_push_interrupted_ctx.
runtime_data->ctx_stack_ptr +=

sizeof(struct interrupted_ctx_stack_frame_t ) / sizeof(uint32_t);

If the interrupted partition is the same as the handler partition, interrupted_ctx_stack_frame_t and handler_ctx_stack_frame_t should be pushed at different location.

And when pop the stack frame after handling irq, there is the following code logic in tfm_spm_partition_pop_handler_ctx

runtime_data->ctx_stack_ptr -=
    sizeof(struct handler_ctx_stack_frame_t) / sizeof(uint32_t);

I think the same logic of changing ctx_stack_ptr should be added the begining of the function tfm_spm_partition_pop_interrupted_ctx like the above code logic in tfm_spm_partition_pop_handler_ctx.

runtime_data->ctx_stack_ptr -=
    sizeof(struct interrupted_ctx_stack_frame_t ) / sizeof(uint32_t);